我在讨论中提出了基本相同的问题.特别是我想提到这个最终答复:
我认为在这个帖子中有两个不同的问题混合在一起:
使用输入或输出数据到线程的2D或3D映射是否有性能优势?对于您和其他人描述的所有原因,答案是"绝对的".如果数据或计算具有空间局部性,那么应该将工作分配给warp中的线程.
使用CUDA的多维网格来完成这项工作任务是否有性能优势?在这种情况下,我不这么认为,因为你可以在内核顶部自己轻松地进行索引计算.这会烧掉一些算术指令,但与内核启动开销相比,这应该可以忽略不计.
这就是为什么我认为多维网格旨在作为程序员的便利而不是提高性能的方法.但是,您确实需要考虑每个warp的内存访问模式.
我想知道今天这种情况是否仍然存在.我想知道为什么需要一个多维的"外部"网格.
我想要了解的是,这是否有一个重要的目的(例如空间位置的实际好处)或是为了方便它(例如在图像处理环境中,它是否只有我们可以有CUDA要知道特定块正在处理的x/y"补丁",以便它可以将它报告给CUDA Visual Profiler或其他东西)?
第三种选择是,这只不过是早期版本的CUDA的延续,它是硬件索引限制的一种解决方法.
使用多维网格肯定有好处.不同的条目(tid,ctaid)是作为特殊寄存器可见的只读变量.见PTX ISA
PTX包含许多预定义的只读变量,这些变量作为特殊寄存器可见,并通过mov或cvt指令访问.特殊登记册是:
Run Code Online (Sandbox Code Playgroud)%tid %ntid %laneid %warpid %nwarpid %ctaid %nctaid
如果某些数据可以在没有进一步处理的情况下使用,那么不仅可以获得算术指令 - 可能是在多维数据的每个索引步骤中,但更重要的是,您要保存寄存器,这是任何硬件上非常稀缺的资源.