Multithreading 如何为每个MPICH进程设置不同数量的MKL线程

Multithreading 如何为每个MPICH进程设置不同数量的MKL线程,multithreading,mpich,Multithreading,Mpich,我想为每个MPICH进程创建不同数量的MKL线程 例如,假设我有4个MPICH进程。我想要的是: 过程1=4 MKL螺纹, 过程2=3 MKL螺纹, 过程3=5 MKL螺纹, 等等 我知道导出MKL_NUM_THREADS=4;导出MKL_DOMAIN_NUM_THREADS=“MKL_ALL=1,MKL_BLAS=4”,但我不知道在我的特定情况下必须做什么。如果您想要实现的是MPI作业中的不同列组使用不同数量的MKL线程,您可以用两种不同的方式来完成 您可以根据进程级别设置代码中的线程数,例如

我想为每个MPICH进程创建不同数量的MKL线程

例如,假设我有4个MPICH进程。我想要的是:

过程1=4 MKL螺纹, 过程2=3 MKL螺纹, 过程3=5 MKL螺纹, 等等


我知道导出MKL_NUM_THREADS=4;导出MKL_DOMAIN_NUM_THREADS=“MKL_ALL=1,MKL_BLAS=4”,但我不知道在我的特定情况下必须做什么。

如果您想要实现的是MPI作业中的不同列组使用不同数量的MKL线程,您可以用两种不同的方式来完成

您可以根据进程级别设置代码中的线程数,例如

\define NUM\u PROCS 4
int threads_per_proc[NUM_PROCS]={4,3,5,5};
整数秩;
MPI通信等级(MPI通信世界和等级);
// ...
//如果秩>=4,则发出错误信号
// ...
mkl_集合_num_线程(每个进程的线程[rank]);
您也可以使用MPMD启动模式
mpiexec
(或
mpirun
),但这会有点麻烦:

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\u DOMAIN\u NUM\u线程的选项。这将启动MPI程序的一个副本
/program
,其中
MKL_NUM_THREADS
设置为
4
(该副本变为等级0);一个副本,其
MKL_NUM_THREADS
设置为
3
(该副本变为排名1);两个副本的
MKL\u NUM\u THREADS
设置为
5
(这些副本变为秩2和秩3)。

通过基于进程秩调用
MKL\u set\u NUM\u THREADS()
设置程序中的线程数(如果这是您想要的)。当我尝试编译此代码时,它会给我一个错误:“MKL\u set\u NUM\u THREADS”的未定义引用。我想我需要把它和MKL联系起来。我不知道我使用哪个命令来链接它和MKL。我试图阅读MKL手册,但不明白如何链接?如果使用最新版本的英特尔编译器,只需传递
-MKL
选项即可。对于旧版本或其他编译器(如GCC),这取决于。我相信用户手册有一个非常广泛的章节,有很多关于如何与MKL链接的示例。