2013-12-13 35 views
0

是否有辦法讓MPI只打印一個(或子集)進程的輸出?我知道如何在代碼級別做到這一點,但我想知道在可執行文件已經編譯之後是否有某種方式來指定它。我正在考慮在下面的命令中獲得輸出,如下面的窗口中的一個:MPI - 抑制某些處理器的輸出

mpirun -np [#processes] xterm -e [path to executable] 

只是沒有使用xterm。

我知道我可以使用-tag-output選項來標記輸出,然後可以手動對其進行過濾,但這是一種乏味。由於MPI確切地知道產出的來源,有沒有更簡單的方法來實現這一目標?

+0

有沒有在MPI標準(其中任何一個)來幫助你。儘管(a)您沒有告訴我們您正在使用什麼實現,並且(b)我會驚奇地發現任何實現都具有此功能。 –

+0

這是不幸的 - 要求這是一件很奇怪的事情嗎?我正在使用OpenMPI 1.4.3。無論如何,謝謝你的評論;至少我知道我最有可能停止尋找它。 – Johanna

回答

2

你可以編寫一個包裝腳本。由於開放MPI使得MPI_COMM_WORLD過程軍銜稱爲OMPI_COMM_WORLD_RANK環境變量可用,這是很容易做到的事情,如:

#!/bin/bash 

UNMUTE=$1 
shift 1 

if [ "$OMPI_COMM_WORLD_RANK" == "$UNMUTE" ]; then 
    exec $* 
else 
    exec $* >/dev/null 2>&1 
fi 

保存這unmute.sh並執行它想:

$ mpiexec -n #procs unmute.sh #rank executable [params] 

的腳本將標準輸出和錯誤流重定向到/dev/null,除了指定的所有等級外。您可以使比較邏輯更精細,例如與一系列或一系列等級進行比較。

這裏是上面的腳本在行動樣本:

$ mpiexec -n 6 printenv | grep COMM_WORLD_RANK 
OMPI_COMM_WORLD_RANK=0 
OMPI_COMM_WORLD_RANK=1 
OMPI_COMM_WORLD_RANK=2 
OMPI_COMM_WORLD_RANK=3 
OMPI_COMM_WORLD_RANK=4 
OMPI_COMM_WORLD_RANK=5 
$ mpiexec -n 6 unmute.sh 3 printenv | grep COMM_WORLD_RANK 
OMPI_COMM_WORLD_RANK=3 
+0

謝謝你,完美,這正是我想要的。 – Johanna