![](/img/trans.png)
[英]Why can `asm volatile("" ::: "memory")` serve as a compiler barrier?
[英]Is there a compiler memory barrier for a single variable?
編譯器內存障礙會產生影響,迫使編譯器確保緩存在寄存器中的所有堆棧變量都在屏障之前寫入內存。
例如,GCC有以下聲明:
asm inline ("" : : : "memory");
有沒有辦法告訴編譯器(特別是GCC,但我也對其他人感興趣)只對特定變量做同樣的效果? 類似於以下想象的構造:
int x;
...
asm inline ("" : : : "memory(x)");
具有預期的行為,即x和x的值僅被寫入相應的存儲器位置,如果它恰好被緩存在寄存器中。
原因是我有一個特定的變量,我需要確保它不會緩存在寄存器中,以便硬件引擎可以讀取它的值。 但是,完整的編譯器內存屏障將強制編譯器向內存寫入在該時間點可能緩存在寄存器中的所有其他變量的值,這可能相當於我需要編寫的更多數據。 我想知道是否有更具體的東西。
提前致謝!
試試{ int y = x; *(volatile int*)&x = y; }
{ int y = x; *(volatile int*)&x = y; }
{ int y = x; *(volatile int*)&x = y; }
,並檢查所得到的組件。
由於您願意使用gcc擴展,因此可以使用該功能的原子指令擴展:
__sync_bool_compare_and_swap(&myvar, 0, 0)
如果它已經是0
,則將變量的值設置為0
,並且另外暗示該內存位置的完全順序一致性。
重新收集lkml上的一個線程,單變量僅編譯器屏障的方法之一是:
#define forget(x) __asm__ __volatile__("":"=m"(x):"m"(x))
我想你可以通過在asm
的輸出值列表中指定你的變量來實現它:
__asm__ __volatile__ ("" : "=r" (x) : : )
有關一些信息,請參閱Extended Asm 。
使用"g"
約束而不是"r"
作為更寬松的可能更好。
__asm__ __volatile__ ("" : "=g" (x) : : )
另外,我發現了內聯裝配的另一個很棒的方法 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.