我在装有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线程,因此不会被系统杀死但仍保持最大效率。