什么是“内存合并”?


16

我知道图形处理单元有一种叫做内存合并的东西。在阅读它时,我对该主题尚不清楚。这与内存级别并行性有什么关系吗?

我已经在Google中搜索过,但无法获得满意的答案。

如果有人给出更全面,易于理解的解释,将会很有帮助。


内存级并行(MLP)是一次执行多个内存事务的能力。在许多体系结构中,这本身表现为能够同时执行读取和写入操作的能力,尽管通常也可以同时执行多次读取。由于存在潜在冲突的风险(尝试将两个不同的值写入同一位置),一次执行多个写入操作的情况很少见。请注意,这与向量化内存操作不同,例如在单个32位读取中读取4个独立但连续的8位值。
sai kiran grandhi 2013年

Answers:


11

“合并”也可以指合并存储器访问模式。在这种用法中,合并用于表示确保线程同时运行,并尝试访问附近的内存。这通常是因为:

  • 通常从RAM中以大块的形式检索内存。
  • 一些处理单元将尝试预测将来的内存访问并提前缓存,同时处理内存的较旧部分。
  • 内存在依次较大但较慢的缓存的层次结构中缓存。

因此,制作可以使用可预测内存模式的程序很重要。对于线程程序而言,这一点甚至更为重要,这样内存请求就不会全部溢出。否则,处理单元将等待内存请求得到满足。

并行编程入门启发的图第2课GPU硬件和并行通信模式

下图:四个线程,具有统一的内存访问。黑色虚线矩形表示单个4字存储请求。

在此处输入图片说明

内存访问是关闭的,可以一次执行一次/块(或最少数量的请求)进行检索。

但是,如果我们增加线程之间访问的“ 步幅 ”,则将需要更多的内存访问。下图:另外四个线程,步幅为两个。

4个内存合并线程,以及4个步长为2的线程

在这里您可以看到这4个线程需要2个内存块请求。步幅越小越好。跨度越宽,可能需要的请求就越多。

当然,随机内存访问模式比大内存跨度差。这些几乎不可能进行流水线,缓存或预测。

TikZ来源:


2
多个线程还可以访问相同的数据项(不仅仅是相同较大块中的一个元素),这与SIMD体系结构中的SPLAT操作有些相似(但更通用)。作为允许延迟的吞吐量处理器,GPU可以在允许有效带宽增加的情况下增加访问延迟。
保罗·克莱顿

给定的链接已断开。
Daniel Soutar

3

我想我在网上看到“ coalescing”一词的两种用法,两者都与记忆有关。一种是合并释放的内存分配,这是在问题中链接的Wikipedia页面中所指的内容。


合并释放的内存分配

分配内存时,有时内存管理器可能会遇到两个相邻的内存块被释放的情况。结合这些将使它们成为单个已释放的内存块-这称为“合并销售”。例:

从分配的4个块开始:

4分配块

后来,其中之一被释放:

现在有1个免费块

然后释放另一个:

现在有2个相邻的免费方块

现在,为什么有两个相邻的空闲块?合并它们:

合并释放的块,现在分配了2个块,释放了1个

合并可以在可能的情况下尽快发生,或者例如在垃圾收集器运行时发生。

TikZ来源:


我认为这个答案不适合我想要的。如您在其他答案中所提供的,内存合并正在读取连续的内存块。如果可能的话,请删除此答案以及您所编辑的有问题的链接
sai kiran grandhi

@saikirangrandhi我将保留答案以供参考。您可以根据需要修改/撤消对问题的编辑;您只需在问题下方按“编辑”即可。
Realz Slaw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.