gpt4 book ai didi

c - asm、asm volatile 和 clobbering 内存之间的区别

转载 作者:太空狗 更新时间:2023-10-29 16:17:07 25 4
gpt4 key购买 nike

在实现无锁数据结构和时序代码时,通常需要抑制编译器的优化。通常人们使用 asm volatile 和 clobber 列表中的 memory 来执行此操作,但有时您只会看到 asm volatile 或只是一个普通的 asm 破坏内存。

这些不同的语句对代码生成有什么影响(特别是在 GCC 中,因为它不太可能是可移植的)?

仅供引用,这些是有趣的变体:

asm ("");   // presumably this has no effect on code generation
asm volatile ("");
asm ("" ::: "memory");
asm volatile ("" ::: "memory");

最佳答案

参见 "Extended Asm" page in the GCC documentation .

You can prevent an asm instruction from being deleted by writing the keyword volatile after the asm. [...] The volatile keyword indicates that the instruction has important side-effects. GCC will not delete a volatile asm if it is reachable.

An asm instruction without any output operands will be treated identically to a volatile asm instruction.

您的示例都没有指定输出操作数,因此 asmasm volatile 形式的行为相同:它们在代码中创建一个点,该点可能不会被删除(除非证明不可达)。

这与什么都不做不太一样。参见 this question对于更改代码生成的虚拟 asm 示例 - 在该示例中,循环 1000 次的代码被矢量化为代码,该代码一次计算循环的 16 次迭代;但是循环内 asm 的存在会抑制优化(asm 必须达到 1000 次)。

"memory" 破坏器使 GCC 假设任何内存都可以被 asm block 任意读取或写入,因此将阻止编译器重新排序加载或存储它:

This will cause GCC to not keep memory values cached in registers across the assembler instruction and not optimize stores or loads to that memory.

(不过,这并不能阻止一个 CPU 相对于另一个 CPU 重新排序加载和存储;为此你需要真正的内存屏障指令。)

关于c - asm、asm volatile 和 clobbering 内存之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com