我们什么时候需要CUDA中的两个维度线程?

时间:2015-06-15 20:01:36

标签: cuda gpu gpgpu nested-loops

我想知道何时应该在CUDA中使用x和y坐标?我看到一些代码,当它们有嵌套循环时,它们使用x和y坐标。对此有什么一般规则吗?谢谢

1 个答案:

答案 0 :(得分:7)

标题中问题的答案很简单:从不。你从不真的需要 2D坐标。

然而,实际存在的原因有几个。其中一个主要原因是它简化了某些问题的建模。特别是GPU存在的问题,或者它们已被用于“历史性”的问题。原因。我在这里考虑图像处理或矩阵运算等事情。编写图像处理或矩阵乘法CUDA内核更直观,你可以清楚地说:

int pixelX = threadIdx.x + blockIdx.x * blockDim.x;
int pixelY = threadIdx.y + blockIdx.y * blockDim.y;

从那以后只处理简单的像素坐标。当涉及共享内存时,多少这实际上简化了索引的麻烦变得更加明显,例如,在矩阵乘法期间,你想要切片和切块一组行+列一个更大的矩阵,将其复制到本地内存。如果你只有1D指数并且不得不摆弄偏移量和步幅,那么这很容易出错。

事实上,CUDA实际上不仅支持2D,而且还支持3D内核,这可能源于3D纹理经常用于像Volume Rendering这样的事实,这也是GPU可以大大加速的事情(网上搜索包括像"体积光线投射"这样的关键字将引导你在这里进行一些很好的演示。)

(旁注:在OpenCL中,这个想法甚至被推广。虽然CUDA只支持1D,2D和3D内核,但在OpenCL中,你只有ND kernels,其中 N 显式为work_dim参数)

(另一方面说明:我非常确定还存在更多低级技术原因,这些原因与GPU的硬件架构或视频内存缓存有关,其中2D的局部性内核可能很容易被利用并有利于整体性能 - 但我对此并不熟悉,所以这只是一个猜测,直到现在)