gpt4 book ai didi

c - 如何获取 `gcc` 以从标准 C 为 x86-64 生成 `bts` 指令?

转载 作者:太空狗 更新时间:2023-10-29 16:31:19 28 4
gpt4 key购买 nike

灵感来自 recent question ,我想知道是否有人知道如何让 gcc 在 Linux x86-64 平台上生成 x86-64 bts 指令(位测试和设置), 无需求助于内联汇编或非标准编译器内部函数。

相关问题:

可移植性对我来说比 bts 更重要,所以我不会使用和 asm 指令,如果有其他解决方案,我宁愿不使用编译器 instrinsics。

编辑:C 源语言不支持原子操作,所以我对原子 测试和设置不是特别感兴趣(即使那是原始的测试和设置首先存在的原因)。如果我想要一些原子的东西,我知道我没有机会用标准的 C 源代码来完成它:它必须是一个内部函数、一个库函数或内联汇编。 (我已经在支持多线程的编译器中实现了原子操作。)

最佳答案

它在第一个链接的第一个答案中 - 在宏伟的计划中它有多重要。测试位时唯一的部分是:

  • 低级驱动程序。但是,如果您正在编写一个您可能知道 ASM 的程序,它足以适应系统并且可能大多数延迟都在 I/O 上
  • 测试标志。它通常是在初始化时(仅在开始时执行一次)或在某些共享计算时(这需要更多时间)。

即使微基准测试显示出改进,对应用程序和宏基准测试性能的总体影响也可能很小。

编辑部分 - 使用bts单独并不能保证操作的原子性。它所保证的只是在此内核上 是原子的(or 在内存上也是如此)。在多处理器单元(不常见)或多核单元(非常常见)上,您仍然需要与其他处理器同步。

由于同步的成本要高得多,我相信两者之间的区别:

asm("lock bts %0, %1" : "+m" (*array) : "r" (bit));

asm("lock or %0, %1" : "+m" (*array) : "r" (1 << bit));

是最小的。第二种形式:

  • 可以同时设置多个标志
  • 祝你愉快__sync_fetch_and_or (array, 1 << bit)形式(据我所知,在 gcc 和 intel 编译器上工作)。

关于c - 如何获取 `gcc` 以从标准 C 为 x86-64 生成 `bts` 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039861/

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