问题标签 [rdtsc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
117 浏览

linux - 时间是怎么计算的?

为了计算时间我们通常使用系统调用,但是如果我想自己实现呢,有可能吗?Usingrdtsc给了我从我们打开它开始的 cpu 时钟数量。仍然无法计算时间,因为为此我们需要 CPU 频率。基本问题是,在我看来,不仅我测量的 cpu 频率与我看到的不同,/proc/cpuinfo而且它也会随着时间的推移而变化(超频和超频)。那么系统调用是如何实现的呢?

我正在寻找的解决方案框架是通过查看一些初始时间 t0、自 t0 以来的 cpu 时钟数量(使用rdtsc)和 cpu 频率来计算时间。就像是

0 投票
2 回答
5789 浏览

c++ - 函数 __asm__ __volatile__("rdtsc");

我不知道这段代码到底是做什么的:

拜托,有人可以解释一下吗?为什么是“rdtsc”?

0 投票
1 回答
382 浏览

c++ - 如何以最小的延迟依次调用两个函数?

我实现了一个返回时间的快速函数(使用 rdtsc),我们称之为fast_time()。我有参考使用系统调用的原始函数,我们称之为system_time()。我的程序使用fast_time()但在一个单独的线程中,我不断地运行一个 while 循环来检查从 my 函数返回的时间与原始函数之间的差异是否大于预定义的阈值。就像是

通常我看不到错误,但有时我确实得到了错误,我想更好地理解这个问题。我的第一个怀疑是调用system_time()不会在fast_time()返回后立即发生。如何强制程序尽可能fast_time() - system_time()“原子地”执行?

0 投票
1 回答
497 浏览

c++ - 为什么 rdtscp 不返回核心 ID?

我有这个代码

它定义了一个函数 rdtscp,它使用内联汇编来调用 rdtscp 汇编指令。TSC 值看起来不错,但核心 id 始终为零,即使 sched_getcpu() 返回了正确的核心 id 并且它不为零。输出看起来像

如何使用 rdtscp 获取 TSC 和核心 ID?

0 投票
1 回答
240 浏览

c++ - 如何检测 Visual C++ 中的 rdtscp 支持?

我在 MSVC 2012 上运行了一段代码:

我试图使用 __rdtscp() 来获取时间戳;但是,在不支持 __rdtscp() 的平台上,我想改用 __rdtsc() 。

上面的代码不起作用;如果不支持 __rdtscp()(在某些 VM 上),程序就会崩溃。那么有什么方法可以检测 __rdtscp() 是否受支持,但不会导致程序崩溃?

0 投票
1 回答
1369 浏览

linux - 测量时间:gettimeofday、TSC 和时钟滴答之间的差异

我正在为我的部分程序做一些性能分析。我尝试用以下四种方法来衡量执行情况。有趣的是,它们显示出不同的结果,我并不完全理解它们的差异。我的 CPU 是 Intel(R) Core(TM) i7-4770。系统是 Ubuntu 14.04。提前感谢您的任何解释。

方法一:使用gettimeofday()函数,结果以秒为单位

方法二:使用rdtsc类似https://stackoverflow.com/a/14019158/3721062的指令

方法 3 和 4 利用 Intel 的性能计数器监视器 (PCM) API

方法 3:使用 PCM

uint64 getCycles(const CounterStateType & before, const CounterStateType &after)

它的描述(我不太明白):

方法 4:使用 PCM

uint64 getInvariantTSC (const CounterStateType & before, const CounterStateType & after)

其描述:

两次样本运行产生的结果如下:(方法 1 以秒为单位。方法 2~4 除以(相同)数字以显示每项成本)。

一些观察:

  1. 方法 1 与方法 2 的比例非常一致,而其他的则不然。即,0.016489/0.533603 = 0.020374/0.659265。假设gettimeofday()足够准确,该rdtsc方法表现出“不变”特性。(是的,我从互联网上了解到,当前一代的英特尔 CPU 具有此功能rdtsc。)

  2. 方法 3 的报告高于方法 2。我猜它与 TSC 有所不同。但它是什么?

  3. 方法4是最令人困惑的一种。它报告的数字比方法 2 和 3 大一个数量级。它不应该也是一种循环计数吗?更不用说它带有“不变”的名称了。

0 投票
1 回答
1485 浏览

intel - 拦截来自 KVM 中来宾 vm 用户空间的 rdtsc 指令

正如标题所说,我陷入了这个问题。我想在 VMM 中通过添加

setup_vmcs_config中 vmx.c(arch/x86/kvm) 中的CPU_BASED_RDTSC_EXITING标志标志,以及

然后自己处理 vm_exit(参考:邮件列表)。问题是我不能

判断rdtsc的vm_exit是guest内核还是guest vm用户引起的

空间应用,后一个正是我想要拦截的。我试图搜索

通过qemu-kvm-1.2.0 src找其他方法拦截rdtsc指令,我发现

target-i386/translate.c 中的 rdtsc 线索。我在那里添加了一个 printf,但我什么也没得到。所以我

不知道有没有人可以给我一些突破的指导。非常感谢~

0 投票
2 回答
370 浏览

linux - 比较物理硬件和基于 kvm 的 VM 时遇到奇怪的 rdtsc 行为

我有以下问题。我在 Linux 机器上运行了几次压力测试

它是 Intel i5 Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz,8 G RAM,300 G HDD。

这些测试不是 I/O 密集型的,我主要通过以下方式计算双重算术:

我多次重复这些测试,在物理机或基于 KVM 的 VM 上运行我的基准测试应用程序:

我为许多试验收集数据统计信息(即差异)。对于物理机(未加载),我得到的处理延迟的数据分布很可能是一个非常窄的对数正态分布。

当我在虚拟机上重复实验时(物理机和虚拟机都没有加载),对数正态分布仍然存在(形状有点宽),但是,我收集了一些完成时间短得多的点(大约两倍)比为物理机收集的绝对最小值!(请注意,物理机上的完成时间分布非常窄,接近最小值)。还有一些点的完成时间比硬件机器上的平均完成时间长得多。

我想我的 rdtsc 基准测试方法对于 VM 环境不是很准确。您能否建议一种改进我的基准测试系统的方法,该系统可以在物理和基于 kvm 的虚拟环境之间提供可靠(可比较)的统计信息?至少在某些情况下,这不会告诉我 VM 在少数情况下比硬件 PC 快 2 倍。

提前感谢您对此主题的任何建议或意见。

此致

0 投票
2 回答
362 浏览

c - 使用 RDTSC 的 nanosleep 循环计数

我正在尝试查看 1 纳秒在我的笔记本电脑上需要多少个周期。

笔记本电脑配置:

  1. 处理器:Intel Centrino Duo 2.0 GHz (T7200)
  2. 内存:2 GB

以下是计数:

  1. 1 秒需要:1995198000(接近 20 亿滴答声,可以)
  2. 1 毫秒:2,159,460(接近 200 万,可以)
  3. 1 微秒:507,408(为什么?)
  4. 1 纳秒:139,000(为什么?)

直到 1 微秒,滴答声与频率一致。然而,在这之下,它不是。此外,我可以可靠地使用循环计数来区分 100 纳秒和 200 纳秒,而不是低于此值。

测量设置:

  1. 测量过程连接到一个处理器。
  2. 进程的优先级设置为最高。
  3. CPU 设置为始终以最高频率运行。

谁能解释原因?是因为睡眠(我使用的是 nanosleep)以这种方式实现的。?

0 投票
1 回答
626 浏览

c++ - RDTSC 在 Ubuntu 中运行缓慢

我有一个用 clang++ 编译的内联程序集:

在 OSX 上,上述检查的总成本rdtsc约为 10-20 个周期。当我在 Linux(不是虚拟机)上编译相同的代码时,大约需要 2500 个周期。这让我怀疑 Linux 正在做一些愚蠢的事情,比如在用户空间中禁用 RDTSC。从这些文章中,看起来至少已经为 Linux 考虑了这一点:

我正在运行 Ubuntu 14.04

问题:

  • 内核模式是否只是rdtsc真正进入了 Ubuntu 内核?
  • 如果存在,我如何检测当前设置?
  • 以及如何让用户模式rdtsc再次工作?

PS:我完全意识到 rdtsc 的测量错误、管道冲洗等问题。我可以忍受它们,并且我会在需要的地方采取预防措施。我只希望 rdtsc 快。