从非合并访问到合并内存访问CUDA

From non coalesced access to coalesced memory access CUDA

本文关键字:合并 访问 CUDA 内存      更新时间:2023-10-16

我想知道是否有任何简单的方法将非合并内存访问转换为合并内存访问。让我们以这个数组为例:

dW[[w0,w1,w2][w3,w4,w5][w6,w7][w8,w9]]

现在,我知道如果线程0在块0访问dW[0],然后线程1在块0访问dw[1],这是在全局内存中的合并访问。问题是我有两个操作。第一个是如上所述合并的。但是第二个不是因为块0中的线程1需要对dW[0], dW[1]dW[2]进行操作。

我知道容器的初始形状允许或禁止合并访问。但是dW是一个非常大的数组,我不能在这个过程中对它进行转换。

你知道是否有可能缓解这个问题吗?

您可以尝试使用共享内存,这可能会起作用(或者不起作用,没有示例很难判断)。

例如,假设第一个操作访问合并数据,第二个操作大步前进;这可能会加快速度

__shared__ int shared[BLOCK_SIZE];
// Load data global -> shared with coalesced access ; you may need to load a bit more before/after depending on you application
shared[tid] = global[some id]
syncthreads();
// Do the math with coalescing access
function0(shared[tid])
// Do the math with the non coalescing access
function1(shared[tid+-1 or wathever])

这个想法是以一种凝聚的方式加载共享中的数据,然后使用共享来做数学计算,因为凝聚访问对共享内存无关紧要(但另一方面,银行冲突;这通常是可以的)。

如果你想要更准确的帮助,你必须给我们更多的信息。这只是个提示