Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 每个汇编指令需要多少CPU周期?_Performance_Assembly_X86_Cpu Architecture_Cpu Cycles - Fatal编程技术网

Performance 每个汇编指令需要多少CPU周期?

Performance 每个汇编指令需要多少CPU周期?,performance,assembly,x86,cpu-architecture,cpu-cycles,Performance,Assembly,X86,Cpu Architecture,Cpu Cycles,我听说有一本英特尔在线书籍描述了特定汇编指令所需的CPU周期,但我找不到它(在努力尝试之后)。有人能告诉我如何找到CPU周期吗 下面是一个示例,在下面的代码中,mov/lock是1个CPU周期,xchg是3个CPU周期 // This part is Platform dependent! #ifdef WIN32 inline int CPP_SpinLock::TestAndSet(int* pTargetAddress,

我听说有一本英特尔在线书籍描述了特定汇编指令所需的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

顺便说一句:这里是我发布的代码的URL:

给定流水线、无序处理、微码、多核处理器等,无法保证汇编代码的特定部分将精确地占用x个CPU周期/时钟周期/任何周期

如果存在这样的参考,它将只能在给定特定架构的情况下提供广泛的概括,并且取决于微码的实现方式,您可能会发现奔腾M与Core 2 Duo不同,后者与AMD双核不同,等等

请注意,这篇文章是在2000年更新的,写得更早。即使是奔腾4也很难确定指令定时——PIII、PII和原始奔腾更容易,参考的文本可能基于那些具有更明确指令定时的早期处理器


现在人们通常使用统计分析来估计代码计时。

测量和计算CPU周期在x86上不再有意义

首先,问问自己,你在为哪个CPU计算周期?核心-2?阿斯隆?奔腾M?原子?所有这些CPU都执行x86代码,但它们的执行时间都不同。甚至在同一CPU的不同步进之间,执行也会有所不同

最后一个循环计数有意义的x86是奔腾Pro

还考虑到,在CPU内部,大多数指令被转码成微码,并被内部执行单元无序地执行,甚至不象x86。单个CPU指令的性能取决于内部执行单元中有多少资源可用

因此,指令的时间不仅取决于指令本身,还取决于周围的代码

无论如何:您可以估计不同处理器的吞吐量资源使用率和指令延迟。相关信息可在英特尔和AMD网站上找到

Agner Fog在他的网站上有一个非常好的摘要。有关延迟、吞吐量和uop计数,请参阅说明表。请参阅微架构PDF以了解如何解释这些内容

但请注意,使用内存的
xchg
-即使只查看一种CPU型号,也不会有可预测的性能。即使在L1D缓存中缓存线已经很热的无争用情况下,作为一个完整的内存屏障也意味着它的影响很大程度上取决于加载和存储到周围代码中的其他地址


顺便说一句,因为您的示例代码是无锁数据结构基本构建块:您考虑过使用编译器内置函数吗?在win32上,可以包含intrin.h并使用_InterlockedExchange等函数


这将为您提供更好的执行时间,因为编译器可以内联指令。内联汇编程序总是强制编译器禁用asm代码的优化。

其他答案所说的不可能准确预测在现代CPU上运行的代码的性能是正确的,但这并不意味着延迟未知,或者知道它们是无用的

Intels和AMD处理器的确切延迟在中列出。另请参见和(来自Can Berk Güder现在删除的链接唯一答案)。AMD在自己的网站上也有pdf手册和官方价值观

对于(微)优化紧循环,了解每条指令的延迟可以帮助您手动安排代码。程序员可以进行许多编译器无法进行的优化(因为编译器不能保证它不会改变程序的含义)

当然,这仍然需要您了解有关CPU的许多其他细节,例如它的管道化程度、每个周期可以发出多少指令、执行单元的数量等等。当然,这些数字因CPU的不同而不同。但您通常可以得出一个合理的平均值,该值或多或少适用于所有CPU

但是值得注意的是,在这个级别上优化几行代码需要做大量的工作。而且很容易让事情变得悲观。现代CPU非常复杂,它们非常努力地从糟糕的代码中获得良好的性能。但也有一些情况下,他们无法有效地处理,或者你认为你很聪明,编写了高效的代码,结果证明这会降低CPU的速度

编辑 查看英特尔优化手册,表C-13: 第一列是指令类型,然后是每个CPUID的延迟列数。CPUID指示数字适用于哪个处理器系列,并在文档的其他地方进行了解释。延迟指定指令结果可用之前所需的周期数,因此这是您要查找的数字

吞吐量列显示每个周期可以执行多少此类指令

在这个表中查找xchg,我们可以看到,根据CPU系列的不同,它需要1-3个周期,而mov需要0.5-1个周期。这些是用于寄存器到寄存器形式的指令,而不是用于带有内存的
锁xchg
,这要慢得多。而且更重要的是,延迟和对周围代码的影响非常可变(当与另一个核心发生争用时,速度会慢得多),因此只考虑最佳情况是错误的。(我还没有找到每个CPUID的含义,但我假设.5是奔腾4的,奔腾4以双倍速度运行芯片的某些组件,允许它在半个周期内完成任务)

我不知道你是谁
add eax, eax
add eax, eax
add eax, eax
add eax, eax  # total latency of 4 cycles for these 4 adds
add eax, eax
add ebx, ebx
add ecx, ecx
add edx, edx # these 4 instructions might all execute, in parallel in a single cycle