浮子比双倍慢吗?64位程序是否比32位程序运行得更快?

2022-09-03 06:10:59

使用类型是否比使用类型慢?floatdouble

我听说现代英特尔和AMD CPU可以比浮点数更快地进行双倍计算。

标准数学函数(、 、 、 、 等) 呢?以单精度计算它们应该相当快,因为它需要较少的浮点运算。例如,单精度可以使用比双精度更简单的数学公式。另外,我听说标准数学函数在64位模式下更快(在64位操作系统上编译和运行时)。对此的最终答案是什么?sqrtpowlogsincossqrtsqrt


答案 1

经典的 x86 体系结构使用浮点单位 (FPU) 来执行浮点计算。FPU在其内部寄存器中执行所有计算,每个寄存器具有80位精度。每次尝试使用 或 时,变量首先从内存加载到 FPU 的内部寄存器中。这意味着实际计算的速度绝对没有差异,因为在任何情况下,计算都是以完整的80位精度进行的。唯一可能不同的是从内存加载值并将结果存储回内存的速度。当然,在 32 位平台上,与 相比,加载/存储 可能需要更长的时间。在64位平台上应该没有任何区别。floatdoubledoublefloat

现代 x86 体系结构支持扩展指令集 (SSE/SSE2),新指令可以执行完全相同的浮点计算,而无需“旧”FPU 指令。但是,同样,我不希望看到 和 的计算速度有任何差异。由于这些现代平台是64位平台,因此加载/存储速度也应该相同。floatdouble

在不同的硬件平台上,情况可能有所不同。但通常较小的浮点类型不应提供任何性能优势。较小的浮点类型的主要目的是节省内存,而不是提高性能。

编辑:(为了解决@MSalters评论)我上面所说的适用于基本的算术操作。当涉及到库函数时,答案将取决于几个实现细节。如果平台的浮点指令集包含实现给定库函数功能的指令,那么我上面所说的通常也适用于该函数(通常包括, , 等函数)。对于其他功能,其功能在FP指令集中不立即得到支持,情况可能会大不相同。这些函数的版本很可能比其版本更有效地实现。sincossqrtfloatdouble


答案 2

您的第一个问题已经在SO上得到了答案。

您的第二个问题完全取决于您正在处理的数据的“大小”。这一切都归结为系统的低级架构以及它如何处理大值。32位系统中的64位数据需要2个周期才能访问2个寄存器。64 位系统上的相同数据只需 1 个周期即可访问 1 个寄存器。

一切都取决于你在做什么。我发现没有快速和硬性规则,所以你需要分析当前的任务,并选择最适合你对该特定任务的需求。


推荐