面向单分配ADT的代码在现代CPU上的性能


32

可以推论,使用单一分配处理不可变数据具有明显的效果,那就是需要更多的内存,因为您一直在创建新的值(尽管在幕后的编译器会做一些指针技巧来解决这一问题)。

但是,我现在已经听到几次,性能方面的损失被CPU(特别是其内存控制器)可以利用内存未发生突变(这种情况不多)这一事实带来的收益所抵消。

我希望有人可以阐明这是如何做到的(或者如果不是的话)。

另一篇文章的评论中,有人提到抽象数据类型(ADT)与此有关,这使我更加好奇,ADT如何特别影响CPU处理内存的方式?不过,这是一个问题,主要是我只是对语言的纯洁度如何必然影响CPU及其缓存的性能等感兴趣。


2
这在多线程中最有用,在这种情况下,读者可以原子地抓取快照,并且可以安全地知道快照在读取时不会发生变化
棘手的怪胎

@ratchetfreak从编程的角度来看,我认为您的代码获得了更多的安全保证,但是我的好奇心是关于CPU上的内存控制器,以及这种行为对它的影响(或如果没有影响),因为我听说过索赔大约有很多时间,它说对于内存控制器来说效率更高,而我不知道底层细节是否足以说明这是否正确。
Jimmy Hoffa 2013年

即使是真的,我也不认为减少内存的修改是不变性的最佳卖点。毕竟,内存是可以修改的,多年来,CPU和内存管理器已经非常擅长于此。
Rein Henrichs

1
我还想指出,使用不可变结构时,内存效率不一定必须依赖于编译器优化。在这个例子中let a = [1,2,3] in let b = 0:a in (a, b, (-1):c)共享减少了内存需求,而是取决于定义(:)[],而不是编译器。我认为?不确定这一点。

Answers:


28

CPU(特别是其内存控制器)可以利用内存未突变这一事​​实

优点是,此事实可避免访问数据时编译器使用membar指令。

内存屏障,也称为“内存屏障”,“内存屏障”或“篱笆指令”,是一种屏障指令,它使中央处理单元(CPU)或编译器对屏障指令之前和之后发出的存储器操作强制执行排序约束。这通常意味着可以保证某些操作在屏障之前执行,而其他操作则在之后执行。

内存屏障是必需的,因为大多数现代CPU都采用了性能优化,这些性能优化可能导致乱序执行。通常在单个执行线程中不会注意到这种内存操作(装入和存储)的重新排序,但是除非小心控制,否则可能导致并发程序和设备驱动程序中的行为无法预测。


您会看到,当从不同的线程访问数据时,在多核CPU上的运行情况如下:不同的线程在不同的内核上运行,每个内核都使用自己的(本地到其内核)缓存-一些全局缓存的副本。

如果数据是可变的,并且程序员需要在不同线程之间保持一致,则需要采取措施来保证一致性。对于程序员来说,这意味着在他们访问(例如读取)特定线程中的数据时使用同步构造

对于编译器,代码中的同步构造意味着它需要插入一条membar指令,以确保正确传播(“发布”)一个内核上的数据副本所做的更改,以确保其他内核上的缓存具有相同(最新)的副本。

某种程度上的简化,请参见下面的注释,这是针对membar的多核处理器发生的情况:

  1. 所有内核均停止处理 -避免意外写入缓存。
  2. 对本地缓存所做的所有更新都被写回到全局缓存中-确保全局缓存包含最新数据。这需要一些时间。
  3. 更新后的数据从全局缓存写回到本地缓存-以确保本地缓存包含最新数据。这需要一些时间。
  4. 所有核心恢复执行。

您会看到,在全局和本地缓存之间来回复制数据时所有内核都无所作为。这是确保可变数据正确同步(线程安全)所必需的。如果有4个核心,则所有4个将在同步缓存时停止并等待。如果有8,则所有8个停止。如果有16个…​​…那么,您有15个内核在等待其中之一需要做的事情时完全不执行任何操作。

现在,让我们看看当数据不可变时会发生什么?无论什么线程访问它,都保证它是相同的。对于程序员来说,这意味着当它们访问(读取)特定线程中的数据时,无需插入同步结构

对于编译器,这反过来意味着无需插入membar指令

因此,对数据的访问不需要停止内核,也不需要等待在全局和本地缓存之间来回写数据时使用。这是不更改内存优势


请注意,上面的一些简化说明降低了数据可变性的一些更复杂的负面影响,例如在流水线上。为了保证所需的排序,CPU必须使受数据更改影响的堆积线无效-这是另一个性能损失。如果这通过所有管道的直接(因此可靠:)无效来实现,那么负面影响会进一步扩大。



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.