CUDA对块进行分工是合乎逻辑的,因为它反映了硬件(单个执行单元中的一些执行线程,都在同一个“块”中)。
然而,当我正在研究图像处理算法的实现时,我不清楚为什么我应该有块网格的2D网格,每个网格都是线程的2D网格。 1D为什么不这样做?毕竟,内核调用通常只是将图像视为线性1D像素数组,并且必须通过乘以列中的常用行*列+偏移来计算其全局索引。
我猜的是空间局部性。我们通常根据周围的像素为像素计算内容,因此线程的2D网格确保所有相邻像素在同一执行单元内运行,因此可以共享本地内存等。这是正确的?我还缺少什么?也许是以某种方式简化编程(尽管很难相信,因为代码无论如何计算一维偏移)
提前致谢
答案 0 :(得分:1)
AFAIK 2D / 3D网格的唯一原因是它与数据有关。如果您有2D数据(图像...)或3D数据(粒子系统等),则可以使用适当的块尺寸使代码更具可读性。此外,在旧卡上,一个维度中的块数限制为65535,因此使用其他维度来绕过它。
无论使用1D线程块还是2D / 3D块,性能都不应有差异。