CUDA合并和全局内存



我在CUDA课程中被告知,如果我的"a"数组的元素大小为4.8或16字节,则会合并以下访问(全局内存(。

int i = blockIdx.x*blockDim.x + threadIdx.x;
a[i];

聚结的两个条件是:warp的线程必须访问一个32、64或128字节的块。Warp的第一个线程必须访问一个32、64或128 的倍数的地址

但在本例中(第一个条件(,没有任何东西可以保证warp将访问32字节的块。

如果我假设a的元素是float(4字节(,并且如果我将blockDim.x定义为5,那么每个warp都将访问20(4x5(字节的块,即使我的"a"数组的元素的大小是4.8或16字节,而不是32。那么,关于聚结的第一个说法是假的吗?

谢谢你的回答。

但在本例中(第一个条件(,没有任何东西可以保证warp访问32字节的块。

由于线程排序,它保证每个warp访问128个字节(32个线程x 4个字节(。这是联合内存访问的必要条件。

如果我假设a的元素是浮点(4个字节(,并且如果我将blockDim.x定义为5,那么即使我的"a"数组的元素的大小是4,8或16个字节,而不是32,每个warp都将访问20(4x5(个字节的块。

Warps总是32个线程。如果将blockDim.x定义为5,则每个块将由1个扭曲和27个空线程组成。合并规则仍然适用,事务也将合并,但您正在浪费27/32的潜在计算能力和内存带宽。

那么,关于聚结的第一个说法是假的吗?

否。

最新更新