从非合并访问到合并内存访问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]
,然后线程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])
这个想法是以一种凝聚的方式加载共享中的数据,然后使用共享来做数学计算,因为凝聚访问对共享内存无关紧要(但另一方面,银行冲突;这通常是可以的)。
如果你想要更准确的帮助,你必须给我们更多的信息。这只是个提示相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 使用C++程序合并排序没有得到正确的输出
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 如何合并两个双重链接列表(访问下一个链接)
- 分析我的CUDA内核的内存访问合并
- CUDA - 了解线程的并行执行(扭曲)和合并的内存访问
- 从非合并访问到合并内存访问CUDA
- 在合并排序中出现严重的访问错误