【发布时间】:2021-11-22 17:17:26
【问题描述】:
我正在尝试为 arm (v7a) 编译一些代码,它有一个
#if defined(__arm__)
__yield();
#endif
其他分支有 YieldProcessor() 用于 MSC,_mm_pause() 或 __builtin_ia32_pause() 用于 x86 和 x86-64。
编译器找不到符号__yield,arm-v7a-linux-gnueabihf-gcc 7.3.1 带有-mcpu=cortex-a9 -mtune=cortex-a9 -march=armv7-a 选项。此类符号是否在其他一些 ARM 平台、后来的 Gcc 或 Clang 上定义?
在编译器附带的头文件中,我只能找到__gnu_parallel::__yield 是sched_yield() 的内联包装器,我想这相当于代码在调用__yield() 的100 次迭代后调用的std::this_thread::yield()。所以我认为不是这样。但我也没有在 gcc 文档中看到 __yield。
【问题讨论】:
-
这太可怕了。如果你写的是真的,那么相同的代码在不同的平台上会非常做不同的事情,具有非常不同的性能特征。此外,与往常一样,让出处理器肯定是程序设计非常糟糕的标志。
-
@EOF 它正在添加它自己的自旋锁。我不会这样做,但我真的说不出它有多少是有用的优化,有多少是令人毛骨悚然的恐怖。
-
@EOF: AFAICT、
YieldProcessor()、_mm_pause()和__builtin_ia32_pause()都发出 x86pause指令,所以它们似乎都是等价的。请注意,这不会为操作系统产生时间片。等待自旋锁正是它的意思。放弃时间片的等待时间太短,但是如果您在紧密循环中读取锁,则对高速缓存行的锤击会降低性能(并浪费功率)。在该循环中放置pause指令可以改善情况。