rdtsc相关内容

如何检测 RDTSC 是否返回恒定速率计数器值?

似乎来自 AMD 和 Intel 的大多数较新的 CPU 都将 rdtsc 实现为恒定速率计数器,从而避免了由于 TurboBoost 或省电设置等因素导致的频率变化引起的问题. 由于 rdtsc 比 QueryPerformanceCounter 更适合用于性能测量,因为它的开销要低得多,我想尽可能使用它. 如何可靠地检测 rdtsc 是否为恒定速率计数器? 解决方案 你可以 ..
发布时间:2021-11-25 05:41:27 C#

函数 __asm__ __volatile__(“rdtsc");

我不知道这段代码到底是做什么的: int rdtsc(){__asm__ __volatile__("rdtsc"); 拜托,有人能解释一下吗?为什么是“rdtsc"? 解决方案 实际上,这根本不是很好的代码. RDTSC 是 x86 指令“读取时间戳计数器" - 它读取一个 64 位计数器,该计数器在处理器的每个时钟周期计数. 但由于它是一个 64 位数字,所以它存储在 ..
发布时间:2021-09-29 19:36:01 其他开发

如何保证RDTSC是准确的?

我已经读到 RDTSC 可以提供错误的读数,不应依赖. 这是真的吗?如果是这样,我们可以做些什么? 解决方案 非常老的 CPU 有一个准确的 RDTSC. 问题 但是较新的 CPU 有问题. 工程师们认为 RDTSC 非常适合告诉时间. 但是,如果 CPU 限制频率,则 RDTSC 将无法告诉时间. 前面提到的脑残工程师决定通过让 TSC 始终以相同频率运行来“解决"这 ..
发布时间:2021-09-29 19:34:21 其他开发

使用时间戳计数器和 clock_gettime 进行缓存未命中

作为此主题的后续,为了计算内存未命中延迟,我使用 _mm_clflush、__rdtsc 和 _mm_lfence(基于以下代码)编写了以下代码这个问题/答案). 正如您在代码中看到的,我首先将数组加载到缓存中.然后我刷新一个元素,因此缓存行从所有缓存级别中逐出.我把 _mm_lfence 放在 -O3 期间为了保持顺序. 接下来,我使用时间戳计数器来计算延迟或读取array[0].如 ..
发布时间:2021-09-29 19:30:07 其他开发

NASM 中的 RDTSCP 总是返回相同的值(对单个指令进行计时)

我在 NASM 中使用 RDTSC 和 RDTSCP 来测量各种汇编语言指令的机器周期以帮助优化. 我阅读了英特尔的 Gabriele Paoloni(2010 年 9 月)所著的“如何对英特尔 IA-32 和 IA-64 指令集架构上的代码执行时间进行基准测试"以及其他网络资源(其中大部分是 C 语言的示例). 使用下面的代码(从 C 翻译),我测试了各种指令,但 RDTSCP 在 ..
发布时间:2021-06-07 18:40:47 其他开发

"rdtsc":"= a"(a0),"= d"表示(d0)这是做什么的?

我是C ++和基准测试的新手 我不明白这段代码的作用是什么?因此,我找到了一些有关edx,eax寄存器的信息,但我不完全了解它如何在代码中发挥作用.所以我理解这段代码本质上返回了cpu周期的当前滴答声.因此,它将当前滴答存储在寄存器中,一部分存储在hi中,另一部分存储在lo中.并且,"= a"和"= d"是否指定了将其存储在哪个寄存器中. 将其分为两部分的意义何在? "rdtsc": ..
发布时间:2021-05-16 18:34:50 其他开发

如何在Visual C ++中检测rdtscp支持?

我在MSVC 2012上运行了一段代码: #include #include UINT64 gettime() { try { unsigned int ui; return __rdtscp(&ui); } catch (...) { return __rdtsc(); } } 我试图使用__rdt ..
发布时间:2020-11-30 04:54:39 其他开发

从KVM中的来宾VM用户空间拦截rdtsc指令

我被标题所困扰,我想通过在VMM中添加 setup_vmcs_config 函数中vmx.c(arch/x86/kvm)中的 CPU_BASED_RDTSC_EXITING 标志和 然后自己处理vm_exit(请参阅:邮件列表).问题是我不能 告诉rdtsc的vm_exit是由来宾内核还是来宾vm用户引起的 空间应用程序,后一个正是我要拦截的内容.我尝试搜索 通过qe ..
发布时间:2020-11-29 20:12:56 其他开发

有没有比cpuid更便宜的序列化指令?

我已经看到了相关的问题,包括此处和不幸的是,cpuid在我的系统上花费了大约1000个周期,所以我想知道是否有人知道更便宜的(更少的周期并且没有对内存的读写操作)序列化指令吗? 我看着iret,但这似乎改变了控制流程,这也是不可取的. 我实际上看过Alex关于rstscp的答案中链接的白皮书,但它说: RDTSCP指令等待,直到所有先前的指令都已被执行 在读取计数器之前执行. 但 ..
发布时间:2020-11-29 20:08:26 其他开发

包括对RDTSCP的支持的gcc cpu类型是什么?

我正在使用RDTSCP替换LFENCE; RDTSC序列,并且还获得了处理器ID,这样我就知道在将线程重新安排到另一个CPU之后比较TSC值的情况. 为确保我不会在太旧的计算机上运行RDTSCP,在进行CPUID检查(使用libcpuid)后,我将回退到RDTSC.我想尝试使用gcc多目标属性功能代替CPUID调用: int core2_func (void) __attribute_ ..
发布时间:2020-11-12 22:40:07 其他开发

(rdtsc + lfence + rdtsc)和(rdtsc + rdtscp)在测量执行时间上有什么区别吗?

据我所知,相对于rdtsc和rdtscp指令,处理器中运行时顺序的主要区别在于执行是否要等到所有先前的指令都在本地执行后才能执行。 换句话说,这意味着lfence + rdtsc = rdtscp,因为在rdtsc指令之前的lfence使以下rdtsc在本地所有前一条指令完成之后执行。 但是,我看到了一些示例代码,这些代码在测量开始时使用rdtsc,在测量开始时使用rdtscp。使用两 ..
发布时间:2020-10-11 00:09:34 其他开发

在英特尔上丢了周期? rdtsc和CPU_CLK_UNHALTED.REF_TSC之间不一致

在最近的CPU(至少最近十年左右)上,英特尔提供了三个固定功能的硬件性能计数器,以及各种可配置的性能计数器。这三个固定计数器是: INST_RETIRED.ANY CPU_CLK_UNHALTED.THREAD CPU_CLK_UNHALTED.REF_TSC 第一个计数退休指令,第二个计数实际周期,最后一个是我们感兴趣的。英特尔软件开发人员手册第3卷的描述是: ..
发布时间:2020-10-11 00:00:07 其他开发

如何从C ++获取x86_64中的CPU周期计数?

我在SO上看到了此帖子,其中包含C代码以获取最新的CPU周期计数: 在C / C ++ Linux x86_64中基于CPU周期计数的分析 有没有一种方法可以在C ++中使用此代码(欢迎使用Windows和Linux解决方案)?尽管是用C语言编写的(并且C是C ++的子集),但我不太确定此代码是否可以在C ++项目中使用,否则,如何翻译? 我正在使用x86-64 EDIT2 ..
发布时间:2020-09-26 20:33:16 其他开发

有什么方法可以触发RDTSC的旧模式?

我重写了整个问题,人们显然不明白. RDTSC用于计数CPU周期,并且随CPU节流而变化. 当前,RDTSC不会随CPU限制而变化. 一些旧的应用程序,期望RDTSC随CPU节流而变化. 我如何使RDTSC给予他们期望的结果? 我不想分析代码,我不想重写大量代码,我不想强​​迫用户弄乱BIOS或内核权限,我只想让旧版应用程序像他们应该. 解决方案 简而言之,轻 ..
发布时间:2020-09-13 00:46:05 其他开发

如何使用rdtsc在Qemu i386系统中进行基准测试

当前,我正在尝试测量在同一环境中由两种不同的编程语言完成一个操作所花费的时钟周期数. (无需使用操作系统) 目前,我正在使用Qemu-i386仿真器并使用rdtsc测量时钟周期. /* Return the number of CPU ticks since boot. */ static inline u64 rdtsc(void) { u32 hi, lo; // ..
发布时间:2020-09-12 23:41:24 其他开发

不变的不变tsc可以在cpu状态之间改变频率吗?

我曾经使用rdtsc对Linux系统调用进行基准测试,以获取系统调用前后的计数器差异.我将结果解释为墙上时钟计时器,因为TSC以恒定速率递增,并且在进入暂停状态时不会停止. 不变TSC概念描述为 不变的TSC将在所有ACPI P-,C-中以恒定速率运行.和 T状态. 将状态从C0(正在运行)更改为C1(已暂停)时,常量非不变 tsc可以更改频率吗? 我目前的观点是,它不能仅 ..
发布时间:2020-09-12 22:52:06 其他开发

英特尔的时间戳读取asm代码示例是否使用了两个不必要的寄存器?

我正在研究使用x86 CPU中的时间戳寄存器(TSR)来衡量基准性能.这是一个有用的寄存器,因为它以不受时钟影响的单调时间单位进行测量 速度变化.很酷. 这是一份英特尔文档,其中显示了使用TSR(包括使用cpuid进行管道同步)可靠地进行基准测试的asm代码片段.参见第16页: http://www.intel.com/content/www/us/en/embedded/traini ..
发布时间:2020-09-12 21:46:02 其他开发

使用rdtsc计算系统时间

假定CPU中的所有内核具有相同的频率,从技术上讲,我可以每毫秒左右为每个内核同步系统时间和时间戳计数器对.然后基于当前运行的内核,我可以获取当前的rdtsc值,并使用滴答增量除以内核频率,从而能够估计自上次同步系统时间和时间戳以来经过的时间计数器对并推算当前系统时间,而不会从我当前线程中产生系统调用的开销(假设不需要锁即可检索上述数据). 从理论上讲,这很有效,但是在实践中,我发现有时候我会得到比 ..
发布时间:2020-09-12 21:35:36 其他开发

背对背rdtsc的负时钟周期测量?

我正在编写一个C代码,用于测量获取信号量所需的时钟周期数.我正在使用rdtsc,在对信号量进行测量之前,我连续两次调用rdtsc来测量开销.我在for循环中重复了很多次,然后将平均值用作rdtsc开销. 首先使用平均值是正确的吗? 尽管如此,这里最大的问题是有时候我得到的开销为负值(不一定是平均值,而是至少是for循环内的部分值). 这也会影响对sem_wait()操作所需的cp ..
发布时间:2020-07-02 04:47:22 其他开发

NASM中的RDTSCP始终返回相同的值

我正在NASM中使用RDTSC和RDTSCP来测量机器周期,以获得各种汇编语言指令,以帮助优化. 我读了Intel的Gabriele Paoloni撰写的“如何在Intel IA-32和IA-64指令集体系结构上对代码执行时间进行基准测试"(2010年9月)和其他Web资源(其中大多数是C语言中的示例). 使用下面的代码(从C转换),我测试了各种指令,但是RDTSCP在RDX中始终返回 ..
发布时间:2020-05-16 21:02:40 其他开发