__sync_synchronize是做什么用的?

35

我看到一个关于计时的问题的回答使用了 __sync_synchronize() 函数。

  • 这个函数是做什么用的?
  • 何时需要使用它?
4个回答

44

这是一个用于完整内存屏障的原子内置函数。

没有内存操作数会在该操作中被移动,无论向前还是向后。此外,将根据需要发出指令,以防止处理器在该操作中推测加载,并在操作后排队存储。

请查看上面链接中的详细信息。


那么它既可以作为编译屏障,也可以作为硬件内存屏障,对吗? - tozak
1
@tozak,是的确实。 - Amit

6

4

此内置函数会发出完整的内存屏障指令。

关于内存屏障,CPU会对我们的指令进行排序,通常会提高效率,但也可能导致意外结果。例如,硬件中可能有四个寄存器:当您发出一个操作命令时,一个寄存器保存您的操作指令(例如读取),两个寄存器保存参数(例如地址、大小),最后一个寄存器是控制寄存器。当所有参数准备好之后,硬件将读取参数并执行程序,其过程可能如下所示:

    writereg (dev.register_size,size);
    writereg (dev.register_addr,addr);
    writereg (dev.register_cmd,READ);
    writereg (dev.register_control,GO);


如果将最后一个操作码放在其他代码之前,那么这不是我们期望的情况,因此我们可以在前三个代码和最后一个代码之间插入内存屏障,以强制CPU在执行前三个代码后再执行最后一个代码。
    writereg (dev.register_size,size);
    writereg (dev.register_addr,addr);
    writereg (dev.register_cmd,READ);
    __sync_synchronize();
    writereg (dev.register_control,GO);


0
它停止了写入排队和读取缓存。
"volatile" 是编译器选项,用于立即获取或存储值的代码,但现代 CPU 也具有内存缓存和延迟写入外部存储器的多个核心。__sync_synchronize() 确保所有核心同时看到相同的值。
...
X = new_value; // compiler and/or CPU could update X later when convienent
...
if ( X ) ... // compiler and/or CPU could use previous cached value of X
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接