我有一个包含大型浮点值数组的程序,并基于它们执行大量计算,这些值后来被缩放到介于 0 和 255 之间以充当像素值。是否可以降低浮点计算的准确性,以便说 4 个有效数字来提高速度,并希望减少内存中数组的大小?
我正在使用 C++、g++ 在 linux 上编译,并提升多数组。
谢谢,安格斯
我有一个包含大型浮点值数组的程序,并基于它们执行大量计算,这些值后来被缩放到介于 0 和 255 之间以充当像素值。是否可以降低浮点计算的准确性,以便说 4 个有效数字来提高速度,并希望减少内存中数组的大小?
我正在使用 C++、g++ 在 linux 上编译,并提升多数组。
谢谢,安格斯
通常,现代处理器没有比 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,我将留给其他人讨论可用的库。
如今,浮点数学通常在旨在处理浮点类型的全部宽度的硬件中完成。将其限制为较低的精度会使其变慢!这是 Java 遇到的一个问题:最初,float
类型的数学运算必须在 32 位上完成,而数学运算double
必须在 64 位上完成。在英特尔硬件上可以做到这一点,但它比完全运行 80 位数学要慢得多。正因为如此,他的 Java 规范发生了变化。