【发布时间】:2018-02-10 18:31:36
【问题描述】:
在释放内存之前,我正在从 CPU 缓存中清除内存范围。理想情况下,我只想放弃这些缓存行而不将它们保存到内存中。因为没有人会使用这些值,并且再次获得该内存范围的人(在malloc()/new/_mm_malloc() 等之后)将首先用新值填充内存。作为this question suggests,目前似乎没有办法在x86_64上实现理想。
因此我在做_mm_clflushopt()。据我了解,在_mm_clflushopt() 之后,我需要调用_mm_sfence() 以使其非临时存储对其他内核/处理器可见。但在这种特定情况下,我不需要它的商店。
所以如果我不打电话给_mm_sfence(),会不会发生不好的事情?例如。如果其他一些核心/处理器能够足够快地再次分配该内存范围,并开始用新数据填充它,是否会发生新数据同时被当前核心刷新的旧缓存覆盖?
编辑:快速的后续分配不太可能,我只是在描述这种情况,因为我需要程序在那里也正确。
【问题讨论】:
-
请问,首先驱逐缓存的目的是什么?
-
@PasserBy,让它尽快被接下来真正使用的数据占用。在不明确驱逐它的情况下,CPU 会将旧的(不再使用的)数据保留在缓存中,直到旧数据变为最近最少使用 (LRU) w.r.t。缓存中的其他数据。
-
如果可以证明缓存中的内容不再需要,并且驱逐它既是可能的并且提供了加速,那不是已经包含在优化器中了吗?
-
@PasserBy,也许它太难证明了,所以优化器不会走那么远。简而言之,这取决于具体情况:有时您很快就会在同一地址范围上进行分配,有时您不希望分配任何东西。因此程序员更容易根据具体情况做出决定。但是我们可以为 GCC/Clang 提交提案 :)
标签: c++ concurrency x86-64 cpu-cache memory-fences