Parallel processing 如何在小型MPI作业中使用GNU并行
我目前正在尝试并行化集群上的几个小型mpi作业,即集群上的每个节点有16个核心,每个mpi作业最多使用4个核心,因此我想使用GNU并行化4个mpi作业,以便通过使用4x4 mpi作业完全使用16个核心,我尝试使用以下2个脚本: par_mpi.pbs:Parallel processing 如何在小型MPI作业中使用GNU并行,parallel-processing,mpi,multicore,gnu-parallel,Parallel Processing,Mpi,Multicore,Gnu Parallel,我目前正在尝试并行化集群上的几个小型mpi作业,即集群上的每个节点有16个核心,每个mpi作业最多使用4个核心,因此我想使用GNU并行化4个mpi作业,以便通过使用4x4 mpi作业完全使用16个核心,我尝试使用以下2个脚本: par_mpi.pbs: #!/bin/bash NPROCS=16 #use 16 cores NJOBS=4 #4 small mpi jobs export WDIR=/work/user/smallmpi parallel -j $NPROCS --slf
#!/bin/bash
NPROCS=16 #use 16 cores
NJOBS=4 #4 small mpi jobs
export WDIR=/work/user/smallmpi
parallel -j $NPROCS --slf $PBS_NODEFILE --workdir $WDIR ./cmd_mpi.sh ::: seq 1 $NJOBS
在cmd_mpi.sh中,我使用4个进程定义了对mpirun的调用:
#!/bin/bash
WDIR=/work/fchen14/gpar/openmp
cd $WDIR
mpirun -np 4 ./mpi_lp #This is the mpi executable
但是当我运行这个脚本时
bash par_mpi.pbs
然后使用“top”命令监控所有内核的CPU使用情况。按1键,似乎只有4个CPU正在使用,其余CPU处于空闲状态:
top - 16:18:27 up 22 days, 4:24, 3 users, load average: 9.36, 3.30, 2.07
Tasks: 688 total, 13 running, 675 sleeping, 0 stopped, 0 zombie
Cpu0 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 0.0%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st
Cpu5 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu8 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu9 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu10 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu11 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu12 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu13 : 0.3%us, 0.3%sy, 0.0%ni, 98.7%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu14 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu15 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
有人能指出我的程序有什么问题吗?是否对GNU并行有任何基本的理解?欢迎提出任何建议
多谢各位 您是否有可能使用OpenMPI作为MPI实现?然后将
--bind to none
添加到mpirun
选项中。您好,Hristro,感谢您的评论,这确实改变了CPU的使用率,但是似乎只使用了12个CPU,而不是16个,即使我更改了NPROCS=20或更大,似乎GNU Parallel没有完全使用计算节点上的所有可用内核?抱歉,我不知道GNU并行是如何工作的。为了澄清我之前的评论:在一系列广泛的条件下,OpenMPI默认情况下会将每个进程绑定到一个特定的核心。由于不同的MPI作业对彼此的存在一无所知,因此库将所有作业固定到同一组内核上<代码>--bind to none将完全关闭绑定。无论如何,感谢您的回复,我发现问题在于我需要在seq 1 10周围加上反勾号,使其成为seq 1 10
,否则,它们只是3个字符串组合,这就是为什么只使用3x4内核的原因……您是否碰巧使用开放MPI作为MPI实现?然后将--bind to none
添加到mpirun
选项中。您好,Hristro,感谢您的评论,这确实改变了CPU的使用率,但是似乎只使用了12个CPU,而不是16个,即使我更改了NPROCS=20或更大,似乎GNU Parallel没有完全使用计算节点上的所有可用内核?抱歉,我不知道GNU并行是如何工作的。为了澄清我之前的评论:在一系列广泛的条件下,OpenMPI默认情况下会将每个进程绑定到一个特定的核心。由于不同的MPI作业对彼此的存在一无所知,因此库将所有作业固定到同一组内核上--bind to none
将完全关闭绑定。无论如何,感谢您的回复,我发现问题在于我需要在seq 1 10周围加上反勾号,使其成为seq 1 10
,否则它们只是3个字符串组合,这就是只使用3x4个核的原因。。。