(cudaBindTexture2D)如何从中间绑定一个倾斜的数组

Posted

技术标签:

【中文标题】(cudaBindTexture2D)如何从中间绑定一个倾斜的数组【英文标题】:(cudaBindTexture2D) How to bind a pitched-array from the middle 【发布时间】:2022-01-09 00:06:35 【问题描述】:

我正在尝试从中间部分绑定一个倾斜的数组(而不是从数组的开头),如下所示。

/1.分配/

 cudaMallocPitch((void**)&d_texinput, &FloatPitch, cols*sizeof(float), rows);
 cudaMallocPitch((void**)&d_output, &FloatPitch, cols*sizeof(float), rows);

/2.设置目标区域的行长(即分行10次)/

 int row_div_times = 10;
 int part_rows = rows / row_div_times;
 int part_offset = part_rows*FloatPitch/sizeof(float);
 dim3 threads(16,16);
 dim3 Part_Blocks((cols + threads.x - 1) / threads.x, (Part_rows + threads.y - 1) / threads.y);

/3.迭代处理分割的行/

 for (int i = 0; i < row_div_times; i++)
 
      size_t offsetsize= i*part_offset;            

      /*computing values of "d_tex_input"*/
      calibration << <Part_Blocks, threads, 0, stream[i] >> >
         (d_texinput + i*part_offset );         

      /*
      //###(QUESTION point!) I want to bind the device memory "d_texinput" to texture "tex_mem" only partly like below.
      cudaBindTexture2D(0, tex_mem, &d_texinput[i*part_offset], channelDesc_flt, cols, Part_rows, FloatPitch); //tentative code a;
      ,,, or something like,,,
      cudaBindTexture2D(&offsetsize, tex_mem, &d_texinput, channelDesc_flt, cols, Part_rows, FloatPitch); //tentative code b;
      */
       


       //final computaion with texture
         final_computationwithtexture << <Part_Blocks, threads, 0, stream[i] >> >
         ( d_output + i*part_offset ); 

       cudaUnbindTexture(tex_mem);

 

请允许我请教您,建议如何通过修改以上部分来绑定设备内存阵列的目标区域(问题点!)?

我试图将 cudaBindTExture2D 的第一个参数理解为“偏移量”。但这不是价值。它是地址。根据文档。 我仍然无法理解文档。 我希望我能通过了解 cudaBindTexture2D 的适当输入方式来理解那是什么。

【问题讨论】:

【参考方案1】:

offset 参数不是输入,而是输出。这就是为什么它是一个指针。该函数将以字节为单位设置偏移量。如果您想在分配过程中进行绑定,请适当设置 devPtr 参数(第三个),然后该函数将为您提供纹理访问所需的偏移量。

这是如何理解的:纹理只能以一定的对齐方式绑定。内存分配总是正确对齐的。因此,在大多数情况下,这不是问题。但是,如果您提供任意内存地址,CUDA 必须向下舍入到对齐,并且您必须稍后应用适当的偏移量。

假设您绑定了&amp;float[66],正确的对齐方式可能是&amp;float[64],因此CUDA 从该偏移量开始其纹理,您必须为每次访问添加8 个字节的偏移量才能获得所需的结果。我这里是选随机数,不知道对齐要求。

【讨论】:

非常感谢您的及时指导和很好的例子。因为我在音高的每个开头都读取了数组,听起来这个移位问题不会是问题,但了解这种基本行为对我来说非常重要。我明白了,现在我知道第一个参数“偏移量”的含义以及为什么需要清楚地输出它。非常感谢! @mush_head 是的,在代码中添加assert(offset == 0) 可能是个好主意,以防万一,但应该没问题。

以上是关于(cudaBindTexture2D)如何从中间绑定一个倾斜的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何解析该表并从中提取数据?

如何从中断模式异常中获取更多信息

如何成功下载库但无法从中导入项目?

Android小部件如何从中获取小时和分钟的时间?

如何解析字符串以从中获取双倍值

如何返回 Promise 并从中获取数据? [复制]