我在配备 LSF 作业系统的集群上运行 MPI fortran 程序。我的程序还包含 MKL 功能。
我知道有子程序可以设置 MKL 线程数(例如设置为 2)
call mkl_set_num_threads(2)
首先,我认为这设置了程序的总线程数。但正如我测试的那样,这似乎为每个 MPI 进程设置线程号
所以如果我提交一份工作
bsub -n 2 mpiexec.hydra ./a.out
然后 ssh 进入节点Top
,我发现它实际上使用了 4 个内核,每个 MPI 进程使用 2 个线程。
但这在我的集群上是不允许的,因为它使用的 cpu 资源比请求的多,并且在运行期间会被杀死。
有时MPI进程数不能划分cpu核心。例如,如果一个节点有 24 个核心,并且我有 7 个 MPI 进程要运行,我想提交如下
bsub -n 24 mpiexec.hydra -n 7 ./a.out
由于 MKL 具有Dynamic
功能,MKL 会自动将资源动态分配给 7 个 MPI 任务,并有效地使用所有 cpu。
但是如果现在集群已经满了。我只能请求12个核心,然后
bsub -n 12 mpiexec.hydra -n 7 ./a.out
那么如何将 MKL 设置为在 7 个 MPI 任务中准确使用 12 个 mkl 线程,从而不会被系统杀死,但仍保持最大效率。