2016-01-22 406 views
2

我正在MPI中運行Fortran代碼。我需要在一個特定的過程中設置一個環境變量。有沒有辦法做到這一點?從Fortran代碼調用「系統」似乎沒有效果。我通過「aprun」運行代碼。爲特定的MPI進程設置環境變量

+0

在mpirun或運行過程中? –

+0

@Vladimir F只要它「堅持」我會滿意任何一種方式。我想我希望從mpirun(實際上是aprun)那樣做,因爲這似乎更確定地給我我想要的東西。 –

+0

您可以使用相同的二進制但不同的opts進行類似MPMD的啓動。如果需要,您的Cray超級計算中心可以爲您提供幫助。 – Jeff

回答

6

啓動器解決方案

您應該在啓動MPMD時執行此操作。它適用於mpirunaprun

下面是一個示例,其中一個過程與其他過程不同地設置OMP_NUM_THREADS環境變量。

aprun -n 1 -e OMP_NUM_THREADS=1 ./mpi-openmp-app.x input_file.in : 
     -n 99 -e OMP_NUM_THREADS=10 ./mpi-openmp-app.x input_file.in 

這是

aprun -n 100 -e OMP_NUM_THREADS=10 ./mpi-openmp-app.x input_file.in 

異構等效請參閱aprun man page(或命令行man aprun)的詳細信息。

請注意,Cray正在將許多站點從ALPS(即aprun)切換到SLURM(srun),但我確定SLURM支持相同的功能。

MPI的mpirunmpiexec支持類似的功能。 MPI標準沒有指定語法,因此您需要閱讀MPI實現的文檔以瞭解具體情況。

源代碼解決方案

假設你的環境變量被解析MPI初始化後,你可以不喜歡以下使用setenv,如果發射器解決方案不起作用。

int requested=MPI_THREAD_FUNNELED, provided; 
MPI_Init_thread(&argc,&argv,requested,&provided); 

int rank; 
MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
if (rank==0) { 
    int overwrite = 1; 
    int rc = setenv("OMP_NUM_THREADS","1",overwrite); 
} 
+0

在啓動器解決方案中,是否有方法來指定獲取環境變量的進程?謝謝! –

+0

我期望這些進程按照它們啓動的順序進行編號,除非您啓用排序重新排序。 – Jeff

+0

我嘗試了Cray系統上的啓動器解決方案,似乎第二個二進制文件無法識別env變量。 ALPS提供了一個不明的「aprun:無效選項 - 'e''」錯誤。 –