与在32位计算机上执行相比,在64位计算机上执行64位操作(例如双精度操作)时,为什么我们不会看到两倍更好的性能?
在32位机器中,我们不需要从内存中取两倍的内存吗?更重要的是,我们不需要两倍的周期来执行64位操作吗?
答案 0 :(得分:7)
当在这个意义上使用短语时,它与内存总线的宽度,CPU内部总线的宽度以及ALU在32-或64-上有效运行的能力无关位宽数据。
你的问题还假设乘法中最困难的部分是将操作数移动到处理处理器内部乘法的单元,即使操作数来自内存并且总线是来的,这也不会是真的。 32位宽,因为延迟!=吞吐量。另外,关于浮点乘法的数学,64位乘法不是32位乘法的两倍,它大约是(53/24) 2 倍的硬度(但是,再次,无论通用寄存器的宽度如何,晶体管都可以有效地计算双精度乘法。
答案 1 :(得分:2)
在32位机器中,我们不需要从内存中获取两倍的内容吗?
没有。在大多数现代CPU中,内存带宽至少为64位。较新的微架构可能有更宽的总线。四通道内存的CPU-RAM带宽至少为256位。所以你只需要1次获取即可获得双倍。除了大部分时间,该值已经在缓存中,因此加载它不会花费太多时间。
更重要的是,我们不需要两倍的周期来执行64位操作吗?
首先,您应该知道double中有效位的实际数量仅为53,因此它不是"两倍"更难。
要对这些浮点值进行操作,需要将它们加载到寄存器中。一旦它们被加载,只要ALU可以在1条指令中快速进行双精度数学运算,性能就不会有所不同。对于允许一个内存操作数(如x86)的体系结构,如果将值提取到缓存中,则对寄存器进行操作几乎没有任何区别。
使用SSE2 / AVX / AVX-512,ALU甚至可以一次处理2/4/8双打,这样你就可以看到只有这样的双倍并没有多少工作。在旧的x87中,内部寄存器的长度为80位,单精度和双精度都必须扩展到80位,因此它们的性能也相同。