gpt4 book ai didi

c++ - 从非合并访问到合并内存访问 CUDA

转载 作者:行者123 更新时间:2023-11-30 03:37:57 25 4
gpt4 key购买 nike

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

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

现在,我知道如果 block 0 中的线程 0 访问 dW[0],然后 block 0 中的线程 1 访问 dw[1],这就是合并访问在全局内存中。问题是我有两个手术。第一个如上所述合并。但第二个不是因为 block 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])

这个想法是以合并的方式加载共享数据,然后使用共享进行数学计算,因为合并访问与共享内存无关(但另一方面,存储区冲突会影响;虽然这通常没问题)。

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

关于c++ - 从非合并访问到合并内存访问 CUDA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39876785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com