2016-01-22 410 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''”错误。 –