[英]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.