我的问题涉及到在CUDA中对一个动态变化数组的一组元素进行聚合全局写入。考虑以下内核:
__global__ void
kernel (int n, int *odata, int *idata, int *hash)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
odata[hash[i]] = idata[i];
}
这里,数组
hash
的前n
个元素包含了要从idata
的前n
个元素更新到odata
的索引。显然,这会导致非常糟糕的内存访问效率。在我的代码中,一个内核调用中的哈希与另一个内核调用中的哈希完全不相关(其他内核以其他方式更新数据),因此仅仅通过重新排列数据来优化这个特定的内核并不能解决问题。在CUDA中是否有一些功能可以改善这种情况的性能?我听说过很多关于纹理内存的讨论,但我还没有能够将我所读到的内容转化为这个问题的解决方案。