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