在CUDA中,什么是内存合并,它是如何实现的?
什么是CUDA全局内存事务中的“合并”?经过我的CUDA指南后,我无法理解。怎么做?在CUDA编程指南矩阵示例中,逐行访问矩阵称为“coalesced”或col .. by col ..称为合并?
哪个是正确的,为什么?
没有找到相关结果
已邀请:
4 个回复
柑恫祟
可以一行一行地完成,这样(r,c)映射到内存(r * 4 + c)
假设你需要访问一次元素,并说你有四个线程。哪个线程将用于哪个元素?可能要么
要么
哪个更好?哪个会导致合并读取,哪个不会? 无论哪种方式,每个线程进行三次访问。让我们看看第一次访问,看看线程是否连续访问内存。在第一个选项中,第一个访问是0,3,6,9。不连续,不合并。第二个选项,它是0,1,2,3。连续!合并!好极了! 最好的方法可能是编写内核然后对其进行概要分析,看看你是否有非合并的全局加载和存储。
谷起
,其中
表示块尺寸,
表示块索引,
是每个块中的线程索引。 垂直箭头表示并行线程访问每个向量的第一个分量,即存储器的地址0,m,2m ......的情况。如图(a)所示,在这种情况下,存储器访问不是连续的。通过将这些地址之间的间隙归零(上图中显示的红色箭头),内存访问将合并。 但是,这里的问题稍微有些棘手,因为每个GPU块的驻留线程的允许大小限制为
。因此,通过以连续顺序存储第一个
矢量的第一个元素,然后是第二个bd矢量的第一个元素,依此类推,可以完成合并数据的排列。其余的向量元素以类似的方式存储,如图(b)所示。如果n(向量的数量)不是
的因子,则需要用一些微不足道的值填充最后一个块中的剩余数据,例如, 0。 在图(a)的线性数据存储器中,矢量indx的分量i(0≤i
, 其中
,
和
。 总之,在存储大小为m的多个向量的示例中,线性索引根据以下内容映射到合并索引:
这种数据重新排列可以导致GPU全局存储器的显着更高的存储器带宽。 资料来源:“非线性有限元变形分析中基于GPU的计算加速。”国际生物医学工程数值方法杂志(2013年)。
弦砂牧扁
了驳