2013-05-20 51 views
1

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

我正在使用C++,g ++在Linux上编译并提升多个数组。

感谢, 安格斯

+3

0到255听起来像是一个字节!只是执行更快的整数运算。可能更快仍然存储为一个整数和掩码等 –

+1

你有没有考虑使用定点数学? –

+0

它执行什么计算? – tmyklebu

回答

3

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

在当今的大多数硬件中,正常的浮点操作与处理器中最简单的操作相当。可能有一些方法可以加快算术速度,但它们可能需要您正在使用的特定硬件的专业知识,并需要在软件开发方面进行大量投资。

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

这样做的结果是,诸如a + b + c之类的算术链需要8个周期才能完成浮点运算,但只需要2个整数周期。相比之下,单独的,非链式算术(如a + b,c + d,e + f和g + h)在浮点或整数中有效地采用相同的时间量。所以,这个功能是否会帮助你的算术取决于你算术的细节。

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

图像处理是一个非常流行的领域,编写了使用SIMD特性来提供常见图像处理操作(如图像缩放,图像旋转,颜色转换,锐化或模糊等滤镜等)的软件库。

既然你提到Linux,而且我没有和Linux一起工作,我会把它留给其他人讨论什么库可用。

2

这些天,浮点运算通常在被设计用来处理浮点类型的全宽度的硬件来完成。将它限制在较低的精度可能会让它变慢!这是Java遇到的一个问题:最初,float类型的数学必须在32位完成,并且在double上的数学必须在64位完成。在英特尔的硬件上这可以完成,但比运行80位数学运算要慢得多。因此,他的Java规范发生了变化。