0

我正在尝试在 16 位短变量中存储 32 位浮点值来节省内存和时间消耗。为了做到这一点,我引入了这样的转换函数:

typedef short int StoreType;
StoreType FloatToShort( float x ) { return x/k; }
float ShortToFloat( StoreType x ) { return float(x)*k; }

然后我使用第一个函数将输入数据转换为 StoreType 数组。每次我需要一些值时,我都会提取 StoreType 数据并使用第二个函数获取浮点值。

但是当我想估计由于内存优化而选择的加速选项并比较两种情况时:

  1. 如上所述 - 当 StoreType == short int
  2. 完全相同,但 StoreType == float (第一行替换为 "typedef short int StoreType" )。

我看到,在第二种情况下,时间明显更小(当测量误差小于 1% 时为 10%),尽管我有所有的预期(计算相同,现金使用量更大,浮动更大)。同时我的算法速度理论上不应该依赖于可怕的计算结果(即精度)。并且程序的最终结果几乎不会随着 StoreType 的变化而改变(差异小于 0.2%)。该程序还包括许多具有转换值的计算,因此与所有计算相比,类型转换时间预计可以忽略不计。

程序如何使用浮点数更快?

4

4 回答 4

4

这看起来像是过早优化的情况。除非您存储数十亿(不仅仅是数百万)浮点数,否则来回转换的成本将超过读取和写入数据的成本。第一种方法应该总是简单地将这些浮点数以二进制格式存储为浮点数,并且只有在 I/O 成为瓶颈时才进行优化。

使用浮点数的替代方法是始终使用定点表示。主要目的是货币交易的语言通常提供内置的定点表示。C 和 C++ 是通用语言;他们没有这种内置支持。但是,在 C++ 中构建定点类并不难。更好的是,如果有此意图,请找到某人已经开发的定点模块。

于 2013-10-07T19:06:03.877 回答
2

在第一种情况下,您正在执行浮点运算以及从 afloat到的转换short int(反之亦然)。

在第二种情况下,您有相同的浮点运算但没有转换。除非我误解了你的问题,这就是为什么它更快。

于 2013-10-07T18:21:43.770 回答
1

首先,您似乎正在尝试优化不太可能成为瓶颈的区域。其次,这样做会降低性能,原因如下:

1)来回转换会造成不必要的乘除运算。2) 大多数现代架构使用 32 位字,因此尝试将它们存储在 16 位中可能会引入对齐问题。

当需要优化时,遵循阿姆达尔定律:“使常见情况快速,罕见情况正确”。

于 2013-10-07T19:42:03.003 回答
0

为了澄清这个问题,您似乎在问为什么 A(如下所述)比 B(如下所述)花费更多时间。

一个是:

  • 输入后,按 逆缩放数据k,将其从 转换floatshort,并将其存储在数组中。
  • 要执行计算,请将数据从 转换shortfloat,按 缩放k,然后在 中计算float

乙是:

  • 输入后,通过逆缩放数据k并将其存储在数组中。
  • 要执行计算,将其按 缩放k,然后在 中计算float

如果这是你的问题,答案是 A 比 B 有更多的操作。

还应注意,当StoreType为时float,缩放和逆缩放似乎毫无意义。

理论上,通过转换来减少数据的大小short可以节省时间,因为使用的内存更少,因此更多的数据适合缓存,并且访问缓存比访问内存更快。但是,对于许多应用程序来说,这不会提供性能优势,因为数据足够小以适合缓存,而不管它是什么float,或者因为数据足够大以至于它即使在缓存中也不适合short(和/或者由于各种原因,您的数据访问模式可能不适合缓存)。

于 2013-10-07T18:34:06.470 回答