首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科学计算中的F#性能

科学计算中的F#性能
EN

Stack Overflow用户
提问于 2010-05-02 02:08:49
回答 10查看 20.8K关注 0票数 73

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

我读到过F#应该具有更高的可伸缩性和更高的性能,但与C++相比,现实世界的性能又如何呢?有关目前执行情况的具体问题是:

  • 它对浮点有多好?
  • 它允许向量指令吗
  • 它对优化编译器有多友好?
  • 它有多大的记忆脚印?它允许对内存局部性进行细粒度控制吗?
  • 它是否具有分布式内存处理器的能力,例如Cray?
  • ,它有哪些特性可能对涉及重数处理的计算科学感兴趣?
  • 是否有实际使用它的科学计算实现?

谢谢

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-05-05 15:29:43

  • F#可以按照.NET CLR允许的速度进行浮点计算。与C#或其他.NET语言没有太大区别。
  • F#本身不允许向量指令,但是如果您的CLR有一个API用于这些,F#应该不会有使用它的问题。例如,参见单声道
  • 据我所知,目前只有一个F#编译器,所以问题应该是“F#编译器在优化方面有多好?”在任何情况下,答案都是“可能与C#编译器一样好,目前可能会更糟”。请注意,F#在编译时对内联的支持与C#不同,这可能允许更高效的依赖泛型的代码。
  • F#程序的内存脚印与其他.NET语言相似。您对分配和垃圾收集的控制量与其他.NET语言相同。
  • 我不知道对分布式内存的支持。
  • F#有非常好的处理平面数据结构的原语,例如数组和列表。例如,查看数组模块的内容: map、map2、mapi、iter、折叠、压缩.数组在科学计算中很流行,我猜是因为它们本身具有良好的内存局部性。
  • 对于使用F#的科学计算包,您可能想看看Jon正在做什么。
票数 41
EN

Stack Overflow用户

发布于 2010-05-10 00:45:51

我很好奇F#性能与C++性能相比如何?

根据应用程序的不同,差异很大。如果您在多线程程序中广泛使用复杂的数据结构,那么F#很可能是一个巨大的胜利。如果你的大部分时间花在紧凑的数字循环中,变异数组,那么C++可能会更快2-3×。

案例研究:射线追踪器,我的基准这里,使用一棵树进行分层剔除和数值射线球相交代码,以生成输出图像。这个基准已经有好几年的历史了,C++代码在过去的几年里已经改进了几十次,并且被成千上万的人阅读。微软的Don成功地编写了一个F#实现,它比用MSVC编译并使用OpenMP并行化的最快的C++代码要快一些。

我读到过F#应该具有更高的可伸缩性和更高的性能,但与C++相比,现实世界的性能又如何呢?

使用F#开发代码比使用C++更容易和更快,这适用于优化和维护。因此,当您开始优化一个程序时,如果您使用F#而不是C++,那么同样的工作量将带来更大的性能收益。然而,F#是一种更高级的语言,因此对性能设置了更低的上限.因此,如果您有无限的时间用于优化,理论上,您应该始终能够在C++中生成更快的代码。

当然,这与C++对Fortran和Fortran对手写汇编程序的好处完全相同。

案例研究: QR分解,这是由LAPACK等库提供的线性代数的一种基本数值方法。参考LAPACK实现是2,077行Fortran。我用80行代码编写了一个F#实现,实现了相同的性能水平。但是参考实现并不快:供应商调优的实现,比如Intel的Math (MKL),通常要快10倍。值得注意的是,我成功地优化了我的F#代码,远远超出了英特尔硬件上运行的英特尔实现的性能,同时将我的代码保持在150行代码和完全通用代码(它可以处理单精度和双精度,甚至是符号矩阵!):对于超薄矩阵,我的F#代码比Intel快3×10。

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

它对浮点有多好?

性能与ANSI相似,但一些功能(例如舍入模式)在.NET中不可用。

它允许向量指令吗

不是的。

它对优化编译器有多友好?

这个问题没有意义: F#是微软的专有.NET语言,只有一个编译器。

它有多大的记忆脚印?

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

它允许对内存局部性进行细粒度控制吗?

比大多数内存安全语言都好,但不如C语言好,例如,您可以通过将任意数据结构表示为"structs“来解压缩F#中的任意数据结构。

它是否具有分布式内存处理器的能力,例如Cray?

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

在涉及重数处理的计算科学中,有哪些特性可能会引起人们的兴趣?

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

是否有实际使用它的科学计算实现?

我们的商业产品在F#中的科学计算已经有了数百个用户。

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

票数 65
EN

Stack Overflow用户

发布于 2010-05-02 09:48:47

除了其他人所说的,关于F#还有一点是很重要的,那就是并行性。普通F#代码的性能由CLR决定,尽管您可以从F#中使用LAPACK,或者可以使用C++/CLI作为项目的一部分进行本机调用。

然而,设计良好的功能程序更容易并行化,这意味着您可以通过使用多核CPU轻松地获得性能,如果您正在做一些科学的计算,这些CPU肯定对您是可用的。以下是几个相关链接:

  • F#与任务并行库 (由Jurgen van Gael撰写的博客,他正在做机器学习的事情)
  • 关于皮毛主义的另一个有趣的答案
  • 使用F#中的并行LINQ的一个例子
  • 我的书的第14章讨论了并行性(源代码是可用的)

关于分布式计算,您可以使用任何可用于.NET平台的分布式计算框架。有一个MPI.NET项目,它可以很好地与F#一起工作,但是您也可以使用DryadLINQ,这是一个MSR项目。

  • 一些文章:用于F# .NET的MPI工具与MPI.NET并发
  • DryadLINQ项目主页
票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2752229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档