合并的全局内存使用散列写入

时间:2012-10-17 15:53:39

标签: c++ c cuda gpgpu

我的问题涉及到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];
}

此处数组n的第一个hash元素包含要从odata的第一个n元素更新的idata索引。显然,这会导致可怕的,可怕的缺乏融合。在我的代码中,一个内核调用的散列与另一个内核的散列完全无关(其他内核以其他方式更新数据),因此只需重新排序数据以优化这个特定的kenrel就不是一种选择。 / p>

CUDA中是否有某些功能可以让我改善这种情况的表现?我听到很多关于纹理记忆的讨论,但是我无法将我读过的内容翻译成这个问题的解决方案。

2 个答案:

答案 0 :(得分:3)

纹理是一种只读机制,因此无法直接提高分散写入GMEM的性能。如果你像这样“哈希”:

odata[i] = idata[hash[i]]; 

(也许你的算法可以转换?)

然后考虑Texture mechanism可能会有一些好处。 (你的例子似乎是1D)。

您还可以确保共享内存/ L1拆分针对缓存进行了优化。但这对分散的写入没有多大帮助。

答案 1 :(得分:0)

你能限制哈希结果的范围吗?例如,您可能知道线程的前1K次迭代仅在odata的0到8K范围内访问。

如果是这样,您可以使用共享内存。您可以分配共享内存块并临时在共享内存上快速分散写入。然后在合并事务中将共享内存块写回全局内存。

相关问题