为特定的 MPI 进程设置环境变量
setting an environment variable for a specific MPI process
我是 运行 MPI 中的 Fortran 代码。我需要在一个特定的进程中设置一个环境变量。有没有办法做到这一点?从 Fortran 代码调用 "system" 似乎没有效果。我是 运行 通过 "aprun" 的代码。
启动器解决方案
您应该在启动 MPMD 时执行此操作。它适用于 mpirun
或 aprun
.
这是一个示例,其中一个进程的 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 的 mpirun
或 mpiexec
支持类似的功能。 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);
}
我是 运行 MPI 中的 Fortran 代码。我需要在一个特定的进程中设置一个环境变量。有没有办法做到这一点?从 Fortran 代码调用 "system" 似乎没有效果。我是 运行 通过 "aprun" 的代码。
启动器解决方案
您应该在启动 MPMD 时执行此操作。它适用于 mpirun
或 aprun
.
这是一个示例,其中一个进程的 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 的 mpirun
或 mpiexec
支持类似的功能。 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);
}