CUDA:块应该有多个维度还是只有一个?

4

我需要使用CUDA对矩阵(在内存中基本上是一个浮点值向量)的每个元素进行平方根运算。

矩阵的尺寸事先未知,可能会有所变化[2-20,000]。

我在想:我可以像Jonathan在这里建议的那样使用一个块维度:

int thread_id = blockDim.x * block_id + threadIdx.x;

检查线程ID是否小于行数乘以列数...这很简单和直接。

但是,为什么我应该使用两个(甚至三个)块网格维度来执行这样的计算(记住我毕竟有一个矩阵),而不是只使用一个呢?

我在考虑一些协同问题,比如使所有线程按顺序读取值。

1个回答

6

维度只是为了方便起见存在的,内部一切都是线性的,因此在效率方面无论哪种方式都没有优势。避免像上面展示的计算(人为)线性索引似乎会更快一些,但线程协同的方式不会有任何区别。


谢谢,考虑到矩阵可能是非32倍数大小(例如1033x2977),对我来说,平铺方法(2维)似乎只是像上面一样复杂,但我可能错了。 - Marco A.
谢谢你,Ashwin。我有一个问题:如果我选择一个半warp的倍数作为线程数,你网页上的第二种方法会最大化合并吗? - Marco A.
@Paul:选择一个可以被warp大小(每个warp的线程数)整除的块大小(每个块的线程数)总是一个不错的主意,因为无论如何都不会有一些半空的warp。 - Jonas Bötel
@Paul 工作分配策略的链接:http://codeyarns.com/2011/02/16/cuda-work-allocation-techniques/ - Ashwin Nanjappa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接