跳转至

MPI 算个 PI

前情提要

本题是简单题,不想读背景的大佬请直接跳到题目要求

背景

几乎从人类数学诞生以来,一代代数学家就在试图提高圆周率π的数值精度。从五千年前的 1 位精度提升到当下世界纪录的 100 万亿位,π的计算方法从粗略估计、测量估算,再到公式逼近、机器演算,我们可以从中看到人类科技的发展史。

Record_pi_approximations

当下,π的计算还是衡量高性能计算集群性能和算法优越性的重要量度,问题的维度从单纯的计算,拓展到了储存、通信、内存瓶颈等方方面面,各路超算纷纷借此机会大秀肌肉。

但是在这一系列浩浩汤汤的计算过程中,有一小群人,在个人电脑刚刚普及的年代,却凭借着合作的力量,通过众包计算的方法,也达到了可喜的成就。其中一个项目是,通过分布式的方法,计算出了 π 中特殊位置数字的PiHex。在个人算力不足的年代,这可谓是工程学奇迹。

现在我们假设你有一些算力不是很强的机器,来模拟这个场景。

题目要求

你有 5 个物理节点,每个的节点 2 个核心。你需要写一个MPI 程序,计算π的近似值,精确到 1∗10−14(15 位有效数字)。

因为 MPI 开销比较大,本题时间限制为 30 秒,不考察效率。(其实就是想让大家试一试MPI)

请注意,我们的平台关闭了超线程,但是直接由MPI 生成的线程数可能会是打开超线程后的。

输入输出

输入:无

输出:一个双精度浮点数,保留 15 位有效数字。输出到output.txt 即可。如果只有 13 位有效数字,则得一半分。

编译命令

(运行 mpi.tar 中的 compile.sh 即可)

module load mpi/2021.8.0
mpicc cpi.c -lm -o cpi

运行命令

(运行 mpi.tar 中的 run.sh 即可)

salloc -p compute -N5 --ntasks-per-node=2 -c 1 -q normal
module load mpi/2021.8.0
srun -c 1 hostname -s | sort -n > slurm.hosts
mpirun -np 10 -machinefile slurm.hosts ./cpi

评分细节

请不要使用直接打表的方法,否则本题零分。我们会进行人工核验。毕竟这样一个程序并不难写,何乐而不为呢。

参考计算方法

(也可以用其他方法,下面这个方法精度不算很高)

(引自北京大学,杨超,并行与分布式计算基础)

计算方法

参考资料

MPI 讲座:https://www.bilibili.com/video/BV13v4y1v7y7

附件

初始工作区

下载 mpi.tar