MPI_Init的作用
1 | MPI_Init(&argc, &argv); |
StackOverflow的回答是,Init在调用过程中初始化MPI库,并且在进程间建立通讯和编号。
知乎的回答: OpenMPI会在调用MPI_Init时按照你传递给mpirun的指令新建进程,而你传递给MPI_Init的参数,会被传递给新建的进程。
这似乎在暗示,两个进程不是同时产生和运行的。
猜想1
有顺序的观点是不成立的
即使有顺序 malloc的时间也没这么长。
猜想2
难道是malloc的数据需要MPI_Init复制一遍?
简单将MPI_Init提前到最开始,时间也基本没变,也不对。
如果单独写一个只有MPI_Init的程序,IntelMPI还是要耗时800ms
1 | ipcc22_0029@ln121 ~/slurm/MPIInit [11:42:32] |
测试比较超算上MPI_Init的时间
以IPCC2022初赛的北京超算云 AMD机器举例
mpirun的选择 | mpi版本 | GCC或者ICC的选择版本 | 超算运行 | MPI_Init时间(ms) |
---|---|---|---|---|
IntelMPI | mpi/intel/2022.1 | gcc/10.2.0 | 只能sbatch,不能srun | 1282.24 ~ 1678.59 |
OpenMPI | mpi/openmpi/4.1.1-gcc7.3.0 | 2706ms~3235ms | ||
MPICH | mpich/3.1.4-gcc8.1.0 | 17ms | ||
mpich/3.4.2 | gcc/10.2.0 | 107ms |
不能srun IntelMPI的问题
需要export I_MPI_PMI_LIBRARY=libpmi2.so
VTune 分析MPI的程序
环境变量
设置这个Intel mpi 1200 -> 1100
1 | export PMI_TIME=1 |
需要进一步的研究学习
实在是弄不懂,为什么不同的实现,时间差别这么大。可能慢是因为额外的通路设置,是为了之后的快速传输??
3.1.4的安装选项也看不到
1 | > mpiexec --version |
遇到的问题
暂无