【问题标题】:Could Mono.Simd or Microsoft.Bcl.Simd provide deterministic floating point arithmetic to C#?Mono.Simd 或 Microsoft.Bcl.Simd 能否为 C# 提供确定性浮点运算?
【发布时间】:2015-04-15 18:38:19
【问题描述】:

C#cannot be coerced into deterministic floating point arithmetic,设计者似乎认为性能开销太大了。

我正在尝试评估是否可以仅使用 SIMD 扩展来实现确定性浮点运算。 SSE appears to be 确定性,within reason

这有什么不可行的原因吗?

【问题讨论】:

  • 仅供参考,您打算用这种浮点精度要求实现什么?
  • 我在这里推测,但这可能会在缺少必要的 SIMD 指令的系统上失败吗?您可能会“优雅地”退化为逐元素破坏的数学或彻底失败。
  • @tmyklebu SSE 于 1999 年推出,allegedly许多科学应用程序拒绝运行,除非 CPU 支持 SSE2 或 SSE3。”。我认为现在很难找到不支持它的 PC。
  • @Mr.Smith:IIRC,SSE2 是 x86_64 上的典型编译器用于实现双精度浮点数学的指令集。它出现在P4上。是的,如果没有 SSE2,很多代码都会崩溃;这部分是因为 SSE2 快得多,部分是因为许多编译器实现的浮点在没有 SSE2 的情况下没有任何语义。我在这里提出了一个相当理论的问题;如果您在 P3 上使用 SIMD 扩展会发生什么?最好的情况是它会爆炸,最坏的情况是它会默默地给你破算术。
  • 编写一个在不同系统上得到相同结果的程序,即使这些结果是实数算术结果的近似值,也不是不合理的要求。 Java 结合了 strictfp 和 StrictMath 库,即使以性能为代价也能确保结果的重现性。

标签: c# floating-point deterministic


【解决方案1】:

您的问题的答案是肯定的——您需要 SSE2,而不仅仅是 SSE,才能做到这一点;事实上,Windows 和 Linux 上的 x86-64 ABI 默认使用 SSE2 进行浮点运算,这也是 .NET 64bit JIT 也使用 SSE2 FP 的原因。

原始 SSE(如 Pentium III 上所见)的问题在于它仅支持单精度,这不足以为您提供完整的浮点环境。尝试在不支持 SSE2 的处理器上运行使用 SSE2 的代码会触发非法指令陷阱。

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多