问题标签 [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.

0 投票
7 回答
1449 浏览

c - 如何确保我的程序从头到尾不间断地运行?

我正在尝试在 Ubuntu 8.10 上使用 RDTSC(我尝试过的其他分析软件无法达到我需要的分辨率)来计时代码。但是,我不断收到来自任务切换和中断触发的异常值,这导致我的统计数据无效。

考虑到我的程序在几毫秒内运行,是否可以在我的环境中禁用所有中断(这会固有地关闭任务开关)?还是我需要去一个可以让我拥有更多权力的操作系统?使用我自己的操作系统内核来执行这个计时代码会更好吗?我试图证明算法的最佳/最差情况性能,因此它必须完全符合时间要求。

我目前使用的相关代码是:

给那些注意到我没有正确处理此代码中的溢出条件的人加分。在这个阶段,我只是想获得一致的输出,而不会因为我的程序丢失时间片而突然跳跃。

我的程序的好值是-20。

回顾一下,我是否可以在不中断操作系统的情况下运行此代码?还是我需要在 ring0 的裸硬件上运行它,这样我才能禁用 IRQ 和调度?提前致谢!

0 投票
2 回答
1500 浏览

assembly - 如何在多核处理器上进行基准测试

我正在寻找在多核处理器上执行微基准测试的方法。

语境:

几乎与此同时,桌面处理器引入了让性能难以预测的乱序执行,也许并非巧合,它们还引入了特殊指令来获得非常精确的时序。这些指令的示例rdtsc在 x86 和rftbPowerPC 上。这些指令给出的时间比系统调用所允许的更精确,允许程序员对他们的心进行微基准测试,无论好坏。

在具有多个内核的更现代的处理器上,其中一些内核有时会休眠,计数器在内核之间不同步。我们被告知rdtsc不再安全地用于基准测试,但是当我们被解释替代解决方案时,我一定是在打瞌睡。

问题:

一些系统可能会保存和恢复性能计数器,并提供 API 调用来读取正确的总和。如果您知道此调用适用于任何操作系统,请在答复中告知我们。

一些系统可能允许关闭核心,只留下一个运行。我知道 Mac OS X Leopard 在从开发人员工具安装正确的首选项窗格时会这样做。你认为这可以rdtsc安全地再次使用吗?

更多背景:

请假设我在尝试进行微基准测试时知道自己在做什么。如果您认为如果优化的收益不能通过计时整个应用程序来衡量,那么不值得优化,我同意您的观点,但是

  1. 在替代数据结构完成之前,我无法为整个应用程序计时,这需要很长时间。事实上,如果微基准没有希望,我现在可以决定放弃实施;

  2. 我需要在我无法控制截止日期的出版物中提供数据。

0 投票
3 回答
4251 浏览

assembly - “rdtsc”之前的“cpuid”

有时我会遇到使用指令读取 TSC 的代码,但在此之前rdtsc调用。cpuid

为什么需要打电话cpuid?我意识到这可能与具有 TSC 值的不同内核有关,但是当您按顺序调用这两条指令时究竟会发生什么?

0 投票
6 回答
23567 浏览

linux - 跨 CPU 内核的 rdtsc 精度

我正在从一个线程发送网络数据包,并在运行在不同 CPU 内核上的第二个线程上接收回复。我的过程测量每个数据包的发送和接收之间的时间(类似于 ping)。我正在使用 rdtsc 来获得高分辨率、低开销的时序,这是我的实现所需要的。

所有的测量看起来都很可靠。尽管如此,我还是担心跨内核的 rdtsc 准确性,因为我一直在阅读一些暗示 tsc 在内核之间不同步的文本。

我在维基百科中找到了以下关于TSC 的信息

恒定的 TSC 行为确保每个时钟滴答的持续时间是一致的,并支持将 TSC 用作挂钟计时器,即使处理器内核改变频率。这是面向所有英特尔处理器的架构行为。

我仍然担心跨核心的准确性,这是我的问题

更多信息

  • 我在 Intel nehalem 机器上运行我的进程。
  • 操作系统是Linux。
  • 为所有内核设置了“ constant_tsc ” cpu 标志。
0 投票
7 回答
19559 浏览

c - C/C++ Linux x86_64 中基于 CPU 周期计数的分析

我正在使用以下代码来分析我的操作,以优化我的函数中采用的 cpu 周期。

我认为这不是最好的,因为即使连续两次通话也给我带来了“33”的差异。有什么建议么 ?

0 投票
3 回答
4884 浏览

linux - 时间戳计数器

我通过查询寄存器在我的 C++ 程序中使用时间戳计数器。但是,我遇到的一个问题是获取时间戳的函数会从不同的 CPU 获取。如何确保我的函数始终从同一个 CPU 获取时间戳,或者无论如何要同步 CPU?顺便说一句,我的程序在 Fedora 13 64 位的 4 核服务器上运行。

谢谢。

0 投票
4 回答
2455 浏览

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

似乎 AMD 和 Intel 的大多数较新的 CPU 都将 rdtsc 实现为恒定速率计数器,从而避免了由于 TurboBoost 或省电设置等因素而导致频率变化的问题。

由于 rdtsc 比 QueryPerformanceCounter 更适合性能测量,因为它的开销要低得多,所以我想尽可能使用它。

如何可靠地检测 rdtsc 是否是恒定速率计数器?

0 投票
2 回答
599 浏览

assembly - 在 16 位 Turbo Pascal 中访问高性能计数器

我正在尝试在 WinXP DOS 框中运行的 16 位 Turbo Pascal 7 程序(不要问...)中使用高性能计数器。我可以使用内联 $0F、$31 执行 RDTSC 指令,并且将 AX 和 DX 的内容设置为看起来合理的值,但是如何访问 EAX、EDX 的上半部分并将结果写入 2 个长字全局变量?

0 投票
4 回答
2218 浏览

opcode - PPC 的 rdtsc 操作码相当于什么?

我有一个包含以下代码的汇编程序。这段代码可以很好地编译为英特尔处理器。但是,当我使用 PPC(交叉)编译器时,我收到一个错误,即无法识别操作码。我正在尝试查找 PPC 架构是否有等效的操作码。

0 投票
3 回答
4860 浏览

c++ - RDTSC 开销的差异

当我在一些原始图像处理操作中尝试使用 SIMD 指令内在函数时,我正在构建一个微基准来测量性能变化。然而,编写有用的微基准很困难,所以我想首先了解(如果可能的话,消除)尽可能多的变化和错误来源。

我必须考虑的一个因素是测量代码本身的开销。我正在使用 RDTSC 进行测量,并且正在使用以下代码来查找测量开销:

运行此代码时,我得到如下输出:

我的问题是:

  1. 上面代码生成的循环计数双峰分布的可能原因是什么?
  2. 为什么最快的时间(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 为核心循环生成的代码是: