【发布时间】:2017-01-18 10:58:35
【问题描述】:
void loop(int loops)
{
while (loops-- > 0)
asm volatile ("" : : : "memory")
}
我知道
asm volatile ("" : : : "memory")会阻止编译器重新排序指令。但是,在这里,我看不到可以重新排序的内容以及为什么它在并发方面可能存在问题。 (我考虑到可能的中断)。那么,为什么会有障碍呢?-
其次,连接问题。 假设我们有 10000000 行代码(见下文)。正如我们所知,CPU 可以重新排序 StoreLoad。
mov [eax], $2; 不; 不; ...; 不; mov ebx, [ecx];
CPU 能够预测应用 StoreLoad 的机会有多深?
同样的问题可以应用于编译器,但它涉及各种重新排序(不仅是 StoreLoad,而且不仅是内存操作)
【问题讨论】:
-
1) 也许作为副作用,它会阻止优化器丢弃“循环”的其他“不必要”修改。
-
如果你把它拿出来用
-O3编译函数会发生什么?代码与设置屏障有何不同? -
我明白了。因此,您是否建议存在障碍,否则编译器会删除它? 2. 问题呢?也许,我没有很好地解释我的意思?
-
我对 #2 没有任何想法。但是,是的,没有内存破坏器,它可以完全消除“浪费时间”的循环。这是延迟的一种不好的方法。如果你想替换它,也许像 __builtin_ia32_pause()?
-
我没有收到您的回复通知,因为您没有使用
@peter。澄清一下,您是说这是其他人编写的现有代码?从你正在看的那个教学操作系统?这并不明显,尤其是缺少分号,这意味着它甚至无法编译。
标签: x86 operating-system barrier