2015-03-13 65 views
4

我正在嘗試使用aprun運行多節點作業。然而,我無法弄清楚在bash環境中如何獲得排名(或任何作爲每項工作的ID)。像這樣簡單的工作:如何在aprun中獲得排名

aprun -n 8 -N 2 ./examplebashscript.sh 

我怎樣才能得到每個產卵工作的排名? 如果沒有排名或任何獨特工作ID之類的東西,這個預編程線只會運行16次完全相同的程序,這是不可取的。

我一直在閱讀文檔,令人驚訝的是我找不到甚至解釋了aprun提供的默認變量。

我已經與mpirun合作過,我知道如何使用C和Python程序獲取每個作業的等級值,但不是在Bash中。 aprun甚至沒有文件記錄。

+0

我一點都不熟悉'aprun',你是對的,從看它,文件是不是非常好。但是我會嘗試的一件事就是將環境變量使用'env'轉儲到某個文件中,並查看是否通過環境變量傳遞了這些信息。你可以使用像'env> $(hostname) - $$。env'這樣的東西寫出一個基於正在運行的進程的主機名和PID命名的文件,希望每次調用都可以得到不同的結果。 – 2015-03-13 18:48:04

+0

我剛剛嘗試過,不幸的是我沒有看到任何接近我需要的東西。有一些SLURM變量(如SLURM_NNODES,SLURM_JOBID),它們在所有作業中都是相同的。因此,我需要有人對如何爲阿倫運行獨特的工作提供一些啓示。 – user4668442 2015-03-13 19:14:19

回答

0

假設你在最近的Cray上運行,你不能。您的腳本在登錄節點上執行,並且aprun命令將啓動計算節點上的應用程序。

您啓動的應用程序可以通過初始化MPI然後調用MPI_Rank來獲得排名。

1

執行此操作的一種方法是編寫一個包裝腳本,該腳本可以運行一系列任務,然後將其中的每個腳本生成爲一個單獨的腳本。

在您的片段,它看起來像你想運行每個計算節點的腳本的2個實例共獲得8所以,在你的工作的腳本,你可以這樣做:

for ((i=0; i<8; i+=2)); do 
    aprun -n 1 ./wrapper.sh $i 2 & 
done 
wait 

然後在包裝你可以這樣做(其中附加$ J向你唯一索引):

end=$(($1 + $2)) 
for ((j=$1; j<$end; j+=1)); do 
    ./examplebashscript.sh $j & 
done 
wait 

您還可以設置以下環境變量,以獲得不同的進程和線程的位置。你需要設置這些在你的shell(或作業腳本)運行 「aprun」 前:

export MPICH_CPUMASK_DISPLAY=1 
export MPICH_RANK_REORDER_DISPLAY=1 

例如,運行:

aprun -n 24 ./examplebashscript.sh 

(的簡寫形式):

aprun -n 24 -N 24 -S 12 -d 1 ./examplebashscript.sh 

將在STDERR上給出以下類型的輸出(注意這是在XC30上,每個計算節點上有兩個Intel Ivy Bridge 12-內核處理器,因此由於存在超線程,掩碼顯示每個節點上有48個內核):

[PE_0]: MPI rank order: Using default aprun rank ordering. 
[PE_0]: rank 0 is on nid02749 
[PE_0]: rank 1 is on nid02749 
[PE_0]: rank 2 is on nid02749 
[PE_0]: rank 3 is on nid02749 
[PE_0]: rank 4 is on nid02749 
[PE_0]: rank 5 is on nid02749 
[PE_0]: rank 6 is on nid02749 
[PE_0]: rank 7 is on nid02749 
[PE_0]: rank 8 is on nid02749 
[PE_0]: rank 9 is on nid02749 
[PE_0]: rank 10 is on nid02749 
[PE_0]: rank 11 is on nid02749 
[PE_0]: rank 12 is on nid02749 
[PE_0]: rank 13 is on nid02749 
[PE_0]: rank 14 is on nid02749 
[PE_0]: rank 15 is on nid02749 
[PE_0]: rank 16 is on nid02749 
[PE_0]: rank 17 is on nid02749 
[PE_0]: rank 18 is on nid02749 
[PE_0]: rank 19 is on nid02749 
[PE_0]: rank 20 is on nid02749 
[PE_0]: rank 21 is on nid02749 
[PE_0]: rank 22 is on nid02749 
[PE_0]: rank 23 is on nid02749 
[PE_23]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000100000000000000000000000 
[PE_22]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000010000000000000000000000 
[PE_21]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000001000000000000000000000 
[PE_0]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000000000001 
[PE_20]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000100000000000000000000 
[PE_9]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000001000000000 
[PE_11]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000100000000000 
[PE_10]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000010000000000 
[PE_8]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000100000000 
[PE_1]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000000000010 
[PE_2]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000000000100 
[PE_18]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000001000000000000000000 
[PE_7]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000010000000 
[PE_15]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000001000000000000000 
[PE_3]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000000001000 
[PE_6]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000001000000 
[PE_16]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000010000000000000000 
[PE_14]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000100000000000000 
[PE_13]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000010000000000000 
[PE_12]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000001000000000000 
[PE_4]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000000010000 
[PE_5]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000000000000000100000 
[PE_17]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000000100000000000000000 
[PE_19]: cpumask set to 1 cpu on nid02749, cpumask = 000000000000000000000000000010000000000000000000 

您可能可以通過某種方式捕捉到這一點。

1

嘗試尋找環境變量ALPS_APP_PE在您已經編程的bash腳本中。

對於腳本的每個實例它們都會有所不同(創建的實例數由aprun命令中的-n選項給出)。

如果腳本隨後執行MPI程序的實例,那麼該實例將具有由ALPS_APP_PE給出的MPI等級值。

需要注意的是,一些Cray網站可能會決定不公開此變量或使用不同的名稱。很老的ALPS版本也不支持它,但這些都很少見。

一個例子來看看這個CUG 2014紙:

https://cug.org/proceedings/cug2014_proceedings/includes/files/pap136.pdf