内存屏障/栅栏的开销

Pro*_*mer 6 c++

我目前正在编写C++代码,并在我的代码中使用了很多内存屏障/围栏.我知道,MB告诉编译器和硬件不要重新排序它周围的写/读.但我不知道这个操作在运行时对于处理器有多复杂.

我的问题是:这种障碍的运行时开销是多少?谷歌没有找到任何有用的答案......开销是否可以忽略不计?或者导致MB的大量使用导致严重的性能问题?

最好的祝福.

jal*_*alf 1

尝试思考该指令的作用。它不会让 CPU 执行任何复杂的逻辑操作,但会强制 CPU 等待,直到所有读取和写入都已提交到主内存。因此,成本实际上取决于访问主内存的成本(以及未完成的读/写的数量)。

访问主内存通常相当昂贵(10-200 个时钟周期),但从某种意义上说,这项工作也必须在没有屏障的情况下完成,它可以通过同时执行其他一些指令来隐藏,这样你就不会感觉到花费这么多。

它还限制了 CPU(和编译器)重新调度指令的能力,因此可能会产生间接成本,因为附近的指令无法交错,否则可能会产生更有效的执行调度。

  • 这个答案是不对的。“所有读取和写入都已提交到主内存”这句话是不正确的。主内存不受内存栅栏的影响。至少,有了缓存一致性,为什么还要一直到主内存呢?主内存访问的周期时间也很短。 (6认同)