我想知道是否有任何简单的方法可以将非合并内存访问转换为合并内存访问。我们来看一下这个数组的例子:
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
是一个非常大的数组,我不能在此过程中对其进行转换。
你知道是否有可能解决这个问题?
答案 0 :(得分: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])
我们的想法是以聚合方式加载共享数据,然后使用共享来进行数学计算,因为合并访问与共享内存无关(但另一方面银行冲突也是如此;通常情况下;虽然很好。
如果您需要更准确的帮助,您必须向我们提供更多信息。 这只是一个暗示。