visual-c – 如何使用64位C代码中的暂停汇编指令?

由于VC 2010在64位代码不支持内联程序集,因此如何在我的代码中暂停x86-64指令?这似乎并不是内在的,因为有许多其他常见的汇编指令(例如__rdtsc(),__cpuid()等)).

在为什么一方面,我希望该指令能够帮助忙碌的等待用例,以便(超线程)cpu可用于在所述cpu上运行的其他线程(请参阅:intel.com上的Performance Insights).暂停指令对于这种用例和旋转锁定实现非常有帮助,我不明白为什么MS不将其作为内在的.

谢谢

解决方法

哇,这是一个很难追踪的问题,但是如果有人需要x86-64暂停指令:

来自windows.h的YieldProcessor()宏扩展到未记录的_mm_pause内在函数,最终扩展为32位和64位代码中的暂停指令.

对于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).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...