问题标签 [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.
linux - 英特尔赛扬 64 位汇编程序上的 RDTSC
我写了一个小的随机数字程序,它利用 RDTSC 给我随机性。我使用 FASM 在 Linux Mint 17 上编写了它。
问题是,它在 AMD FX 64 位 PC 上完美运行,但在 Windows 8 和 Linux Mint 下,英特尔赛扬上网本(64 位)上的确切代码失败(或挂起)(我双启动,所以我调整了Win 8 的代码)
这里可能是什么问题?这基本上是代码;
我调试了一下,发现罪魁祸首隐藏在这部分代码中。但我也看不出有什么问题。它在我的 AMD PC 上完美运行。英特尔 CPU 是否默认禁用 RDTSC?
performance - 测量函数的 rdtsc 计时
我想用 rdtsc 计时函数调用。所以我用以下两种方式测量它。
- 循环调用它。聚合循环内的每个 rdtsc 差异并除以调用次数。(假设这是N)
- 循环调用它。获取循环本身的rdtsc差异并除以N。
但我看到了一些不一致的行为。
- 当我增加 N 时,方法 1 和 2 中的时间都会相当单调地减少。对于方法 2,它可以分摊循环控制开销是可以理解的。但我不确定方法 1 的情况如何。
- 实际上,对于方法 2,每次增加 N 时,我得到的 N=1 的值似乎每次都除以新的 N。检查 gdb 反汇编让我意识到这是 -O2 的一些编译器优化,在第二种情况下跳过了循环。所以我用-O0重试了,gdb反汇编显示了第二种情况的实际循环。
代码如下。
知道这里发生了什么吗?如果需要,我也可以将 gdb 反汇编。我使用了来自http://dasher.wustl.edu/tinker/distribution/fftw/kernel/cycle.h的 rdtsc 实现
编辑: 我将不得不撤回我的第二个声明,即在 -O0 处,在第二种情况下,时间与 N 成正比下降。我想这是我在构建过程中犯的一些错误,导致一些旧版本持续存在。无论如何它仍然与方法1的数字一起下降。这里是不同N值的一些数字。
我现在看到了两种新行为。
- 方法 1 的收敛速度比方法 2 慢。但我仍然对为什么不同 N 设置的值存在如此大的差异感到困惑。也许我在这里犯了一些我目前看不到的基本错误。
- 方法 1 的值实际上比方法 2 大一些。我预计它与方法 2 的值持平或略小,因为它不包含循环控制开销。
问题
总而言之,我的问题是
为什么增加 N 时两种方法给出的值变化如此之大?特别适用于不考虑循环控制开销的方法 1。
当第一种方法在计算中排除循环控制开销时,为什么第二种方法的结果小于第一种方法的结果?
编辑 2
关于建议的 rdtscp 解决方案。
由于对内联汇编不熟悉,我做了以下事情。
并在函数调用之前和之后使用上述方法。但现在我得到如下无意义的结果。
有什么问题?我想将它们分解为内联方法,因为我看到在多个地方使用它。
A. 评论中的解决方案。
c++ - 等效于非英特尔编译器的 mkl_get_clocks_frequency()
我_rdtsc()
在英特尔编译器中使用来获取时间戳计数器。我使用_rdtsc()
,mkl_get_clocks_frequency()
将时间戳计数器读数转换为秒。它们都特定于英特尔编译器。
虽然,我在使用内联汇编的 GNU 编译器上有一个等价物,_rdtsc()
但对于mkl_get_clocks_frequency()
.
如何以便携式方式估计 CPU 时钟频率?
c++ - rdtscp() 不返回核心 ID?
我正在阅读以下问题:
它描述了以下要调用的 C++ rdtscp
:
但是,有关于 ECX 的讨论以及有关返回核心 ID 的问题。如果我对核心 ID 不感兴趣,是否可以修改上述内容并减少rdtscp
调用开销/对寄存器的影响?
c++ - 如何将此程序集时间戳函数转换为 C++?
我正在尝试将别人的项目从 32 位转换为 64 位。一切似乎都很好,除了一个函数,它在构建 x64 时使用 Visual Studio 不支持的汇编表达式:
最有趣的是,它被用于生成随机数。这两个asm
块都不能在 x64 下编译,所以玩起来ifdef
没有帮助。我只需要找到 C/C++ 替换以避免重写整个程序。
rdtsc - cpuid + rdtsc 和乱序执行
cpuid
在基准测试时用作序列化指令以防止 ooo 执行,因为rdtsc
如果单独使用基准测试指令的执行之前可能会重新排序。我的问题是下面的说明是否仍然可以在和rdtsc
之间重新排序?既然不是序列化指令,那么指令可以围绕它自由重新排序吗?cpuid
rdtsc
rdtsc
delphi - Delphi - 在 Int64 中加入 2 个整数
我正在Delphi
和合作Assembly
,所以,我遇到了问题。我在汇编中使用了一条指令(RDTSC
)来获取 64 位读取时间戳,该指令将数字分别放在两个寄存器EAX
和EDX
. 但没关系,我用Delphi Integer
变量得到它。但是现在,我需要将这些变量加入 1 个 64 位中。就像是:
所以我需要把它放到一个变量中,比如:
它就像一个 StrCat,但我不知道该怎么做。有人可以帮助我吗?
assembly - 使用 RDTSC(分析)NASM 语法每次都会增加价值
我正在尝试使用带有 AFD 调试器的 NASM 分析 8086 代码。我正在尝试使用 RDTSC(0x0f31) 指令,但是通过从旧时间戳中减去新时间戳获得的值非常大,并且一直在增加。我不知道问题是什么。这是代码:
assembly - 如何使用 rdtsc 在 Qemu i386 系统中进行基准测试
目前,我正在尝试测量在同一环境中通过两种不同的编程语言完成操作所需的时钟周期数。(不使用操作系统)
目前我正在使用 Qemu-i386 模拟器并使用 rdtsc 来测量时钟周期。
取操作前后 rdtsc 的差值应提供时钟周期数。
但是即使我进行了超过 100 次迭代并且变化了几千个周期,差异也不是恒定的。
有没有更好的测量时钟周期的方法?
还有什么方法可以在 Qemu 中提供频率作为输入参数?目前我正在使用
qemu-system-i386 -kernel out.elf
gcc - Assembler instruction: rdtsc
Could someone help me understand the assembler given in https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
It goes like this:
How is it different from:
Why do we need shift and or operations and what does rdx at the end do?
EDIT: added what is still unclear to the original question.
- What does "\n\t" do?
- What do ":" do?
- delimiters output/input/clobbers...
- Is rdx at the end equal to 0?
Just to recap. First line loads the timestamp in registers eax and edx. Second line shifts the value in eax and stores in rdx. Third line ors the value in edx with the value in rdx and saves it in rdx. Fourth line assigns the value in rdx to my variable. The last line sets rdx to 0.
- Why are the first three lines without ":"?
- They are a template. First line with ":" is output, second is optional input and third one is optional list of clobbers (changed registers).
- Is a actually eax and d - edx? Is this hard-coded?
Thanks again! :)
EDIT2: Answered some of my questions...