gpt4 book ai didi

c++ - F#在科学计算中的表现

转载 作者:IT老高 更新时间:2023-10-28 12:08:14 25 4
gpt4 key购买 nike

我很好奇 F# 性能与 C++ 性能相比如何?我问了一个关于 Java 的类似问题,我得到的印象是 Java 不适合繁重的数字运算。

我已经读到 F# 应该具有更高的可扩展性和更高的性能,但与 C++ 相比,这种实际性能如何?关于当前实现的具体问题是:

  • 它在浮点运算方面做得如何?
  • 是否允许 vector 指令
  • 它对优化有多友好
    编译器?
  • 它有多大的内存足迹?它是否允许对内存局部性进行细粒度控制?
  • 它有分布式的能力吗
    内存处理器,例如 Cray?
  • 它有哪些特性可能对涉及大量数字处理的计算科学感兴趣?
  • 是否有实际的科学计算
    使用它的实现?

  • 谢谢

    最佳答案

    I am curious as to how F# performance compares to C++ performance?



    因应用而异。如果您在多线程程序中大量使用复杂的数据结构,那么 F# 可能会大获全胜。如果您的大部分时间都花在改变数组的紧密数值循环上,那么 C++ 可能快 2-3 倍。

    案例研究:光线追踪器 我的基准 here使用树进行分层剔除和数值射线球交叉代码来生成输出图像。这个基准测试已经有几年的历史了,C++ 代码多年来已经改进了几十倍,并被成千上万的人阅读。 Microsoft 的 Don Syme 设法编写了一个 F# 实现,当使用 MSVC 编译并使用 OpenMP 并行化时,该实现比最快的 C++ 代码略快。

    I have read that F# is supposed to be more scalable and more performant, but how is this real-world performance compares to C++?



    使用 F# 开发代码比使用 C++ 更容易、更快,这适用于优化和维护。因此,当您开始优化程序时,如果您使用 F# 而不是 C++,同样的努力将产生更大的性能提升。但是,F# 是一种高级语言,因此对性能的限制较低。因此,如果您有无限的时间花在优化上,理论上,您应该始终能够在 C++ 中生成更快的代码。

    当然,这与 C++ 优于 Fortran 和 Fortran 优于手写汇编器的优势完全相同。

    案例研究:QR 分解 这是 LAPACK 等库提供的线性代数的基本数值方法。引用 LAPACK 实现是 2,077 行 Fortran。我写了 an F# implementation不到 80 行代码就达到了相同的性能水平。但是引用实现并不快:供应商调整的实现,如英特尔的 Math Kernel Library (MKL) 通常快 10 倍。值得注意的是,我设法优化了我的 F# 代码,远远超出了在英特尔硬件上运行的英特尔实现的性能,同时将我的代码保持在 150 行代码以下并且完全通用(它可以处理单精度和 double ,以及复杂甚至符号矩阵!):对于高薄矩阵,我的 F# 代码比英特尔 MKL 快 3 倍。

    请注意,此案例研究的寓意不是您应该期望 F# 比供应商调优的库更快,而是即使像英特尔这样的专家如果只使用低级语言,也会错过高效的高级优化。我怀疑 Intel 的数值优化专家未能充分利用并行性,因为他们的工具使它变得极其繁琐,而 F# 使它变得毫不费力。

    How well does it do floating-point?



    性能类似于 ANSI C,但某些功能(例如舍入模式)在 .NET 中不可用。

    Does it allow vector instructions



    不。

    how friendly is it towards optimizing compilers?



    这个问题没有意义:F# 是 Microsoft 的专有 .NET 语言,具有单个编译器。

    How big a memory foot print does it have?



    一个空的应用程序在这里使用 1.3Mb。

    Does it allow fine-grained control over memory locality?



    比大多数内存安全语言好,但不如 C。例如,您可以在 F# 中通过将任意数据结构表示为“结构”来取消装箱。

    does it have capacity for distributed memory processors, for example Cray?



    取决于你所说的“容量”是什么意思。如果您可以在该 Cray 上运行 .NET,那么您可以使用 F# 中的消息传递(就像下一种语言),但 F# 主要用于桌面多核 x86 机器。

    what features does it have that may be of interest to computational science where heavy number processing is involved?



    内存安全意味着您不会遇到段错误和访问冲突。 .NET 4 中对并行性的支持很好。通过 Visual Studio 2010 中的 F# 交互式 session 即时执行代码的能力对于交互式技术计算非常有用。

    Are there actual scientific computing implementations that use it?



    我们的 commercial products在 F# 中进行科学计算已经有数百名用户。

    但是,您的提问表明您认为科学计算是高性能计算(例如 Cray),而不是交互式技术计算(例如 MATLAB、Mathematica)。 F# 适用于后者。

    关于c++ - F#在科学计算中的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752229/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com