rdtsc相关内容

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

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

rdtscp、rdtsc 之间的区别:内存和 cpuid/rdtsc?

假设我们正在尝试使用 tsc 进行性能监控,并且我们希望防止指令重新排序. 这些是我们的选择: 1: rdtscp 是一个序列化调用.它可以防止对 rdtscp 的调用重新排序. __asm__ __volatile__("rdtscp; "//tsc 的序列化读取"shl $32,%%rdx; "//上移存储在 rdx 中的高 32 位"or %%rdx,%%rax"//和或到 r ..
发布时间:2021-12-18 09:06:13 C/C++开发

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

我在 SO 上看到了这篇文章,其中包含用于获取最新 CPU 周期计数的 C 代码: C/C++ 中基于 CPU 周期计数的分析Linux x86_64 有什么方法可以在 C++ 中使用此代码(欢迎使用 windows 和 linux 解决方案)?尽管用 C 编写(并且 C 是 C++ 的子集),但我不太确定这段代码是否可以在 C++ 项目中运行,如果不能,如何翻译它? 我使用的是 ..
发布时间:2021-12-01 14:58:36 C/C++开发

如何检测 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 C/C++开发

如何保证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 C/C++开发

从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 其他开发

如何从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 C/C++开发

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

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