相关疑难解决方法(0)

获取CPU周期数?

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

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

有没有办法在C++中使用这个代码(欢迎使用windows和linux解决方案)?虽然用C语言编写(而C是C++的一个子集)但我不太确定这段代码是否适用于C++项目,如果没有,如何翻译呢?

我使用的是x86-64

EDIT2:

找到此功能但无法让VS2010识别汇编程序.我需要包含任何内容吗?(我相信我必须换uint64_tlong long窗户......?)

static inline uint64_t get_cycles()
{
  uint64_t t;
  __asm volatile ("rdtsc" : "=A"(t));
  return t;
}
Run Code Online (Sandbox Code Playgroud)

EDIT3:

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

"错误C2400:'操作码'中的内联汇编语法错误;找到'数据类型'"

有人可以帮忙吗?

c c++ performance x86 rdtsc

26
推荐指数
5
解决办法
4万
查看次数

CPU TSC获取操作,尤其是在多核多处理器环境中

在Linux世界中,要获得纳秒精度定时器/时钟提示,可以使用:

#include <sys/time.h>

int foo()
{
   timespec ts;

   clock_gettime(CLOCK_REALTIME, &ts); 
   //--snip--      
}
Run Code Online (Sandbox Code Playgroud)

这个答案提出了asm一种用RDTSC指令直接查询cpu时钟的方法.

在多核,多处理器架构中,这个时钟滴答/定时器值如何在多个内核/处理器之间同步?我的理解是,在固有的围栏中完成了.这种理解是否正确?

你能否提出一些可以详细解释这个问题的文件?我对Intel Nehalem和Sandy Bridge微体系结构感兴趣.

编辑

将进程限制为单个核心或cpu不是一种选择,因为该进程非常庞大(就消耗的资源而言)并且希望最佳地利用包含所有核心和处理器的机器中的所有资源.

编辑

感谢您确认TSC在核心和处理器之间同步.但我最初的问题是这种同步是如何完成的?它是否带有某种围栏?你知道任何公共文件吗?

结论

感谢所有输入:以下是此讨论的结论:TSC在初始化时使用在多处理器/多核系统中的核心和处理器之间发生的RESET进行同步.之后,每个Core都是独立的.TSC与锁相环保持不变,这将使频率变化正常化,从而使给定Core内的时钟变化正常化,这就是TSC在核心和处理器之间保持同步的方式.

c assembly multicore cpu-registers microprocessors

14
推荐指数
4
解决办法
7895
查看次数