visual如何在64位C++代码中使用暂停汇编指令
visual How do you use the pause assembly instruction in 64-bit C++ code?
由于VC++2010不支持64位代码中的内联程序集,如何在代码中获得pause
x86-64指令?这似乎不像许多其他常见的汇编指令(例如,__rdtsc()
、__cpuid()
等(那样有内在的
在原因方面,我希望该指令有助于处理忙等待用例,这样(超线程(CPU就可以用于在所述CPU上运行的其他线程(请参阅intel.com上的Performance Insights(。pause
指令对该用例以及旋转锁实现都很有帮助,我不明白MS为什么没有将其作为内部函数。
感谢
哇,这是一个很难追踪的问题,但如果其他人需要x86-64 pause
指令:
来自windows.h
的YieldProcessor()
宏扩展到未记录的_mm_pause
内部,最终扩展到32位和64位代码中的pause
指令。
顺便说一句,这是完全没有记录的,在MSDN中出现了YieldProcessor((的部分(对于VC++2010文档来说是不正确的(。
下面是一个YieldProcessor((宏块编译成的示例:
19: ::YieldProcessor();
000000013FDB18A0 F3 90 pause
20: ::YieldProcessor();
000000013FDB18A2 F3 90 pause
21: ::YieldProcessor();
000000013FDB18A4 F3 90 pause
22: ::YieldProcessor();
000000013FDB18A6 F3 90 pause
23: ::YieldProcessor();
000000013FDB18A8 F3 90 pause
顺便说一句,在Nehalem架构上,每个暂停指令似乎平均产生大约9个周期的延迟(即,在3.3 GHz CPU上为3 ns(。
_mm_pause()
内部版本由英特尔提供了完整的文档,并得到所有主流x86编译器的支持,可在操作系统间移植。IDK,如果MS的文档在过去缺乏,或者如果你在7年后错过了它。
#include <immintrin.h>
并使用它。(或用于SSE2的古代编译器#include <emmintrin.h>
(。
#include <immintrin.h>
void test() {
_mm_pause();
_mm_pause();
}
在gcc/clang/ICC/MSVC的所有4个(在Godbolt编译器资源管理器上(上编译到此asm:
test(): # @test()
pause
pause
ret
在没有SSE2的CPU上,它解码为rep nop
,这只是一个nop
。x86暂停指令的跨平台实现
Gcc甚至知道这一点,并且在使用-mno-sse
编译时仍然接受_mm_pause()
。(与MSVC不同,对于未启用的指令,gcc和clang通常会拒绝intrinisc。(有趣的是,gcc甚至在其asm输出中发出rep nop
,而其他三个发出pause
。当然,它们组装成相同的机器代码。
Pause在Sandybridge系列上闲置该超线程的前端约5个周期,直到Skylake。在Skylake上,Intel将其增加到约100个周期,以在旋转等待循环中节省更多功率,并以可能的延迟为代价提高整体吞吐量,尤其是在超线程内核上。
在所有CPU上,它还避免了在离开旋转循环时内存顺序的错误推测。因此,当它最终再次重要时,它确实减少了延迟。
另请参见";暂停";x86?中的指令?。
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 如何暂停插孔音频客户端
- 在 vscode 中运行时无法暂停或设置断点
- 为什么 memcpy() 和其他类似的函数使用汇编?
- C++ 如何暂停控制台输出,以便用户可以在继续之前阅读信息
- 如何将循环暂停几秒钟?
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 如何在 for 循环内暂停
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 英特尔汇编与内部函数,AVX
- 在 C++ 中暂停 For 循环 1 秒钟
- 这个x86汇编代码是如何接收和存储子程序返回的数据的
- 使用暂停按钮ARDUINO创建灯光序列时出现问题
- 如何暂停进程中的所有线程(停止世界)
- Capstone cs_disasm仅反汇编一小部分代码
- visual如何在64位C++代码中使用暂停汇编指令