【发布时间】:2011-09-05 12:23:16
【问题描述】:
我查了一下,发现很多关于 float vs double 性能的帖子(here 是一个,here 是另一个)。在大多数情况下,据说它们具有相同的性能,因为它们被 FPU 转换为 10 字节实数。但我仍然不相信。如果地方问题得到适当考虑怎么办?考虑对大量位进行按位异或,当数据适合缓存(浮点数)时,计算无 0 位将花费更少的时间。使用常规(非 SIMD 指令)进行 XOR 和位填充计数将延长处理时间。 我试图写一些测试来确认它,但要让一切都正确并不容易。
一个问题是这两种类型在缓存中是否转换为相同的大小?
总的来说,我想知道是否有人可以描述这两种选择在不同情况下的行为?
【问题讨论】:
-
对
float和double值使用异或对你有什么用处? -
+1 有趣的问题!我也一直对此很好奇。不过,一个想法是:如果您正在寻找这种级别的优化,您是否真的想在 C# 上做到这一点?
-
我也认为它们的性能基本相同。但是,如果您仍然不相信,请建立一些基准并对其进行测试。具有现代超复杂多核架构的 IMO 几乎不可能在没有测试的情况下预测 CPU 的行为......
-
这是关于使用托管 C++ 为浮点数包装快速 SSE 指令的 MS 博客。 social.msdn.microsoft.com/Forums/en-us/vclanguage/thread/… 和 codeproject.com/KB/recipes/SSE_optimized_2D_vector.aspx
-
主要的性能限制实际上是大型数据集的内存消耗,这就是为什么您通常会在游戏中看到用于定义网格顶点和法线的浮点数而不是双精度数。我不完全确定这是否属实,但我怀疑使用浮点数还可以让 GPU 制造商减少其 FPU 组件中涉及的位数,当您考虑到现代 GPU 具有大约 128 个专用内核时,这会增加主要用于并行矩阵乘法。
标签: c# performance types x86