以精度为代价提高浮动计算的速度?

时间:2013-05-20 00:24:39

标签: c++ multidimensional-array floating-point

我有一个包含大量浮点值数组的程序,并根据它们执行大量计算,这些值后来被缩放到0到25​​5之间作为像素值。有可能降低浮点计算的准确性,这样可以说4个有效数字,以提高速度,并希望减少内存中阵列的大小?

我正在使用C ++,g ++在linux上编译,并提升多个阵列。

谢谢, 安格斯

2 个答案:

答案 0 :(得分:3)

通常,现代处理器没有比32位算术更窄的浮点数。有些提供了加载和存储16位浮点对象的规定,但它们在加载时将它们转换为32位对象,并使用32位对象进行算术运算。进行整数运算可能比浮点运算有一些优势,如下所述。

在今天的大部分硬件中,正常的浮点运算与处理器中最简单的操作相同。可能有一些方法可以加速算术运算,但它们可能需要您使用的特定硬件的专业知识以及对软件开发的大量投资。

对于浮点运算,处理器的吞吐量与整数运算相同并不罕见。吞吐量是处理器可以执行的每秒操作数。但是,浮点运算可能具有更长的延迟。一个常见的情况是处理器可以在一个处理器周期内完成整数加法,并且处理器可以在四个周期内完成浮点加法,但它可以分四个部分完成工作,并且每个部分可以在不同的加法处理与其他部分同时进行。因此,虽然从浮点加法开始到完成它是四个周期,但处理器仍然每个周期完成一次加法。

这样做的结果是,诸如a + b + c之类的算术链需要在浮点完成8个周期,但在整数中只需要两个周期。相反,单独的,非链式算术,例如a + b,c + d,e + f和g + h,在浮点或整数中有效地占用相同的时间量。因此,此功能是否有助于算术运算取决于算法的具体情况。

许多现代处理器的另一个特性叫做SIMD,单指令多数据。此功能允许处理器同时执行多个算术运算(通常是四个32位整数运算或四个32位浮点运算,有时更多运算使用更窄的整数,有时更少运算使用64位浮点运算)。使用通用C ++代码访问SIMD功能很麻烦。一些编译器提供了一些自动使用它。即便如此,它还需要了解和关注特定细节,例如数据对齐,可能干扰操作并行化的问题,以及向编译器通知编译代码将执行的特定处理器模型。也可以使用特殊的编译器内置函数,宏和/或语言扩展或汇编语言访问SIMD功能。

图像处理是一个受欢迎的领域,编写的软件库使用SIMD功能提供常见的图像处理操作,如图像缩放,图像旋转,颜色转换,锐化或模糊等滤镜等。

既然你提到Linux,而我不使用Linux,我会把它交给其他人讨论可用的库。

答案 1 :(得分:2)

目前,浮点数学通常在硬件中完成,该硬件旨在处理浮点类型的整个宽度。限制它以降低精度会使它变慢!这是Java遇到的一个问题:最初,float类型的数学必须以32位完成,double上的数学必须在64位上完成。在英特尔硬件上,这可以完成,但它比运行80位数学运算要慢得多。因此,他改变了Java规范。