2013-07-01 167 views
3

假設我有一個在384個MPI進程上運行的代碼(24個計算節點,每個計算節點有16個內核)並使用以下簡單腳本將作業提交到作業隊列爲每個mpi進程分配不同數量的openmp線程

#!/bin/bash 
#PBS -S /bin/bash 
#PBS -l nodes=24:ppn=16 
#PBS -l walltime=01:00:00 

cd $PBS_O_WORKDIR 
module load openmpi 
mpirun mycode > output_file 

是以下情形可能:我需要指定一個多節點具有16個內核,採用「OpenMP的」做一些具體的計算和在某點的計算的結果更新384個過程的其餘部分。所以現在我有384個MPI進程,每個線程依次運行一個線程,一個MPI進程有16個openmp線程。

是否有可能通過OMP_NUM_THREADS和mpirun或任何其他工具完成此操作?

我明白任何建議

謝謝

新浪

回答

4

你可以請求與16秒脈衝25個節點,然後強制僅385 MPI進程:

#PBS -l nodes=25:ppn=16 
... 
mpirun -np 384 mycode : -np 1 -x OMP_NUM_THREADS=16 mycode > output_file 

這是利用了MPMD OpenMP的啓動模式,具有不同的啓動配置,以冒號分隔。由於默認隊列按節點時隙順序填充,所以前384個隊列將精確地跨越24個節點,然後附加隊列將在最後一個節點上開始。對於它,OMP_NUM_THREADS環境變量將被設置爲16,因此啓用16個OpenMP線程。如果OpenMP程序是不同的可執行文件,只是在第二次啓動配置代替它的名字,例如:

mpirun -np 384 mycode : -np 1 -x OMP_NUM_THREADS=16 myompcode > output_file 
+0

感謝您的幫助,我需要什麼, –

+0

對於MPICH'-x'應該是'-env'。 – Armut