dib*_*bid 2 cuda gpu gpgpu nested-loops
我想知道何时应该在CUDA中使用x和y坐标?我看到一些代码,当它们有嵌套循环时,它们使用x和y坐标.对此有什么一般规则吗?谢谢
标题中问题的答案很简单:从不.你从来没有真正需要的二维坐标.
但是,它们实际存在的原因有几个.其中一个主要原因是它简化了某些问题的建模.特别是,出于"历史"原因,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内核的局部可能很容易被利用并且是有益的对于整体表现 - 但我不熟悉,所以这只是一个猜测,直到现在)