我想为每个 MPICH 进程创建不同数量的 MKL 线程。
例如,假设我有 4 个 MPICH 进程。我想要的是:
进程 1=4 MKL 线程,进程 2=3 MKL 线程,进程 3=5 MKL 线程,等等。
我知道export MKL_NUM_THREADS=4; export MKL_DOMAIN_NUM_THREADS="MKL_ALL=1, MKL_BLAS=4"
,但我不知道在我的具体情况下我必须做什么。
我想为每个 MPICH 进程创建不同数量的 MKL 线程。
例如,假设我有 4 个 MPICH 进程。我想要的是:
进程 1=4 MKL 线程,进程 2=3 MKL 线程,进程 3=5 MKL 线程,等等。
我知道export MKL_NUM_THREADS=4; export MKL_DOMAIN_NUM_THREADS="MKL_ALL=1, MKL_BLAS=4"
,但我不知道在我的具体情况下我必须做什么。
如果您想要实现的是 MPI 作业中的不同等级使用不同数量的 MKL 线程,您可以通过两种不同的方式来实现。
您可以根据进程等级设置代码中的线程数,例如
#define NUM_PROCS 4
int threads_per_proc[NUM_PROCS] = { 4, 3, 5, 5 };
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// ...
// Signal an error if rank >= 4
// ...
mkl_set_num_threads(threads_per_proc[rank]);
也可以使用mpiexec
(or mpirun
) 的 MPMD 启动模式,但是会有点麻烦:
mpiexec -env MKL_NUM_THREADS 4 -n 1 ./program : \
-env MKL_NUM_THREADS 3 -n 1 ./program : \
-env MKL_NUM_THREADS 5 -n 2 ./program
为简洁起见,我省略了要设置的选项MKL_DOMAIN_NUM_THREADS
。这将启动 MPI 程序的一个副本,并将./program
其MKL_NUM_THREADS
设置为4
(该副本变为等级 0);一个副本MKL_NUM_THREADS
设置为3
(哪个副本成为排名 1);MKL_NUM_THREADS
设置为的两个副本5
(这些副本成为等级 2 和 3)。