我正在尝试运行混合OpenMP/MPI作业,以便将OpenMP线程按核心分离(每个核心只有一个线程)。我看到其他答案使用numa-ctl和bash脚本来设置环境变量,但我不想这样做。
我希望能够仅通过在命令行上设置OMP_NUM_THREADS和/或OMP_PROC_BIND以及mpiexec选项来实现此目的。我已经尝试了以下内容 - 假设我想要2个MPI进程,每个进程有2个OpenMP线程,并且每个线程都在单独的核心上运行,因此我需要4个核心。
我希望能够仅通过在命令行上设置OMP_NUM_THREADS和/或OMP_PROC_BIND以及mpiexec选项来实现此目的。我已经尝试了以下内容 - 假设我想要2个MPI进程,每个进程有2个OpenMP线程,并且每个线程都在单独的核心上运行,因此我需要4个核心。
OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2
这样分割任务,只有两个进程在工作,并且它们都在同一个CPU上运行,因此它们每个进程只使用大约25%的CPU。如果我尝试:
OMP_PROC_BIND=false OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2
那么,我只是得到了两个独立的MPI进程,每个进程都在使用100%或超过100%的CPU处理能力,根据top命令。这似乎没有显示不同的核心用于OpenMP线程。
我该如何强制系统将单独的线程放置在单独的核心上?
顺便说一下,lscpu命令输出如下:
-CPU(s): 48
-On-line CPU(s) list: 0-47
-Thread(s) per core: 2
-Core(s) per socket: 12
-Socket(s): 2
-NUMA node(s): 2
mpich
,man mpiexec
中是否提到了绑定的内容? - Gilles Gouaillardet