数值优化

4

我在想哪种整数或浮点类型是最快的...
我认为byte比integer更快,因为它的范围更小。
有些人告诉我.. 在某些情况下,integer比byte更快。

第二个问题:
GPU正在走向世界统治..
所以我问自己:一个Double“比Integer更快”.. 因为FPU
那么专家们在哪里呢? :)

8个回答

6
你需要考虑的不仅是时钟周期,还有进行算术运算所需的时间。你可以说,两个整数相加需要这么多个周期,两个双精度浮点数相加需要这么多个周期等等,但这可能并不相关。如果你的所有数据同时适合缓存,那么计时单个操作是有意义的。但是如果不是这样,由于缓存未命中所需的额外时间会主导单个操作之间的差异。有时,使用较小的数据类型更快,因为它可以使得是否需要从缓存中获取某些内容或者是否需要访问磁盘之间的差异变得更小。
现在的计算机大部分时间都花费在数据传输上,而不是进行算术运算,即使在数字计算应用程序中也是如此。前者与后者的比率正在增加。你不能简单地比较例如乘以shorts和doubles所需的时间。你可能会发现,在你的程序的两个版本中,一个版本在小问题上运行得更快,而另一个版本在大问题上运行得更快,这全都是由于不同类型内存的相对效率造成的。

4
我曾经认为byte比integer更快,因为它的范围较小。但是,根据我的经验,使用short类型反而会导致性能下降,而使用int类型则没有问题。这是因为,在某些体系结构中并不存在short类型,它们只是一种方便的数据类型。处理器实际上使用的是其字长大小,而在我的情况下,字长大小是int。因此,访问short类型时,处理器需要先将值打包成int,然后再进行计算,并在最后将结果解包成short。所有这些操作都会导致性能下降。因此,并不是说越短就越好。

是的,在特别是 PowerPC 架构上,短整型可能会非常慢。 - Crashworks

1

这取决于架构中的数据位数。 浮点处理器在进行计算时将以相同方式处理float和double。它们都使用80位精度进行评估,因此需要相同的时间。将值加载到FPU寄存器中并将其保存可能会有所不同。由于双倍占用RAM空间,因此可能会因缓存未命中而变慢。如果您有倾向于随机索引的大型数组,则会注意到这一点。


实际上,浮点数可能需要更多时间,因为需要进行从浮点数到双精度的转换以及再次转换的额外步骤。 - Mike Dunlavey
但这仍取决于架构是否需要转换。有些会进行剥离,不需要进行转换。 - lakshmanaraj

1

在 CPU 级别上,没有字节,只有单词,现在是 32 位或 64 位。算术单元通常被硬连线处理单词大小的数字(或更大,如浮点数)。

因此,在算术运算方面使用比单词小的类型并没有速度优势,而且可能会有速度惩罚,因为您必须做额外的工作来模拟 CPU 没有本地支持的类型,例如写入单个字节到内存需要先读取它所属的单词,修改它,然后将其写回。为了避免这种情况,大多数编译器实际上会对所有较小的变量使用完整的内存单词,因此即使布尔变量也占用 32 或 64 位。

但是,如果您有大量数据,例如大型数组,则使用较小的类型通常会产生更好的性能,因为您将减少缓存未命中的次数。


0

数值类型的字节长度取决于使用的语言和平台。例如,在Java中,int和float都使用4个字节,因此处理时间应该相等。然而,更长的类型被更快地处理这一点让我感到惊讶。如果有证据支持,请分享给我阅读。


0
关于哪个更快,整数还是字节,只要它们都适合寄存器,它们的工作方式相同,或者至少没有可测量的差异。
关于整数与双精度:也许GPU用双精度比普通CPU做算术更快,但我怀疑它不会比整数运算更快,因为整数运算只是寄存器运算。

0
最大的优化是从使用循环标量计算转向使用矢量计算。然后利用GPU或CPU的SSE。

0

好的,只要您不进行任何矢量优化,您可以使用整数作为寄存器(32/64位)的大小而不会受到任何实际性能损失。

浮点数略有不同:虽然 CPU 优化了 double,但 GPU 通常使用 float。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接