问题标签 [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 - 如何确保我的程序从头到尾不间断地运行?
我正在尝试在 Ubuntu 8.10 上使用 RDTSC(我尝试过的其他分析软件无法达到我需要的分辨率)来计时代码。但是,我不断收到来自任务切换和中断触发的异常值,这导致我的统计数据无效。
考虑到我的程序在几毫秒内运行,是否可以在我的环境中禁用所有中断(这会固有地关闭任务开关)?还是我需要去一个可以让我拥有更多权力的操作系统?使用我自己的操作系统内核来执行这个计时代码会更好吗?我试图证明算法的最佳/最差情况性能,因此它必须完全符合时间要求。
我目前使用的相关代码是:
给那些注意到我没有正确处理此代码中的溢出条件的人加分。在这个阶段,我只是想获得一致的输出,而不会因为我的程序丢失时间片而突然跳跃。
我的程序的好值是-20。
回顾一下,我是否可以在不中断操作系统的情况下运行此代码?还是我需要在 ring0 的裸硬件上运行它,这样我才能禁用 IRQ 和调度?提前致谢!
assembly - 如何在多核处理器上进行基准测试
我正在寻找在多核处理器上执行微基准测试的方法。
语境:
几乎与此同时,桌面处理器引入了让性能难以预测的乱序执行,也许并非巧合,它们还引入了特殊指令来获得非常精确的时序。这些指令的示例rdtsc
在 x86 和rftb
PowerPC 上。这些指令给出的时间比系统调用所允许的更精确,允许程序员对他们的心进行微基准测试,无论好坏。
在具有多个内核的更现代的处理器上,其中一些内核有时会休眠,计数器在内核之间不同步。我们被告知rdtsc
不再安全地用于基准测试,但是当我们被解释替代解决方案时,我一定是在打瞌睡。
问题:
一些系统可能会保存和恢复性能计数器,并提供 API 调用来读取正确的总和。如果您知道此调用适用于任何操作系统,请在答复中告知我们。
一些系统可能允许关闭核心,只留下一个运行。我知道 Mac OS X Leopard 在从开发人员工具安装正确的首选项窗格时会这样做。你认为这可以rdtsc
安全地再次使用吗?
更多背景:
请假设我在尝试进行微基准测试时知道自己在做什么。如果您认为如果优化的收益不能通过计时整个应用程序来衡量,那么不值得优化,我同意您的观点,但是
在替代数据结构完成之前,我无法为整个应用程序计时,这需要很长时间。事实上,如果微基准没有希望,我现在可以决定放弃实施;
我需要在我无法控制截止日期的出版物中提供数据。
assembly - “rdtsc”之前的“cpuid”
有时我会遇到使用指令读取 TSC 的代码,但在此之前rdtsc
调用。cpuid
为什么需要打电话cpuid
?我意识到这可能与具有 TSC 值的不同内核有关,但是当您按顺序调用这两条指令时究竟会发生什么?
linux - 跨 CPU 内核的 rdtsc 精度
我正在从一个线程发送网络数据包,并在运行在不同 CPU 内核上的第二个线程上接收回复。我的过程测量每个数据包的发送和接收之间的时间(类似于 ping)。我正在使用 rdtsc 来获得高分辨率、低开销的时序,这是我的实现所需要的。
所有的测量看起来都很可靠。尽管如此,我还是担心跨内核的 rdtsc 准确性,因为我一直在阅读一些暗示 tsc 在内核之间不同步的文本。
我在维基百科中找到了以下关于TSC 的信息
恒定的 TSC 行为确保每个时钟滴答的持续时间是一致的,并支持将 TSC 用作挂钟计时器,即使处理器内核改变频率。这是面向所有英特尔处理器的架构行为。
我仍然担心跨核心的准确性,这是我的问题
更多信息
- 我在 Intel nehalem 机器上运行我的进程。
- 操作系统是Linux。
- 为所有内核设置了“ constant_tsc ” cpu 标志。
c - C/C++ Linux x86_64 中基于 CPU 周期计数的分析
我正在使用以下代码来分析我的操作,以优化我的函数中采用的 cpu 周期。
我认为这不是最好的,因为即使连续两次通话也给我带来了“33”的差异。有什么建议么 ?
linux - 时间戳计数器
我通过查询寄存器在我的 C++ 程序中使用时间戳计数器。但是,我遇到的一个问题是获取时间戳的函数会从不同的 CPU 获取。如何确保我的函数始终从同一个 CPU 获取时间戳,或者无论如何要同步 CPU?顺便说一句,我的程序在 Fedora 13 64 位的 4 核服务器上运行。
谢谢。
profiling - 如何检测 RDTSC 是否返回恒定速率计数器值?
似乎 AMD 和 Intel 的大多数较新的 CPU 都将 rdtsc 实现为恒定速率计数器,从而避免了由于 TurboBoost 或省电设置等因素而导致频率变化的问题。
由于 rdtsc 比 QueryPerformanceCounter 更适合性能测量,因为它的开销要低得多,所以我想尽可能使用它。
如何可靠地检测 rdtsc 是否是恒定速率计数器?
assembly - 在 16 位 Turbo Pascal 中访问高性能计数器
我正在尝试在 WinXP DOS 框中运行的 16 位 Turbo Pascal 7 程序(不要问...)中使用高性能计数器。我可以使用内联 $0F、$31 执行 RDTSC 指令,并且将 AX 和 DX 的内容设置为看起来合理的值,但是如何访问 EAX、EDX 的上半部分并将结果写入 2 个长字全局变量?
opcode - PPC 的 rdtsc 操作码相当于什么?
我有一个包含以下代码的汇编程序。这段代码可以很好地编译为英特尔处理器。但是,当我使用 PPC(交叉)编译器时,我收到一个错误,即无法识别操作码。我正在尝试查找 PPC 架构是否有等效的操作码。
c++ - RDTSC 开销的差异
当我在一些原始图像处理操作中尝试使用 SIMD 指令内在函数时,我正在构建一个微基准来测量性能变化。然而,编写有用的微基准很困难,所以我想首先了解(如果可能的话,消除)尽可能多的变化和错误来源。
我必须考虑的一个因素是测量代码本身的开销。我正在使用 RDTSC 进行测量,并且正在使用以下代码来查找测量开销:
运行此代码时,我得到如下输出:
我的问题是:
- 上面代码生成的循环计数双峰分布的可能原因是什么?
- 为什么最快的时间(234 个周期)只出现少数几次——什么极不寻常的情况会减少计数?
更多的信息
平台:
- Linux 2.6.32 (Ubuntu 10.04)
- g++ 4.4.3
- 酷睿 2 双核 (E6600);这具有恒定速率 TSC。
SpeedStep 已关闭(处理器设置为性能模式并以 2.4GHz 运行);如果在“按需”模式下运行,我会在 243 和 252 个周期处获得两个峰值,在 360 和 369 个周期处有两个(可能是相应的)峰值。
我sched_setaffinity
用来将进程锁定到一个核心。如果我在每个内核上依次运行测试(即锁定到内核 0 并运行,然后锁定到内核 1 并运行),我得到两个内核的相似结果,除了 234 个周期的最快时间往往会稍微出现核心 1 上的次数少于核心 0 上的次数。
编译命令为:
GCC 为核心循环生成的代码是: