我正在使用 Intel(R)Core(TM)i5-4200U CPU @ 1.60GHz ,并想知道为什么64位数的乘法比32位数慢。我已经在C中完成了一次测试,结果发现它需要两倍的时间。
我预计它需要相同的时间,因为CPU使用本机64位寄存器,并且数字的宽度并不重要(只要它们适合64位寄存器)。
有人可以解释一下吗?
答案 0 :(得分:6)
x86-64指令集中有专门的指令表示您只想乘以两个32-bit
数量。对于x86-64程序集,一条指令可能看起来像IMUL %EBX, %ECX
,而不是64位乘法IMUL %RBX, %RCX
。
因此处理器知道您只想乘以32位数量。这种情况经常发生,以至于处理器的设计者确保内部电路将在这种简单的情况下进行优化以提供更快的答案,就像您将3位数字乘以6位数字更容易。可以在Agner Fog测量的时间中看到差异,并在他的comprehensive assembly optimization resources中进行了描述。
如果您的编译器针对较旧的32位IA-32指令集,则32位和64位乘法之间的差异会更大。编译器必须实现64位乘法,仅使用32位乘法指令,使用其中的四个(如果仅计算结果的64个最低有效位,则为3个)。 在这种情况下,64位乘法可能比32位乘法慢大约四到四倍。
答案 1 :(得分:0)
由于64位乘法,我可以想到这里出现的问题。
实际上,对于两个32位数相乘,结果最多为64位。但是,如果乘以两个64位数字,产品可能是128位,并且在所有情况下它都会大于64位!
作为8086微处理器中的类似示例,如果您使用8位数字和16位数字执行相同的操作,您将遇到CPU寄存器必须从AX寄存器存储它的情况和DX注册(如果您知道汇编语言缩写)。
所以,我相信这可能会增加计算时间!我觉得这就是让你的64位乘法变慢的原因!