【问题标题】:Float vs Double performance in C# considering cache考虑缓存的 C# 中的浮点与双倍性能
【发布时间】:2011-09-05 12:23:16
【问题描述】:

我查了一下,发现很多关于 float vs double 性能的帖子(here 是一个,here 是另一个)。在大多数情况下,据说它们具有相同的性能,因为它们被 FPU 转换为 10 字节实数。但我仍然不相信。如果地方问题得到适当考虑怎么办?考虑对大量位进行按位异或,当数据适合缓存(浮点数)时,计算无 0 位将花费更少的时间。使用常规(非 SIMD 指令)进行 XOR 和位填充计数将延长处理时间。 我试图写一些测试来确认它,但要让一切都正确并不容易。

一个问题是这两种类型在缓存中是否转换为相同的大小?

总的来说,我想知道是否有人可以描述这两种选择在不同情况下的行为?

【问题讨论】:

  • floatdouble 值使用异或对你有什么用处?
  • +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


【解决方案1】:

如果适当地考虑地方性问题会怎样?

还是一样,因为这些通常没有你想象的那么高。如果您处理 float 和 double ,而只是复制它,实际计算会花费大量时间。您的 XOR 示例是您认为错误的一个很好的示例。 XOR 是一种简单易行的快速运算,因此一致性很重要。在大多数情况下,使用浮点数会花费更多时间进行数学运算。

【讨论】:

  • 实际上,位置问题非常很重要。当我们在大学学习缓存时,我们有一个关于这个问题的完整项目,人们通过使数据更加本地化来设法通过许多 gigaflops 优化算法。
  • 是的,它可以——特别是如果你什么都不做。例如,如果您为期权运行数学定价模型,那么“localit”非常重要,以至于将 sutff 移到显卡上可以使您的速度提高 100 倍。如果您花费 1000 个周期进行计算,则位置变得无关紧要。
  • 作为测试,我创建了 25 个包含 1,000,000 个随机双精度元素的数组;以及另外 25 个包含 1,000,000 个随机浮点数的数组。我将每个数组的前 50,000 个元素除以两个常数。我对每种类型进行 100 次整个操作并平均时间。差值几乎为 0.00%。我的 CPU 上有 8MB 缓存,因此我将数组大小更改为 200 万(双精度为 16 MB,浮点数为 8MB),并将我的算术运算应用于 50,000 个随机选择的元素,以便有 50% 的机会命中双精度缓存,并且几乎 100% 的浮动。 float 的性能提高了大约 1~2%。
  • 我认为任何低于 5% 的都是错误的,所以总的来说,没有区别
猜你喜欢
  • 2019-10-17
  • 2011-08-05
  • 2013-05-20
  • 2014-02-28
  • 2012-07-25
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多