问题标签 [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 投票
1 回答
414 浏览

multithreading - rdtsc 可以轻松修补吗?

在多核处理器之前的时代创建了很多很多程序,使用指令 rdtsc 来获取精确数据。

这在多线程程序中是一个严重的问题,因为它们可能以冲突的值结束,并且因此导致许多彻底崩溃(一些单线程程序也可能崩溃,具体取决于它们使用 rtdsc 的方式)。

至少在 Windows 上,建议只设置“处理器亲和性”是很常见的,不幸的是,这也严重削弱了一些设计(显然是不正确的)使用并行性的程序。

所以我在想,即使没有任何类型的源代码,在崩溃的程序中寻找 rdtsc 调用并用其他东西替换它有多难?(我不知道还有什么……)

0 投票
3 回答
505 浏览

assembly - 有什么方法可以触发 RDTSC 的传统模式?

我重写了整个问题,人们显然不理解它。

RDTSC 用于计算 CPU 周期,它随着 CPU 节流而变化。

目前,RDTSC 不随 CPU 节流而变化。

一些旧应用程序预计 RDTSC 会随着 CPU 节流而变化。

我如何让 RDTSC 满足他们的期望?

我不想分析代码,我不想重写大量代码,我不想强​​迫用户弄乱 BIOS 或内核权限,我只想让遗留应用程序按他们应该的方式工作。

0 投票
1 回答
1466 浏览

x86 - 如何保证RDTSC是准确的?

我读过 RDTSC 可以给出错误的读数,不应该依赖。
这是真的吗?如果是这样,可以做些什么呢?

0 投票
3 回答
2019 浏览

c - 用 C 语言测量程序循环数的最可靠方法是什么?

我熟悉两种方法,但它们都有其局限性。

第一个是使用指令RDTSC。但是,问题在于它没有单独计算我的程序的周期数,因此对并发进程引起的噪声很敏感。

第二种选择是使用clock库函数。我认为这种方法是可靠的,因为我希望它只计算我的程序的周期数(我打算实现的目标)。但是,事实证明,在我的情况下,它测量经过的时间,然后将其乘以 CLOCKS_PER_SEC. 这不仅不可靠,而且是错误的,因为 CLOCKS_PER_SEC设置为1,000,000与我的处理器的实际频率不对应。

鉴于所提出方法的局限性,是否有更好、更可靠的替代方案来产生一致的结果?

0 投票
2 回答
302 浏览

c++ - __rdtscp 校准在 Intel Xeon X5550 上 Linux 下不稳定

我正在尝试使用__rdtscpintrinsinc 函数来测量时间间隔。目标平台是 Linux x64,CPU Intel Xeon X5550。尽管constant_tsc为此处理器设置了标志,但校准__rdtscp会产生非常不同的结果:

正如我们所看到的,程序执行之间的差异可以达到 3 倍(125-360)。这种不稳定性不适用于任何测量。

这是代码(gcc 4.9.3,在 Oracle Linux 6.6 上运行,内核 3.8.13-55.1.2.el6uek.x86_64):

当我在 Windows 7、i7-4470、VS2015 下运行非常相似的程序时,校准结果相当稳定,只有最后一位的差异很小。

所以问题是——这个问题是关于什么的?是 CPU 问题、Linux 问题还是我的代码问题?

0 投票
1 回答
709 浏览

c - 在我的程序中使用 rdtsc() 来获取单字和双字操作的时钟周期数?

理论上双字加/减的成本是单字的2倍。同样,单字乘法与加法的成本比取为 3。我在 Ubuntu LTS 14.04 上使用 GCC 编写了以下 C 程序,以检查我的机器 Intel Sandy Bridge Corei5-2410M 上的时钟周期数。虽然,大多数时候程序返回 6 个时钟周期来进行 128 位加法,但我采取了最好的情况。我使用命令(gcc -o ow -O3 cost.c)编译,结果如下

程序如下:

结果中有两件事让我感到困扰。

1)(64位)乘法的时钟周期数可以变成2吗?

2)为什么双字加法的时钟周期数是单字加法的2倍以上?

我主要关心情况(2)。现在,问题出现了,是因为我的程序逻辑吗?还是由于 GCC 编译器优化?

0 投票
1 回答
1802 浏览

linux - 使用 rdtsc 计算秒数

这是计算 CPU 时间的代码,但它不正确,因为当我使用gettimeofday时,它会给我以毫秒为单位的正确时间。我在一个处理器上运行我的进程,它的时钟运行在 800MHz。我对rdtsc的了解如下:

  • Rdtsc 返回周期数
  • 使用这些周期数,可以计算给定时钟速率(800 MHZ)的 CPU 时间

    /li>
0 投票
1 回答
942 浏览

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

我正在使用 RDTSCP 替换 LFENCE;RDTSC 序列,并返回处理器 ID,以便我知道在线程重新调度到另一个 CPU 后何时比较 TSC 值。

为了确保不会在太旧的机器上运行 RDTSCP,我在 CPUID 检查(使用 libcpuid)后回退到 RDTSC。我想尝试使用 gcc 多目标属性功能而不是 CPUID 调用:

gcc 手册列出了许多 cpu 系列(haswell、skylake、...)。我如何找到哪个 cpu 系列首先引入了 RDTSCP?

0 投票
1 回答
176 浏览

x86 - x86 的 RDTSC 的 Alpha 等效项?

我有以下在 x86/linux 中完美运行的代码。我想使用 gcc 交叉编译器将此代码转换为 ALPHA。它产生如下错误:

“asm”中的未知寄存器名称“eax”

我自己找不到合适的资源。

我几乎没有发现 rpcc 是 rdts 的等效指令。我猜 cpuid 和 xorl 是一样的。但是 eax, ebx 是特定于 x86 的寄存器,而不是 ALPHA 中的寄存器。Alpha ISA 寄存器从 0 到 31 编号,就像这里

有人可以通过提供一些包含合理信息的链接将上述代码转换为 ALPHA 或建议我如何做到这一点吗?

如果我知道如何将以下行至少转换为 ALPHA inline,那就足够了:

谢谢

0 投票
1 回答
349 浏览

gcc - 错误:在重新加载 ASM 时找不到类“AREG”中的寄存器

当我使用bc变量执行此代码时,程序将执行但不生成任何输出。有一些逻辑错误,不会在输出中打印时间。