得到CPU周期计数了吗?

得到CPU周期计数了吗?

我看到了这篇文章,其中包含C代码以获取最新的CPU周期计数:

C/C+Linux x86_64中基于CPU周期计数的分析

有什么方法可以在C+(Windows和Linux解决方案欢迎)中使用这段代码吗?虽然是用C编写的(C是C+的一个子集),但我不太确定这段代码是否能在C+项目中工作,如果不是,如何翻译它?

我使用的是x86-64

EDIT 2:

找到此功能,但无法获得VS 2010来识别汇编程序。我需要包括什么吗?(我想我得交换一下uint64_tlong long对于窗户.?)

static inline uint64_t get_cycles(){
  uint64_t t;
  __asm volatile ("rdtsc" : "=A"(t));
  return t;}

EDIT 3:

从上面的代码中我得到了错误:

错误C 2400:‘操作码’中内联汇编程序语法错误;找到‘数据类型’“

有人能帮忙吗?


holdtom
浏览 876回答 3
3回答

慕桂英4014372

从GCC 4.5及更高版本开始,__rdtsc()内禀现在得到MSVC和GCC的支持。但所需的包含是不同的:#ifdef&nbsp;_WIN32#include&nbsp;<intrin.h>#else#include&nbsp;<x86intrin.h>#endif这是GCC 4.5之前的最初答案。直接退出了我的一个项目:#include&nbsp;<stdint.h>//&nbsp;&nbsp;Windows#ifdef&nbsp;_WIN32#include&nbsp;<intrin.h>uint64_t&nbsp;rdtsc(){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;__rdtsc();}//&nbsp;&nbsp;Linux/GCC#elseuint64_t&nbsp;rdtsc(){ &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;lo,hi; &nbsp;&nbsp;&nbsp;&nbsp;__asm__&nbsp;__volatile__&nbsp;("rdtsc"&nbsp;:&nbsp;"=a"&nbsp;(lo),&nbsp;"=d"&nbsp;(hi)); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((uint64_t)hi&nbsp;<<&nbsp;32)&nbsp;|&nbsp;lo;}#endif

呼唤远方

VC+对内联程序集使用完全不同的语法-但只在32位版本中使用.64位编译器根本不支持内联程序集。在这种情况下,这很可能也是-rdtsc当涉及到定时代码序列时,(至少)有两个主要问题。首先(与大多数指令一样)它可以按顺序执行,因此,如果您试图安排一个简短的代码序列,rdtsc在该代码之前和之后都可能执行,或者在它之后执行,或者您有什么内容(我相当肯定这两个代码将始终按照彼此的顺序执行,因此至少两者之间的区别永远不会是否定的)。其次,在多核(或多处理器)系统上,一个rdtsc可能在一个核心/处理器上执行,另一个在另一个核心/处理器上执行。在这种情况下,结果是否定的是完全有可能。一般来说,如果您想要在Windows下有一个精确的定时器,最好使用QueryPerformanceCounter.如果你真的坚持用rdtsc,我相信您必须在一个完全用汇编语言编写的单独模块中完成(或者使用编译器内部的),然后与您的C或C+链接。我从未为64位模式编写过该代码,但在32位模式下,它看起来如下所示:&nbsp;&nbsp;&nbsp;xor&nbsp;eax,&nbsp;eax &nbsp;&nbsp;&nbsp;cpuid &nbsp;&nbsp;&nbsp;xor&nbsp;eax,&nbsp;eax &nbsp;&nbsp;&nbsp;cpuid &nbsp;&nbsp;&nbsp;xor&nbsp;eax,&nbsp;eax &nbsp;&nbsp;&nbsp;cpuid &nbsp;&nbsp;&nbsp;rdtsc&nbsp;&nbsp;&nbsp;;&nbsp;save&nbsp;eax,&nbsp;edx&nbsp;&nbsp;&nbsp;;&nbsp;code&nbsp;you're&nbsp;going&nbsp;to&nbsp;time&nbsp;goes&nbsp;here &nbsp;&nbsp;&nbsp;xor&nbsp;eax,&nbsp;eax &nbsp;&nbsp;&nbsp;cpuid &nbsp;&nbsp;&nbsp;rdtsc我知道这看起来很奇怪,但实际上是对的。执行CPUID是因为它是一个序列化指令(不能按顺序执行),并且可以在用户模式下使用。在开始计时之前执行三次,因为Intel记录了第一次执行可以/将以与第二次执行不同的速度运行的事实(他们建议的是三次,所以三次)。然后执行正在测试的代码、强制序列化的另一个cpuid和最后的rdtsc以获得代码完成后的时间。同时,您希望使用操作系统提供的任何方式来强制在一个进程/核心上运行所有这些。在大多数情况下,您还希望强制代码对齐-对齐方式的更改会导致执行Spee中相当大的差异。最后,你想要多次执行它-它总是有可能在中间被打断(例如,任务切换),所以你需要做好准备,一次执行所需的时间要比其他时间长得多-例如,5次运行每次花费40到43次时钟周期,第六次执行需要10000多个时钟周期。显然,在后一种情况下,您只需排除异常值-这不是来自您的代码。摘要:设法执行rdtsc指令本身(几乎)是你最不担心的。更多的是你需要在您从rdtsc那实际上意味着什么。
打开App,查看更多内容
随时随地看视频慕课网APP