C 性能比较:64位和32位乘法

C 性能比较:64位和32位乘法,c,performance,cpu,cpu-registers,C,Performance,Cpu,Cpu Registers,我使用的是英特尔(R)Core(TM)i5-4200U处理器@1.60GHz,我想知道为什么64位数字的乘法比32位数字的乘法慢。我用C做了一次测试,结果表明它需要两倍的时间 我预计它需要相同的时间,因为CPU使用本机64位寄存器,数字的宽度应该无关紧要(只要它们适合64位寄存器) 有人能解释一下吗?x86-64指令集中有专门的指令,表示您只想将两个32位的量相乘。一条指令在x86-64程序集的特定方言中可能看起来像IMUL%EBX,%ECX,而不是64位乘法IMUL%RBX,%RCX 所以处理

我使用的是英特尔(R)Core(TM)i5-4200U处理器@1.60GHz,我想知道为什么64位数字的乘法比32位数字的乘法慢。我用C做了一次测试,结果表明它需要两倍的时间

我预计它需要相同的时间,因为CPU使用本机64位寄存器,数字的宽度应该无关紧要(只要它们适合64位寄存器)


有人能解释一下吗?

x86-64指令集中有专门的指令,表示您只想将两个
32位的
量相乘。一条指令在x86-64程序集的特定方言中可能看起来像
IMUL%EBX,%ECX
,而不是64位乘法
IMUL%RBX,%RCX

所以处理器知道你只想乘以32位的量。这种情况经常发生,因此处理器的设计者确保对内部电路进行优化,以在这种更简单的情况下提供更快的答案,就像3位数的乘法比6位数的乘法更容易一样。这种差异可以从Agner Fog测量的计时中看出,并在他的文章中进行了描述

如果编译器的目标是较旧的32位IA-32指令集,则32位乘法与64位乘法之间的差异更大。编译器必须只使用32位乘法指令实现64位乘法,使用其中四个指令(如果只计算结果的64个最低有效位,则使用三个指令)。
在这种情况下,64位乘法的速度可能比32位乘法慢三到四倍。

我可以想到这里出现了一个问题,因为64位乘法

实际上,两个32位数字相乘的结果最多为64位。但是,如果将两个64位数字相乘,乘积可能是128位,并且在所有情况下都大于64位

作为8086微处理器中的一个类似示例,如果您对8位数字和16位数字执行相同的操作,您将遇到CPU寄存器也必须从AX寄存器和DX寄存器存储它的情况(如果您知道汇编语言缩写)


所以,我相信这可能会增加计算时间!!!我觉得这就是让你的64位乘法变慢的原因

猜测不是答案,也许这应该是注释。AX和DX是16位寄存器。当然,并非所有64位乘法都会在结果中产生128个有效位。2和3操作数mul指令丢弃高阶位。AX和DX为16位,但x86_64系统中的对应指令可能具有相同的情况。似乎我忘了提到8086系统,我给出的这个例子是针对8086微处理器的!我正在添加它。谢谢@Gene——我的答案以前也有过,不是所有的64位乘法都是128位长的,但肯定大于64位!您确定要编译为64位吗?@Boann大多数实现x86-64的处理器仍然具有更快的32位乘法。请参见中的第12页,了解32位和64位IMUL之间的一个计时差异。@Boann错误的页面!(这是针对一个旧处理器的,乘法运算只有32位,但仍然比16位乘法快)。在实现x86-64的处理器上尝试第22页的64位与32位IMUL。现代内核速度快得离谱。但这并不是程序中的典型约束,那些高速内核必须处理速度慢得离谱的内存。当您使用64位乘法器时,您可能会移动两倍的数据,当真正的瓶颈是内存时,移动速度当然会是原来的两倍。有,快速解释,还有很多。没有必要不显示您的代码,这样您就可以得到准确的答案而不是猜测。最好显示汇编代码。此外,现代CPU在有机会的情况下,可能能够并行处理两个32位操作,使用与单个64位操作相同的逻辑电路。