从非合并访问到合并内存访问 CUDA
From non coalesced access to coalesced memory access CUDA
我想知道是否有任何简单的方法可以将非合并内存访问转换为合并内存访问。让我们以这个数组为例:
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
是一个非常大的数组,我在这个过程中无法转换它。
您知道是否可以缓解这个问题吗?
您可以尝试使用共享内存,这可能有效(或无效,没有示例很难判断)。
例如,假设第一个操作访问合并数据,第二个操作步幅很大;这可能会加快速度
__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])
这个想法是以合并的方式在共享中加载数据,然后使用共享来进行数学计算,因为合并访问与共享内存无关(但另一方面,内存冲突很重要;虽然这通常没问题).
如果您需要更准确的帮助,您必须向我们提供更多信息。
这只是一个提示。
我想知道是否有任何简单的方法可以将非合并内存访问转换为合并内存访问。让我们以这个数组为例:
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
是一个非常大的数组,我在这个过程中无法转换它。
您知道是否可以缓解这个问题吗?
您可以尝试使用共享内存,这可能有效(或无效,没有示例很难判断)。
例如,假设第一个操作访问合并数据,第二个操作步幅很大;这可能会加快速度
__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])
这个想法是以合并的方式在共享中加载数据,然后使用共享来进行数学计算,因为合并访问与共享内存无关(但另一方面,内存冲突很重要;虽然这通常没问题).
如果您需要更准确的帮助,您必须向我们提供更多信息。 这只是一个提示。