问题标签 [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.
c - _mm_lfence() 时间开销是不确定的?
我正在尝试确定读取元素以确保它是缓存命中或缓存未命中所需的时间。为了阅读顺序,我使用 _mm_lfence() 函数。我得到了意想不到的结果,检查后我发现 lfence 函数的开销不是确定性的。因此,我正在执行程序,该程序在例如 100 000 次迭代的循环中测量此开销。我在一次迭代中得到超过 1000 个时钟周期的结果,下一次是 200 个。lfence 函数开销之间存在这种差异的原因可能是什么,如果它如此不可靠,我如何才能正确判断缓存命中和缓存未命中的延迟?我试图使用与这篇文章相同的方法:内存延迟测量与时间戳计数器
给出不可靠结果的代码是这样的:
arr 中的值在不同的范围内变化,arr_size 为 100 000。
optimization - NASM 中的 RDTSCP 总是返回相同的值(定时单条指令)
我在 NASM 中使用 RDTSC 和 RDTSCP 来测量各种汇编语言指令的机器周期,以帮助优化。
我阅读了英特尔 Gabriele Paoloni 撰写的“如何在英特尔 IA-32 和 IA-64 指令集架构上对代码执行时间进行基准测试”(2010 年 9 月)和其他网络资源(其中大部分是 C 语言示例)。
使用下面的代码(从 C 翻译),我测试了各种指令,但 RDTSCP 在 RDX 中总是返回零,在 RAX 中总是返回 7。我首先认为 7 是周期数,但显然并非所有指令都需要 7 个周期。
这将返回 7,这并不奇怪,因为在某些架构中,adddd 是 7 个周期,其中包括延迟。前两条指令可以(根据某些)颠倒过来,先是 cpuid,然后是 rdtsc,但这在这里没有区别。
当我将指令更改为 2 周期指令时:
这也会在 rax 中返回 7,在 rdx 中返回 0。
所以我的问题是:
如何访问和解释 RDX:RAX 中返回的值?
为什么 RDX 总是返回零,它应该返回什么?
更新:
如果我将代码更改为:
我在 rax 中得到 64,但这听起来像太多的周期。
c++ - rdtsc乱序执行的解决方案?
我正在尝试用 rdtsc 替换 clock_gettime(CLOCK_REALTIME, &ts) 以根据 cpu 周期而不是服务器时间来基准代码执行时间。基准测试代码的执行时间对软件至关重要。我曾尝试在 x86_64 3.20GHz ubuntu 机器上的独立内核上运行代码,并得到以下数字:
案例 1:时钟获取时间: 24 纳秒
案例 2:rdtsc(没有 mfence 和编译器屏障): 10 ns
案例 3:rdtsc(带有 mfence 和编译器屏障): 30 ns
这里的问题是我知道 rdtsc 是一个非序列化调用,并且可以由 CPU 重新排序,另一种选择是 rdtscp,它是一个序列化调用,但 rdtscp 调用之后的指令可以在 rdtscp 调用之前重新排序。使用内存屏障会增加执行时间。
- 对延迟敏感代码进行基准测试的最优化和最佳方法是什么?
- 有没有优化我提到的案例?
benchmarking - 我在测试模块的循环数时,每次测试的结果都大相径庭。
我在测试模块的循环数时,每次测试的结果都大不相同?</p>
我use __rdtsc()
记录周期,并使用AVX512内在。</p>
有什么方法可以使每次测试的循环数基本一致吗?
x86 - 不同的进程可以同时运行 RDTSC 吗?
不同的进程可以同时运行RDTSC吗?或者这是只有一个核心可以同时操作的资源?TSC 在每个核心中(至少您可以为每个核心单独调整它),所以应该可以。但是超级踩踏呢?
我该如何测试呢?
c - RDTSC 和系统调用,sys_read 和 sys_write
我正在尝试使用 rdtsc 计算使用 sys_write 写入内容需要多少个周期。我能够测试 printf 和 scanf 函数。它们工作正常,现在我遇到了系统调用问题。
在我看来,问题出在 %eax 和 %edx 寄存器上,因为 rdtsc 将结果保存在这些寄存器中。
写.s
rdtsc.s
主程序
当我运行程序时,我得到一个分段错误(核心转储)错误。
c++ - "rdtsc": "=a" (a0), "=d" (d0) 这是做什么的?
我是 C++ 和基准测试的新手
我不明白这部分代码的作用是什么?所以我发现了一些关于 edx、eax 寄存器的信息,但我不完全理解它是如何影响代码的。所以我理解这段代码本质上是返回 cpu 周期的当前刻度。那么,它是否将当前滴答存储到寄存器中,一部分在 hi 中,另一部分在 lo 中。而且,“=a”和“=d”是否指定将其存储在哪个寄存器中。
以及把它分成两部分有什么意义。
上下文中的代码:
c - 测量矩阵乘法参数的程序错误
我正在编写一个程序来测量矩阵乘法的性能rdtsc()
,读取时间戳计数器。
但是,当我结合矩阵乘法程序和性能测量程序时,出现了错误。
如果您能告诉我如何更改我当前的调试代码,我将不胜感激。
环境:macOS Mojave 版本 10.14.5,终端 2.9.5
当我执行矩阵乘法程序本身时matrixmul.c
,编译成功并且输出正确。但是,如果我添加性能测量,它无法编译。
这是matrixmul.c
:
输出:
这是measurement.c
:
这是rdtsc.h
(该程序位于同一文件夹中measurement.c
):
输出:
答案后试用
我已经修复了我的代码并再次执行它,但我仍然有一个错误。错误信息
测量.c
rdtsc.h
assembly - 多条 nop 指令不会始终比单条 nop 指令花费更长的时间
我在 C++ 中计时多个 NOP 指令和单个 NOP 指令,使用rdtsc
. 但是,我没有得到执行 NOP 所需的周期数与执行的 NOP 数量成比例的增加。我很困惑为什么会这样。我的 CPU 是 Intel Core i7-5600U @ 2.60Ghz。
这是代码:
我得到的值如下:
在未设置处理器亲和性的情况下运行时。设置处理器亲和性$ taskset -c 0 ./nop$
时,结果是:
为什么会这样?
c++ - 为了同步两个进程,使计时器在 C++ 进程中的特定时间关闭
我在 C++ 中有两个进程(这些不是父进程和子进程)。每个都使用taskset
. 因此,例如,进程 1 被固定到核心 0,进程 2 被固定到核心 1。我想在相同的确切时间开始运行它们(精确到微秒)。
timer_create
允许某些代码以指定的频率执行。但是,它没有提供在特定时间启动的机制。配置开始时间的最佳方法是什么,以便两个进程中的一段代码在该特定时间开始,然后以特定频率重复?