我编写了一个 CUDA 内核,它执行两个数组arr1
和arr2
. 将哪些索引arr1
与哪些索引相加的信息arr2
存储在一个数组中idx
。
这是一个代码示例:
__global__ add(float* arr1, float* arr2, int* idx, int length)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
// each thread performs (length) additions,
// arr2 is (lenght) times larger than arr1
for (int j=threadIdx.x; j<length*blockDim.x; j+=blockDim.x)
{
arr1[i] += arr2[ idx[blockIdx.x*blockDim.x + j] ]; // edited here
}
}
该代码产生正确的输出,但几乎不比具有 8 个线程的 CPU 上的 openmp-parallel 代码快。我为不同的块大小尝试了这个。
我怀疑访问模式arr2
效率低下,因为arr2
它在全局内存中并且是准随机访问的——数组idx
包含唯一的、排序的、但不连续的索引(可能是 2、3、57、103……) . 因此,没有利用 L1 缓存。此外,数组非常大,不能完全适合共享内存。
有没有办法绕过这个障碍?您对如何优化访问模式有想法arr2
吗?
您可以在这里尝试做几件事:
希望这能让您对优化方式有所了解:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句