问题标签 [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.
linux - 时间是怎么计算的?
为了计算时间我们通常使用系统调用,但是如果我想自己实现呢,有可能吗?Usingrdtsc
给了我从我们打开它开始的 cpu 时钟数量。仍然无法计算时间,因为为此我们需要 CPU 频率。基本问题是,在我看来,不仅我测量的 cpu 频率与我看到的不同,/proc/cpuinfo
而且它也会随着时间的推移而变化(超频和超频)。那么系统调用是如何实现的呢?
我正在寻找的解决方案框架是通过查看一些初始时间 t0、自 t0 以来的 cpu 时钟数量(使用rdtsc
)和 cpu 频率来计算时间。就像是
c++ - 函数 __asm__ __volatile__("rdtsc");
我不知道这段代码到底是做什么的:
拜托,有人可以解释一下吗?为什么是“rdtsc”?
c++ - 如何以最小的延迟依次调用两个函数?
我实现了一个返回时间的快速函数(使用 rdtsc),我们称之为fast_time()
。我有参考使用系统调用的原始函数,我们称之为system_time()
。我的程序使用fast_time()
但在一个单独的线程中,我不断地运行一个 while 循环来检查从 my 函数返回的时间与原始函数之间的差异是否大于预定义的阈值。就像是
通常我看不到错误,但有时我确实得到了错误,我想更好地理解这个问题。我的第一个怀疑是调用system_time()
不会在fast_time()
返回后立即发生。如何强制程序尽可能fast_time() - system_time()
“原子地”执行?
c++ - 为什么 rdtscp 不返回核心 ID?
我有这个代码
它定义了一个函数 rdtscp,它使用内联汇编来调用 rdtscp 汇编指令。TSC 值看起来不错,但核心 id 始终为零,即使 sched_getcpu() 返回了正确的核心 id 并且它不为零。输出看起来像
如何使用 rdtscp 获取 TSC 和核心 ID?
c++ - 如何检测 Visual C++ 中的 rdtscp 支持?
我在 MSVC 2012 上运行了一段代码:
我试图使用 __rdtscp() 来获取时间戳;但是,在不支持 __rdtscp() 的平台上,我想改用 __rdtsc() 。
上面的代码不起作用;如果不支持 __rdtscp()(在某些 VM 上),程序就会崩溃。那么有什么方法可以检测 __rdtscp() 是否受支持,但不会导致程序崩溃?
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 与方法 2 的比例非常一致,而其他的则不然。即,0.016489/0.533603 = 0.020374/0.659265。假设
gettimeofday()
足够准确,该rdtsc
方法表现出“不变”特性。(是的,我从互联网上了解到,当前一代的英特尔 CPU 具有此功能rdtsc
。)方法 3 的报告高于方法 2。我猜它与 TSC 有所不同。但它是什么?
方法4是最令人困惑的一种。它报告的数字比方法 2 和 3 大一个数量级。它不应该也是一种循环计数吗?更不用说它带有“不变”的名称了。
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,但我什么也没得到。所以我
不知道有没有人可以给我一些突破的指导。非常感谢~
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 倍。
提前感谢您对此主题的任何建议或意见。
此致
c - 使用 RDTSC 的 nanosleep 循环计数
我正在尝试查看 1 纳秒在我的笔记本电脑上需要多少个周期。
笔记本电脑配置:
- 处理器:Intel Centrino Duo 2.0 GHz (T7200)
- 内存:2 GB
以下是计数:
- 1 秒需要:1995198000(接近 20 亿滴答声,可以)
- 1 毫秒:2,159,460(接近 200 万,可以)
- 1 微秒:507,408(为什么?)
- 1 纳秒:139,000(为什么?)
直到 1 微秒,滴答声与频率一致。然而,在这之下,它不是。此外,我可以可靠地使用循环计数来区分 100 纳秒和 200 纳秒,而不是低于此值。
测量设置:
- 测量过程连接到一个处理器。
- 进程的优先级设置为最高。
- CPU 设置为始终以最高频率运行。
谁能解释原因?是因为睡眠(我使用的是 nanosleep)以这种方式实现的。?
c++ - RDTSC 在 Ubuntu 中运行缓慢
我有一个用 clang++ 编译的内联程序集:
在 OSX 上,上述检查的总成本rdtsc
约为 10-20 个周期。当我在 Linux(不是虚拟机)上编译相同的代码时,大约需要 2500 个周期。这让我怀疑 Linux 正在做一些愚蠢的事情,比如在用户空间中禁用 RDTSC。从这些文章中,看起来至少已经为 Linux 考虑了这一点:
我正在运行 Ubuntu 14.04
问题:
- 内核模式是否只是
rdtsc
真正进入了 Ubuntu 内核? - 如果存在,我如何检测当前设置?
- 以及如何让用户模式
rdtsc
再次工作?
PS:我完全意识到 rdtsc 的测量错误、管道冲洗等问题。我可以忍受它们,并且我会在需要的地方采取预防措施。我只希望 rdtsc 快。