|
1
4
您的第一个代码(导致标题问题)是错误的,因为它覆盖了
使用
记住,RDTSC计算参考周期,而不是核心时钟周期。 Get CPU cycle count? 关于RDTSC的更多信息。
你没有
这不是一条指令的时间安排重要的是在另一条指令可以使用结果之前的延迟,而不是等到它从无序的后端完全退出之后的延迟。 RDTSC可用于定时 相对变化 一个加载或一个存储指令需要多长时间,但是开销意味着您将无法获得一个好的绝对时间。 不过,您可以尝试减去测量开销。例如 clflush to invalidate cache line via C function . 另见以下内容: Using time stamp counter and clock_gettime for cache miss 和 Memory latency measurement with time stamp counter .
这是我通常用来分析短块指令的延迟或吞吐量(以及Uops融合域和未融合域)
. 调整您如何使用它来解决延迟瓶颈问题,比如这里,或者,如果您只想测试吞吐量,就不要这样做。例如用
您可能希望使用NASM的smartalign包,或者使用yasm,以避免对align指令使用单字节nop指令墙。nasm默认为非常愚蠢的nop,即使在64位模式下,长nop总是受支持。
使用类似于此一行程序的东西来运行此程序,该行程序将它链接到静态可执行文件中,并使用
(实际上,我把nasm+ld+可选的disassemble放到了一个shell脚本中,该脚本名为
3.9GHz下I7-6700K的结果
(电流)
在我的i7-6700K(Skylake)上,
每分支16个循环=每4个链16个循环
选择不同的计数器进行记录。添加一个
调整初始ECX值,使总时间约为0.1到1秒,这通常很充足,尤其是当CPU快速上升到最大涡轮转速时(例如,Skylake具有硬件P状态和相当积极的能量性能偏好)。或禁用涡轮增压的最大非涡轮增压。 但这是以核心时钟周期为单位的,而不是以参考周期为单位的,因此不管CPU频率如何变化,它仍然会给出相同的结果。 . (+-转换过程中时钟停止时发出的一些噪音。) |
|
|
EE18 · C中字节序与尺寸组装转换的关系 1 年前 |
|
|
MagicRacoon · TSO和存储转发保证 2 年前 |
|
|
ugo_capeto · gcc使用“lea”而不是“add”` 2 年前 |
|
|
Locke · GCC和Clang奇怪的不必要堆栈使用[重复] 2 年前 |