高性能计算最佳实践

本页面的一些评论来自于我个人超过10年的CFD计算经验、以及3年的HPC客户反馈。我并没有附上相关数据(没时间准备)。专业性用户可以对我的观点采取怀疑态度。初级CFD用户建议适当采取我的建议。

定律一:

不是用越多的核越快!但小网格请使用少的核心数!

比如一万个网格单元,一定不要用64核来计算。20万个网格。建议跑5个核10个核。百万级别的网格,这个不确定用多少个核。需要自行对比研究。

针对OpenFOAM,Janeš et al. 采用了32-1024核心对300万-700万网格进行模拟,作者建议每核心7500个网格,并认为采用512核心时达到最大加速比。Axtmann and Rist对经典pitzDaily进行了计算,网格采用了100万-1600万网格,作者表明每核心分配15000-20000个网格比较好。Zheng et al.使用OpenFOAM对非牛顿流体圆管内的流动进行了模拟,表明每核心32000个网格是最优的。Duran et al.发现对于OpenFOAM,网格越大,节点内加速比约线性。

在一些情况下(取决于网格数多少),96核比80核更慢,是正常的。128核的服务器,绝对不会比64核快2倍!任何型号的单塔式服务器单机的并行性能,绝对不是线性的,并且这个并行性一般非常差!2024年,我不推荐购买任何256核心的单机服务器。200核以上,需要上机架式服务器。

用法拉利拉水泥绝对不如拖拉机快!比如跑20个网格。请用1个核!如果算例都是特别小的网格,不建议上服务器,台式机就行。

这一个定律的引申问题是服务器适合跑多少万网格。这主要取决于内存容量。3200万网格,单相流、稳态SIMPLE算法Fluent2020版本占用81G内存。OpenFOAM单相流也占用了80G内存。有关计算速度,这个不好说。一些人拿笔记本6核心算300万网格,一些人拿机架式300核心算300万网格。这个跟个人的阈值、预算有关。

定律二:

大网格算例,请顺序跑,而不是同时跑!

举例,1000万网格,跑64核肯定合适。那么有个问题,有2个1000万网格的算例。是每个算例分32核同时跑,还是每个算例分64核顺序跑?针对单机塔式服务器,请选择后者。针对机架式服务器,请一个算例跑一个节点。

定律三:

跑线程数还是核心数,这个要研究!

一般我们建议跑核心数。比如64核128线程的服务器,就跑64核心。当然某些情况下,可能会出现64核128线程的服务器,开超线程发现是80线程或者90线程最快。这个就没有普适性定论了。保守起见,64核128线程的服务器,就跑64核心。跑更多的,需要自行研究是快是慢。

定律四:

是否打开超线程,跟CPU、内存有关!没有定论。

这个没有普适性定论。在某些情况下,64核心的服务器,跑64核的算例,打开超线程只会慢1-2%。在某些情况下,会慢10%。这取决于CPU与内存型号。DM服务器,部分打开超线程,部分关闭超线程。

有些情况下,关闭超线程会导致跑满核心的情况下速度很慢,以及每次跑的速度不一样。开启超线程,会相对稳定。

定律五:

系统任务会影响计算速度!

比如,如果开启向日葵远程,会导致CPU跑不满,并且严重影响计算速度(OpenFOAM实测要慢20%左右)。当然了,某些情况下,可能你们会观测到并没有影响多少速度。但是,保守起见,为了更好的发挥性能,不要开向日葵等远程软件。

定律六:

软件版本会影响速度!

以Fluent举例。我们的Fluent算例,2019和2020版本,计算速度相当(2019更快几秒)。windows版本2021、2022、2023版本要慢非常多。这里面还跟mpi、操作系统有关。比如linxu就会更快,Fluent的intelmpi有些版本更快,有些版本比较慢。由于商软黑箱,所以原因不详。

OpenFOAM算例速度,比如简单的pisoFoam,目前观测与版本无关。

OpenFOAM的mpi也会影响速度,比如intelmpi与openmpi计算速度并不一样。