我正在尝试运行一个混合的OpenMP / MPI作业,以便OpenMP线程被核心(每个内核只有一个线程)分隔。我看到了使用numa-ctl和bash脚本设置环境变量的其他答案,我不想这样做。
我希望仅通过在命令行上设置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进程,每个进程的CPU功率都是100%或100%以上,根据top的说法。这似乎没有显示用于OpenMP线程的不同内核。
如何迫使系统将不同的线程放在不同的核心上?
国际印刷公司打印:
-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
发布于 2017-12-22 17:03:35
实际上,我希望你的第一个例子能奏效。在这里设置OMP_PROC_BIND=true
是很重要的,这样当固定OpenMP的线程时,OpenMP就会保持在来自MPI进程的CPU绑定中。
根据批处理系统和MPI实现,可能有非常独立的方法来设置这些东西。
此外,超线程,或者通常每个内核都显示为“核心”的多个硬件线程,可能是问题的一部分,因为当两个进程在一个内核的两个超级线程上运行时,您将永远看不到200%的问题。
这里是一个通用的解决方案,我在为某些MPI和某些系统上的OpenMP实现计算这些东西时使用。有来自Cray的文档,其中包含一个非常的帮助程序来快速解决这些问题,它被称为xthi.c
、搜索文件名或从这里粘贴它(不确定在这里粘贴它是否合法.)。用下列方法汇编:
mpicc xthi.c -fopenmp -o xthi
现在我们可以看到到底发生了什么,例如,在带有超线程的2x8核心Xeon和基于MPICH的Intel MPI (基于MPICH)上:
$ OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2 ./xthi
Hello from rank 0, thread 0, on localhost. (core affinity = 0,16)
Hello from rank 0, thread 1, on localhost. (core affinity = 1,17)
Hello from rank 1, thread 0, on localhost. (core affinity = 8,24)
Hello from rank 1, thread 1, on localhost. (core affinity = 9,25)
正如您所看到的,core意味着一个核心的所有超线程。请注意,默认情况下,mpirun
也是如何将它引脚不同的套接字。在OMP_PLACES=threads
中,每个核心都有一个线程:
$ OMP_PROC_BIND=true OMP_PLACES=threads OMP_NUM_THREADS=2 mpiexec -n 2 ./xthi
Hello from rank 0, thread 0, on localhost. (core affinity = 0)
Hello from rank 0, thread 1, on localhost. (core affinity = 1)
Hello from rank 1, thread 0, on localhost. (core affinity = 8)
Hello from rank 1, thread 1, on localhost. (core affinity = 9)
关于OMP_PROC_BIND=false
(第二个例子),我得到:
$ OMP_PROC_BIND=false OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2 ./xthi
Hello from rank 0, thread 0, on localhost. (core affinity = 0-7,16-23)
Hello from rank 0, thread 1, on localhost. (core affinity = 0-7,16-23)
Hello from rank 1, thread 0, on localhost. (core affinity = 8-15,24-31)
Hello from rank 1, thread 1, on localhost. (core affinity = 8-15,24-31)
在这里,每个OpenMP线程都获得一个完整的套接字,因此MPI级别仍然可以在不同的资源上运行。然而,在一个进程中的OpenMP线程可以由操作系统在所有内核中进行广泛的调度。这与在我的测试系统上设置OMP_NUM_THREADS=2
是一样的。
同样,这可能取决于特定的OpenMP和MPI实现和版本,但我认为您会很容易地了解上面的描述是怎么回事。
希望这能有所帮助。
发布于 2017-12-25 00:42:49
你可以试试这个
OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -bind-to core:2 -n 2 ./xthi
MPI任务绑定在两个核心上,OpenMP运行时将(希望)将每个线程绑定到分配给MPI任务的单个核心。
为了检查MPI绑定是否正常,您可以简单地
$ mpiexec -np 2 -bind-to core:2 grep Cpus_allowed_list /proc/self/status
Cpus_allowed_list: 0-1
Cpus_allowed_list: 2-3
https://stackoverflow.com/questions/47821498
复制相似问题