Arm 上有 __yield() 内在函数吗?

Is there a __yield() intrinsic on Arm?

我正在尝试为 arm (v7a) 编译一些代码,其中有一个

#if defined(__arm__)
    __yield();
#endif

加入this pull-request

其他分支有 YieldProcessor() 用于 MSC 和 _mm_pause()__builtin_ia32_pause() 用于 x86 和 x86-64。

编译器找不到符号 __yield,带有 -mcpu=cortex-a9 -mtune=cortex-a9 -march=armv7-a 选项的 arm-v7a-linux-gnueabihf-gcc 7.3.1。在其他一些 ARM 平台、后来的 Gcc 或 Clang 上是否定义了这样的符号?

在编译器附带的 headers 中,我能找到的是 __gnu_parallel::__yieldsched_yield() 的内联包装器,我想这等同于 std::this_thread::yield()代码在调用 __yield() 的 100 次迭代后调用。所以我认为不是这样。但我也没有在 gcc 文档中看到 __yield

__yield 内在函数被指定为 ARM C Language Extensions (see 8.4 "Hints"). It emits the yield instruction 的一部分,它大致相当于 x86 pause。它专门用于等待自旋锁等情况;它可以防止 CPU 过度冲击缓存行(这会损害性能),可能会节省一些电量,并且在超线程 CPU 的情况下,可以让更多的计算单元可供其他逻辑处理器使用。

(请注意,它纯粹是一个 CPU 函数,而不是 OS 或库调用;它不会像类似地向操作系统产生 CPU 时间片命名为 pause()sched_yield()std::this_thread::yield() 调用即可。)

尽管 GCC 支持一些 ACLE 内在函数,但它似乎缺少这一点。您应该可以用 asm volatile("yield"); 代替。 yield 指令没有架构效果(它的执行方式类似于 nop),因此不需要寄存器或内存破坏器。