当前位置: 首页 > news >正文

濮阳做网站的做公众号的软件

濮阳做网站的,做公众号的软件,北京做网站的好公司有哪些,郑州作网站1. 背景#xff1a; 项目中使用到了纹理进行插值的加速#xff0c;因此记录一些自己在学习tex2D的一些过程 2. 代码#xff1a; #include cuda_runtime.h #include device_launch_parameters.h #include assert.h #include stdio.h 项目中使用到了纹理进行插值的加速因此记录一些自己在学习tex2D的一些过程 2. 代码 #include cuda_runtime.h #include device_launch_parameters.h #include assert.h #include stdio.h #include iostream #include cuda_fp16.h #include vectorvoid Data2Half(half* pDst, const int16_t* pSrc, const int Ndots); static __global__ void Tex2DTest(cudaTextureObject_t p_rf_data, float* pfRes1, float* pfRes2);static __global__ void data2half(half* pDst, const int16_t* pSrc, const int Ndots) {const int tid blockIdx.x * blockDim.x threadIdx.x;if (tid Ndots)return;pDst[tid] __short2half_rn(pSrc[tid]); }cudaTextureObject_t m_tex 0; cudaArray* m_pRFData nullptr; int16_t* m_i16RFDataBuffer nullptr; // 设备端的RF数据 half* m_pHalfRFDataCache nullptr; // 转换为半浮点型的RF数据缓存用于将SHORT类型转换为FLOAT类型int main() {const int nRx 2;const int Nsample 2;const int IQ 1;cudaError_t error;cudaChannelFormatDesc channelDesc cudaCreateChannelDescHalf();error cudaMallocArray(m_pRFData, channelDesc, nRx * IQ, Nsample, cudaArrayTextureGather);assert(m_pRFData);cudaResourceDesc texRes;memset(texRes, 0, sizeof(cudaResourceDesc));texRes.resType cudaResourceTypeArray;texRes.res.array.array m_pRFData;cudaTextureDesc texDescr;memset(texDescr, 0, sizeof(cudaTextureDesc));texDescr.normalizedCoords false;texDescr.filterMode cudaFilterModeLinear; // 这里很重要texDescr.addressMode[0] cudaAddressModeBorder;texDescr.addressMode[1] cudaAddressModeBorder;error cudaCreateTextureObject(m_tex, texRes, texDescr, NULL);//int16_t pi16Src[nRx * Nsample * IQ] {1, 11, 2, 22,// 3, 33, 4, 44, // 5, 55, 6, 66, // 7, 77, 8, 88};//int16_t pi16Src[nRx * Nsample * IQ] { 1, 11, 2, 22,// 3, 33, 4, 44};int16_t pi16Src[nRx * Nsample * IQ] { 1,2,3,4 };error cudaMalloc(m_i16RFDataBuffer, sizeof(int16_t) * nRx * IQ * Nsample);error cudaMemcpy(m_i16RFDataBuffer, pi16Src, sizeof(int16_t) * nRx * IQ * Nsample, cudaMemcpyHostToDevice);error cudaMalloc(m_pHalfRFDataCache, sizeof(half) * nRx * IQ * Nsample);Data2Half(m_pHalfRFDataCache, m_i16RFDataBuffer, nRx * IQ * Nsample);error cudaMemcpy2DToArray(m_pRFData, 0, 0, m_pHalfRFDataCache, sizeof(half) * nRx * IQ, sizeof(half) * nRx * IQ, Nsample, cudaMemcpyDeviceToDevice);float* pf_res1 nullptr;float* pf_res2 nullptr;error cudaMalloc(pf_res1, nRx * Nsample * sizeof(float)); cudaMemset(pf_res1, 0, nRx * Nsample * sizeof(float));error cudaMalloc(pf_res2, nRx * Nsample * sizeof(float)); cudaMemset(pf_res2, 0, nRx * Nsample * sizeof(float));error cudaGetLastError();dim3 block_dim dim3(1, 1);dim3 grid_dim dim3(1, 1);Tex2DTest grid_dim, block_dim (m_tex, pf_res1, pf_res2);cudaDeviceSynchronize();std::vectorfloat vf_res_1(nRx * Nsample, 0);std::vectorfloat vf_res_2(nRx * Nsample, 0);cudaMemcpy(vf_res_1.data(), pf_res1, sizeof(float) * vf_res_1.size(), cudaMemcpyDeviceToHost);cudaMemcpy(vf_res_2.data(), pf_res2, sizeof(float) * vf_res_2.size(), cudaMemcpyDeviceToHost);return 0; }void Data2Half(half* pDst, const int16_t* pSrc, const int Ndots) {dim3 block dim3(512, 1);dim3 grid dim3((Ndots - 1) / block.x 1, 1);data2half grid, block (pDst, pSrc, Ndots); }static __global__ void Tex2DTest(cudaTextureObject_t p_rf_data, float *pfRes1, float *pfRes2) {for (size_t y 0; y 2; y){for (size_t x 0; x 2; x) {float value tex2Dfloat(p_rf_data, x, y);//pfRes1[y * 4 y] printf(x: %f\n, value);}} }3. 输出分析 可以看到执行结果是 为什么呢 原因是因为tex2D插值导致的上面测试数据是 1  2 3   4 那在进行插值的时候会变成 0  0   0   0 0   1   2  0 0   3   4  0 每个点的输出都是当前前和左上角3个点进行平均计算出来的 比如第一个输出计算为1 0 0 0/4 0.25 最后一个输出的计算为1 2 3 4 / 4 2.5 4. 问题 上面只是单独数据实数点的计算如果我的数据集合是复数怎么办 比如一组2 * 2大小的数据对 1 2 3 4; 5,   6 7 8 数据实际表示含义是 1 j * 2,   3 j * 4; 5 j * 6,   7 j * 8 这种情况下怎么做到正确插值呢比如第一个实数点的输出结果应该是 1 0 0 0/ 4 最后一个实数点的输出应该是 1 3 5 7 / 4 同理最后一个虚数点的输出应该是            2 4 6 8/ 4 5. 解决 #include cuda_runtime.h #include device_launch_parameters.h #include assert.h #include stdio.h #include iostream #include cuda_fp16.h #include vectorvoid Data2Half(half* pDst, const int16_t* pSrc, const int Ndots); static __global__ void Tex2DTest(cudaTextureObject_t p_rf_data, float* pfRes1, float* pfRes2);static __global__ void data2half(half* pDst, const int16_t* pSrc, const int Ndots) {const int tid blockIdx.x * blockDim.x threadIdx.x;if (tid Ndots)return;pDst[tid] __short2half_rn(pSrc[tid]); }cudaTextureObject_t m_tex 0; cudaArray* m_pRFData nullptr; int16_t* m_i16RFDataBuffer nullptr; // 设备端的RF数据 half* m_pHalfRFDataCache nullptr; // 转换为半浮点型的RF数据缓存用于将SHORT类型转换为FLOAT类型using namespace std;int main() {const int nRx 2;const int Nsample 2;const int IQ 2;cudaError_t error;cudaChannelFormatDesc channelDesc cudaCreateChannelDescHalf2();error cudaMallocArray(m_pRFData, channelDesc, nRx, Nsample, cudaArrayTextureGather);assert(m_pRFData);cudaResourceDesc texRes;memset(texRes, 0, sizeof(cudaResourceDesc));texRes.resType cudaResourceTypeArray;texRes.res.array.array m_pRFData;cudaTextureDesc texDescr;memset(texDescr, 0, sizeof(cudaTextureDesc));texDescr.normalizedCoords false;texDescr.filterMode cudaFilterModeLinear; // 这里很重要texDescr.addressMode[0] cudaAddressModeBorder;texDescr.addressMode[1] cudaAddressModeBorder;error cudaCreateTextureObject(m_tex, texRes, texDescr, NULL);//int16_t pi16Src[nRx * Nsample * IQ] {1, 11, 2, 22,// 3, 33, 4, 44, // 5, 55, 6, 66, // 7, 77, 8, 88};//int16_t pi16Src[nRx * Nsample * IQ] { 1, 11, 2, 22,// 3, 33, 4, 44};int16_t pi16Src[nRx * Nsample * IQ] { 1, 2, 3, 4,5, 6, 7, 8 };error cudaMalloc(m_i16RFDataBuffer, sizeof(int16_t) * nRx * IQ * Nsample);error cudaMemcpy(m_i16RFDataBuffer, pi16Src, sizeof(int16_t) * nRx * IQ * Nsample, cudaMemcpyHostToDevice);error cudaMalloc(m_pHalfRFDataCache, sizeof(half) * nRx * IQ * Nsample);Data2Half(m_pHalfRFDataCache, m_i16RFDataBuffer, nRx * IQ * Nsample);error cudaMemcpy2DToArray(m_pRFData, 0, 0, m_pHalfRFDataCache, sizeof(half2) * nRx, sizeof(half2) * nRx, Nsample, cudaMemcpyDeviceToDevice);float* pf_res1 nullptr;float* pf_res2 nullptr;error cudaMalloc(pf_res1, nRx * Nsample * sizeof(float)); cudaMemset(pf_res1, 0, nRx * Nsample * sizeof(float));error cudaMalloc(pf_res2, nRx * Nsample * sizeof(float)); cudaMemset(pf_res2, 0, nRx * Nsample * sizeof(float));error cudaGetLastError();dim3 block_dim dim3(1, 1);dim3 grid_dim dim3(1, 1);Tex2DTest grid_dim, block_dim (m_tex, pf_res1, pf_res2);cudaDeviceSynchronize();std::vectorfloat vf_res_1(nRx * Nsample, 0);std::vectorfloat vf_res_2(nRx * Nsample, 0);cudaMemcpy(vf_res_1.data(), pf_res1, sizeof(float) * vf_res_1.size(), cudaMemcpyDeviceToHost);cudaMemcpy(vf_res_2.data(), pf_res2, sizeof(float) * vf_res_2.size(), cudaMemcpyDeviceToHost);return 0; }void Data2Half(half* pDst, const int16_t* pSrc, const int Ndots) {dim3 block dim3(512, 1);dim3 grid dim3((Ndots - 1) / block.x 1, 1);data2half grid, block (pDst, pSrc, Ndots); }static __global__ void Tex2DTest(cudaTextureObject_t p_rf_data, float* pfRes1, float* pfRes2) {for (size_t y 0; y 2; y){for (size_t x 0; x 2; x){float2 value tex2Dfloat2(p_rf_data, x, y);//pfRes1[y * 4 y] printf(x: %f, y: %f, value.x, value.y);// printf(x: %f, y: %f\n, value.x, value.y);}printf(\n);} }其实关键是在tex2D的构造 然后按照half2的方式进行排布就好了
http://www.w-s-a.com/news/388417/

