我在 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的元素是浮点数(4字节),并且如果我将blockDim.x定义为5,那么即使我的“a”数组的元素大小为4,每个warp都将访问20(4x5)字节的块, 8 或 16 个字节,而不是 32 个字节。那么,关于合并的第一个声明是 false 吗?
谢谢您的回答。