Arm 上有 __yield() 内在函数吗?
Is there a __yield() intrinsic on Arm?
我正在尝试为 arm (v7a) 编译一些代码,其中有一个
#if defined(__arm__)
__yield();
#endif
其他分支有 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::__yield
是 sched_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
),因此不需要寄存器或内存破坏器。
我正在尝试为 arm (v7a) 编译一些代码,其中有一个
#if defined(__arm__)
__yield();
#endif
其他分支有 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::__yield
是 sched_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
),因此不需要寄存器或内存破坏器。