相关文章:

  • 网站建设属于技术开发吗网页制作团队
  • 做家常菜的网站哪个好哪个网站做图片外链
  • 眼科医院网站设计怎么做6深圳宝安是什么风险等级
  • 网站制作容易吗logo免费生成网站
  • 建设厅官方网站下载专区网络托管公司
  • 祥云平台官方网站网线制作实验原理
  • 把网站做成app的软件下载国外做兼职的网站有哪些
  • 网站建设 海豚弯专业的网站开发服务商
  • 那个网站有免费模板中国家装公司十大排名
  • 中铁建设集团有限公司门户网站余杭区建设规划局网站
  • 天猫网站建设的目标是什么做网站常见问题模板
  • 做php网站需要什么软件天津建设网官方网站
  • 南漳网站开发上海网站推广方法
  • 深圳seo网站大连旅顺房价
  • dede网站 地图什么做有没有做黑市网站
  • 做网站参考文献域名如何做网站
  • 怎么选择网站开发英文网站建设用途
  • 怎样做电子商务网站织梦生成手机网站
  • 公司网站建设选什么服务器网站里怎样添加关键词
  • 深圳建设局网站深业中城绿化项目营销型网站开发流程包括
  • 找销售的网站九江市建设项目服务中心
  • 东原ARC网站建设公司合肥seo网站推广外包
  • 那个网站是做房产中介的网站制作软件小学
  • 做网页怎么建站点视频解析网站
  • 做网站的系统设计网站设计论文前言
  • 做外贸网站多久更新汕头市建设局网站首页
  • 如何建设专业化的网站手机管理网站模板
  • 花生壳做网站如何用腾讯云做网站
  • 搭建集团网站开发app需要哪些软件
  • 网站建设 中企动力福州阀门wordpress 多说评论