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

dib*_*bid 2 cuda gpu gpgpu nested-loops

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

Mar*_*o13 7

标题中问题的答案很简单:从不.你从来没有真正需要的二维坐标.

但是,它们实际存在的原因有几个.其中一个主要原因是它简化了某些问题的建模.特别是,出于"历史"原因,GPU"擅长"或者已经用于它们的问题.我正在考虑像图像处理或矩阵运算这样的事情.编写图像处理或矩阵乘法CUDA内核更直观,你可以清楚地说:

int pixelX = threadIdx.x + blockIdx.x * blockDim.x;
int pixelY = threadIdx.y + blockIdx.y * blockDim.y;
Run Code Online (Sandbox Code Playgroud)

从那以后只处理简单的像素坐标.多少钱这实际上简化了在共享内存介入,例如矩阵乘法在指数麻烦变得更加明显,并且要切片和切块一组行+列了一个更大的矩阵中的,将它复制到本地记忆.如果你只有1D指数并且不得不摆弄偏移量和步幅,那么这将是容易出错的.

事实上,CUDA实际上不仅支持2D,而且还支持3D内核,这可能源于3D纹理经常用于诸如体积渲染之类的事实,这也可以通过GPU大大加速(Web搜索包括像"体积"这样的关键词射线投射"将引导你到这里一些漂亮的演示).

(旁注:在OpenCL中,这个想法甚至被推广.虽然CUDA只支持1D,2D和3D内核,但在OpenCL中,你只有N D内核,其中N被明确地作为work_dim参数给出)

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

  • 我想补充一点,使用 2D 或 3D 坐标有时可以稍微提高性能。虽然您也可以在每个线程中将 1D 坐标转换为 2D 坐标,但如果您不使用 2 的幂,这需要相当慢的模或除法运算。 使用 2D 或 3D 块并直接从硬件寄存器读取 x 和 y 可以避免这些除法/模运算。 (2认同)