F#作为HPC语言

Old*_*vec 12 .net f# hpc

我使用F#开发了Lattice Boltzmann(流体动力学)代码.我现在正在24核128 GB内存服务器上测试代码.代码基本上由一个用于时间演化的主递归函数和一个用于三维空间迭代的System.Threading.Tasks.Parallel.For循环内部组成.3D空间是500x500x500大,一个时间周期需要:).

let rec timeIterate time =
  // Time consuming for loop
  System.Threading.Tasks.Parallel.For(...)
Run Code Online (Sandbox Code Playgroud)

我希望服务器使用所有24个核心,即100%的使用率.我观察到的是1%-30%的使用率.

我的问题是:

  1. F#是否适合在此类服务器上进行HPC计算?
  2. 对于现实世界的问题,使用高达100%的CPU是否现实?
  3. 我该怎么做才能获得高速度?一切都在一个大的并行循环中,所以我希望这就是我应该做的......
  4. 如果F#不是一种合适的语言,那么什么语言?

谢谢你的任何建议.

编辑:我愿意分享代码,如果有人有兴趣看看它.

EDIT2:这是代码的剥离版本:http://dl.dropbox.com/u/4571/LBM.zip 它没有做任何合理的事情,我希望我没有通过剥离代码引入任何错误:)

启动文件是ShearFlow.fs,文件底部是

let rec mainLoop (fA: FArrayO) (mR: MacroResult) time =
  let a = LBM.Lbm.lbm lt pA getViscosity force g (fA, mR)
Run Code Online (Sandbox Code Playgroud)

小智 5

1.F#是否适合在此类服务器上进行HPC计算?

它(F#)作为一种语言,可以鼓励并行运行的代码 - 至少部分是减少状态可变性和高阶函数 - 这是一个可以而不是意志.但是,HPC有许多专业编程语言/编译器和/或负载分配方式(例如共享统一内存或分布式微内核).F#仅仅是一种通用编程语言:它可能或可能不具有对各种技术的访问(例如,可能存在或可能不存在绑定).(这甚至适用于非分布式并行计算.)

2.对于现实世界的问题,使用高达100%的CPU是否现实?

这取决于限制因素是什么.跟我的朋友说话5K +100k +核心HPC研究和开发,数据交换空闲时间通常是限制因素(当然,这是一个更高的n :-)因此即使IO减少(效率或不同算法)的微小改进也会导致显着收益.不要忘记在同一台机器上简单地在CPU /缓存之间移动数据的成本!当然,速度太慢的磁盘IO ......

3.我该怎么做才能获得高速度?一切都在一个大的并行循环中,所以我希望这就是我应该做的......

找出缓慢部分的位置并修复它们(它们):-)例如,运行配置文件分析.请记住,可能需要使用完全不同的算法或方法.

4.如果F#不是一种合适的语言,那么什么语言?

虽然我不是在争论它,但我的博士朋友使用/工作于Charm ++:它是一种非常集中的语言,用于分布式并行计算(不是有问题的环境,但我想说明一点:-) - F#尝试成为一种体面的通用语言.