[英]what can I do about GNU ld 'legacy __sync_synchronize' warning?
[英]What does __sync_synchronize do?
我猜它會強制使用內存柵欄。
這個內置函數會發出一個完整的內存屏障。
對於內存屏障,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);
它停止排隊寫入和緩存讀取。
“volatile”是使用代碼立即獲取或存儲值的編譯器選項,但現代 CPU 也有多個內核,帶有 memory 緩存和延遲寫入外部 memory。 __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
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.