为了账号安全,请及时绑定邮箱和手机立即绑定

得到CPU周期计数了吗?

得到CPU周期计数了吗?

C++ C
holdtom 2019-06-20 15:38:34
得到CPU周期计数了吗?我看到了这篇文章,其中包含C代码以获取最新的CPU周期计数:C/C+Linux x86_64中基于CPU周期计数的分析有什么方法可以在C+(Windows和Linux解决方案欢迎)中使用这段代码吗?虽然是用C编写的(C是C+的一个子集),但我不太确定这段代码是否能在C+项目中工作,如果不是,如何翻译它?我使用的是x86-64EDIT 2:找到此功能,但无法获得VS 2010来识别汇编程序。我需要包括什么吗?(我想我得交换一下uint64_t到long long对于窗户.?)static inline uint64_t get_cycles(){   uint64_t t;   __asm volatile ("rdtsc" : "=A"(t));   return t;}EDIT 3:从上面的代码中我得到了错误:错误C 2400:‘操作码’中内联汇编程序语法错误;找到‘数据类型’“有人能帮忙吗?
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

从GCC 4.5及更高版本开始,__rdtsc()内禀现在得到MSVC和GCC的支持。

但所需的包含是不同的:

#ifdef _WIN32#include <intrin.h>#else#include <x86intrin.h>#endif

这是GCC 4.5之前的最初答案。

直接退出了我的一个项目:

#include <stdint.h>//  Windows#ifdef _WIN32#include <intrin.h>uint64_t rdtsc(){
    return __rdtsc();}//  Linux/GCC#elseuint64_t rdtsc(){
    unsigned int lo,hi;
    __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
    return ((uint64_t)hi << 32) | lo;}#endif


查看完整回答
反对 回复 2019-06-20
?
呼唤远方

TA贡献1856条经验 获得超11个赞

VC+对内联程序集使用完全不同的语法-但只在32位版本中使用.64位编译器根本不支持内联程序集。

在这种情况下,这很可能也是-rdtsc当涉及到定时代码序列时,(至少)有两个主要问题。首先(与大多数指令一样)它可以按顺序执行,因此,如果您试图安排一个简短的代码序列,rdtsc在该代码之前和之后都可能执行,或者在它之后执行,或者您有什么内容(我相当肯定这两个代码将始终按照彼此的顺序执行,因此至少两者之间的区别永远不会是否定的)。

其次,在多核(或多处理器)系统上,一个rdtsc可能在一个核心/处理器上执行,另一个在另一个核心/处理器上执行。在这种情况下,结果是否定的完全有可能。

一般来说,如果您想要在Windows下有一个精确的定时器,最好使用QueryPerformanceCounter.

如果你真的坚持用rdtsc,我相信您必须在一个完全用汇编语言编写的单独模块中完成(或者使用编译器内部的),然后与您的C或C+链接。我从未为64位模式编写过该代码,但在32位模式下,它看起来如下所示:

   xor eax, eax
   cpuid
   xor eax, eax
   cpuid
   xor eax, eax
   cpuid
   rdtsc   ; save eax, edx   ; code you're going to time goes here

   xor eax, eax
   cpuid
   rdtsc

我知道这看起来很奇怪,但实际上是对的。执行CPUID是因为它是一个序列化指令(不能按顺序执行),并且可以在用户模式下使用。在开始计时之前执行三次,因为Intel记录了第一次执行可以/将以与第二次执行不同的速度运行的事实(他们建议的是三次,所以三次)。

然后执行正在测试的代码、强制序列化的另一个cpuid和最后的rdtsc以获得代码完成后的时间。

同时,您希望使用操作系统提供的任何方式来强制在一个进程/核心上运行所有这些。在大多数情况下,您还希望强制代码对齐-对齐方式的更改会导致执行Spee中相当大的差异。

最后,你想要多次执行它-它总是有可能在中间被打断(例如,任务切换),所以你需要做好准备,一次执行所需的时间要比其他时间长得多-例如,5次运行每次花费40到43次时钟周期,第六次执行需要10000多个时钟周期。显然,在后一种情况下,您只需排除异常值-这不是来自您的代码。

摘要:设法执行rdtsc指令本身(几乎)是你最不担心的。更多的是你需要在您从rdtsc那实际上意味着什么。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 868 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信