1

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

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

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

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

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

4

1 回答 1

2

您可以尝试使用共享内存,这可能有效(或无效,没有例子很难说)。

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

__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])

这个想法是以合并的方式加载 shared 中的数据,然后使用 shared 进行数学运算,因为合并访问与共享内存无关(但另一方面,银行冲突会发生;但这通常很好)。

如果您需要更准确的帮助,您必须向我们提供更多信息。这只是一个提示。

于 2016-10-05T16:29:45.990 回答