- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我听说网上有一本英特尔书,它描述了特定汇编指令所需的 CPU 周期,但我找不到(经过努力)。谁能告诉我如何找到CPU周期?
这是一个例子,在下面的代码中,mov/lock 是 1 个 CPU 周期,xchg 是 3 个 CPU 周期。
// This part is Platform dependent!
#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* pTargetAddress,
int nValue)
{
__asm
{
mov edx, dword ptr [pTargetAddress]
mov eax, nValue
lock xchg eax, dword ptr [edx]
}
// mov = 1 CPU cycle
// lock = 1 CPU cycle
// xchg = 3 CPU cycles
}
#endif // WIN32
最佳答案
现代 CPU 是复杂的野兽,使用 pipelining , superscalar execution , 和 out-of-order execution在其他使性能分析变得困难的技术中... 但并非不可能 !
虽然您不能再简单地将指令流的延迟加在一起来获得总运行时间,但您仍然可以(通常)对某些代码(尤其是循环)的行为进行高度准确的分析,如下所述和在其他链接资源。
教学时间
首先,您需要实际时间。这些因 CPU 架构而异,但目前用于 x86 时序的最佳资源是 Agner Fog 的 instruction tables .这些表涵盖不少于 30 种不同的微架构,列出了指令延迟,这是指令从准备好输入到可用输出所需的最短/典型时间。用阿格纳的话来说:
Latency: This is the delay that the instruction generates in a dependency chain. The numbers are minimum values. Cache misses, misalignment, and exceptions may increase the clock counts considerably. Where hyperthreading is enabled, the use of the same execution units in the other thread leads to inferior performance. Denormal numbers, NAN's and infinity do not increase the latency. The time unit used is core clock cycles, not the reference clock cycles given by the time stamp counter.
add
指令的延迟为一个周期,因此一系列相关的加法指令(如图所示)每个
add
的延迟为 1 个周期。 :
add eax, eax
add eax, eax
add eax, eax
add eax, eax # total latency of 4 cycles for these 4 adds
add
每个指令只需要 1 个周期。例如,如果添加指令是
不是 依赖,有可能在现代芯片上所有 4 条加法指令都可以在同一个周期内独立执行:
add eax, eax
add ebx, ebx
add ecx, ecx
add edx, edx # these 4 instructions might all execute, in parallel in a single cycle
Reciprocal throughput: The average number of core clock cycles per instruction for a series of independent instructions of the same kind in the same thread.
add
这被列为
0.25
意味着最多 4
add
指令可以在每个周期执行(给出
1 / 4 = 0.25
的倒数吞吐量)。
imul
的常见形式指令有 3 个周期的延迟,内部只有一个执行单元可以处理它们(不像
add
通常有四个可添加的单元)。然而,对于一长串独立的
imul
观察到的吞吐量指令是 1 个/周期,而不是每 3 个周期 1 个,因为延迟为 3。原因是
imul
单元是流水线的:它可以开始一个新的
imul
每个循环,即使之前的乘法还没有完成。
imul
每个周期最多可以运行 1 个指令,但是一系列依赖
imul
指令将每 3 个周期仅运行 1 个(因为下一个
imul
在前一个的结果准备好之前无法启动)。
InstLatX86
中类似组织的计时和
InstLatX64
结果。结果涵盖了很多有趣的旧芯片,新芯片通常很快就会出现。结果与 Agner 的结果基本一致,但这里和那里也有一些异常(exception)。您还可以在此页面上找到内存延迟和其他值。
关于performance - 每条汇编指令需要多少个 CPU 周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/692718/
我刚开始使用 Gnu Plot 并创建了一些简单的绘图。但是现在我遇到了一个新问题。 输入是这样的 csv 文件: name;n0;n1;n2 Benj;1;3;2 Silv;6;1;2 Steffi
我在 MongoDB 中有 2700 条记录。每个文档的大小约为 320KB。我使用的引擎是wiredTiger,集合的总大小约为885MB。 我的 MongoDB 配置如下: systemLog:
我是一名优秀的程序员,十分优秀!