我目前正在编写C++代码,并在我的代码中使用了很多内存屏障/栅栏。我知道,MB会告诉编译器和硬件不要重排它周围的写入/读取操作。但是我不知道这个操作对处理器在运行时有多复杂。
我的问题是:这种屏障的运行时开销是多少?我在谷歌上没有找到任何有用的答案......这种开销是否可以忽略不计?还是频繁使用MB会导致严重的性能问题?
最好的问候。
我目前正在编写C++代码,并在我的代码中使用了很多内存屏障/栅栏。我知道,MB会告诉编译器和硬件不要重排它周围的写入/读取操作。但是我不知道这个操作对处理器在运行时有多复杂。
我的问题是:这种屏障的运行时开销是多少?我在谷歌上没有找到任何有用的答案......这种开销是否可以忽略不计?还是频繁使用MB会导致严重的性能问题?
最好的问候。
试着思考指令的作用。它并不会让CPU在逻辑上执行任何复杂的操作,但它会强制等待直到所有读写操作都已提交到主内存中。因此,成本实际上取决于访问主内存的成本(以及未完成的读写操作数量)。
访问主内存通常非常昂贵(10-200个时钟周期),但从某种意义上说,即使没有屏障,这项工作也必须完成,只是可以通过同时执行其他指令来隐藏它,这样你就不会感受到成本如此之高。
它还限制了CPU(和编译器)重新安排指令的能力,因此可能会有间接成本,因为附近的指令无法交错执行,否则可能会产生更有效的执行计划。