C++ CUDA:一个区块需要更多尺寸,还是只有一个?

C++ CUDA:一个区块需要更多尺寸,还是只有一个?,c++,matrix,cuda,C++,Matrix,Cuda,我需要使用CUDA对矩阵的每个元素(基本上是内存中的浮点值向量)求平方根 矩阵尺寸“先验”未知,可能会变化[2-20.000] 我想知道:我可能会使用(正如Jonathan在这里所建议的)这样的块维度: int thread_id = blockDim.x * block_id + threadIdx.x; 并检查线程id是否低于行*列。。。这很简单,很直接 但是,我为什么要使用两个(甚至三个)块栅格维度来执行这样的计算(记住,我毕竟有一个矩阵),而不是一个矩阵,这有什么特别的性能原因吗 我在

我需要使用CUDA对矩阵的每个元素(基本上是内存中的浮点值向量)求平方根

矩阵尺寸“先验”未知,可能会变化[2-20.000]

我想知道:我可能会使用(正如Jonathan在这里所建议的)这样的块维度:

int thread_id = blockDim.x * block_id + threadIdx.x;
并检查线程id是否低于行*列。。。这很简单,很直接

但是,我为什么要使用两个(甚至三个)块栅格维度来执行这样的计算(记住,我毕竟有一个矩阵),而不是一个矩阵,这有什么特别的性能原因吗


我在考虑合并问题,比如让所有线程按顺序读取值。维度的存在只是为了方便,内部所有东西都是线性的,因此无论哪种方式在效率方面都没有优势。如您所示,避免计算(人为的)线性索引似乎要快一点,但线程合并的方式不会有任何区别。

谢谢,考虑到矩阵可能是非32倍大小(例如1033x2977),平铺方法(2维)在我看来就像上面一样复杂,但我可能错了谢谢你ashwin,一个问题:如果我选择一个线程数乘以半扭曲,你页面的第二种方法会最大化合并,对吗?@Paul:选择一个块大小(每个块的线程数)总是一个好主意,它可以被扭曲大小(每个扭曲的线程数)整除,因为无论如何都不会有一些空的扭曲。@Paul工作分配策略的链接: