Arm架构上是否存在__yield()内置intrinsic函数?
__yield()是Arm官方编译器(Arm Compiler 5/6,即armcc/armclang)的内置原语,GCC 7.3.1版本确实没有该符号定义,和你使用的ARMv7-A架构无关,是编译器实现差异导致的问题。
- 该函数的定位和x86下的
_mm_pause()完全一致,属于处理器指令级的轻量让出操作,仅会让当前核心暂停数个时钟周期,不会触发操作系统线程调度,所以你找到的__gnu_parallel::__yield(本质是sched_yield()系统调用包装)确实不是目标实现。 - GCC从12版本开始新增了等价的内置函数
__builtin_arm_yield(),如果可以升级编译器版本可以直接使用该函数替代。 - 低版本GCC下兼容ARMv7-A架构的实现可以直接用内联汇编实现,对应代码如下:
#if defined(__arm__) && defined(__GNUC__) __asm__ __volatile__ ("yield" ::: "memory"); #endif
如果要完整适配多编译器的ARM架构yield逻辑,可以参考以下兼容写法:
#if defined(__arm__) # if defined(__ARMCC_VERSION) || defined(__clang__) // 适配Arm官方编译器、Arm Clang __yield(); # elif defined(__GNUC__) # if __GNUC__ >= 12 // 适配GCC 12及以上版本 __builtin_arm_yield(); # else // 适配GCC 12以下版本 __asm__ __volatile__ ("yield" ::: "memory"); # endif # endif #endif
内容的提问来源于stack exchange,提问作者Jan Hudec
相关产品推荐
相关产品推荐

