强制 MPI 使用指定的编号。核心数
Forcing MPI to use a specified no. of cores
我对 MPI 有点陌生,如果这是一个微不足道的问题,请原谅我。我有一个四核 CPU。我想要 运行 一个在单个内核上使用两个进程的 OpenMPI C++ 程序。有什么办法吗?如果是这样,那又如何呢?我提到了 this link on stack overflow ,其中 很可能 说 可能 是一种方式......如果是这样,那我怎么能做吗?
由于 MPI 生成单独的进程,因此将进程调度到核心上是由您的操作系统 generally/usually 执行的。您仍然可以通过手动将进程的亲和力设置为特定核心来实现您想要的效果。
您可以在 Linux 中使用 sched_setaffinity
函数执行此操作。
要pin一个进程到特定的核心,可以使用以下方法:
#include <mpi.h>
#include <sched.h>
// ...
void pin_to_core(int cpuid) {
cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(cpuid,&set);
sched_setaffinity(0,sizeof(cpu_set_t),&set);
}
// ....
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
pin_to_core(0); // pin process to core 0
// ...
MPI_Finalize();
}
确保在 之后调用此函数 main
函数中调用 MPI_Init
并指定要 pin 的核心进程到。
使用 Open MPI 实现此目的的正确方法是提供一个 rankfile,它告诉库将每个进程放置在何处。以下 rankfile 应该足以满足您的情况:
rank 0=localhost slot=0
rank 1=localhost slot=0
它告诉 Open MPI,两个列都应该在本地主机上 运行 并绑定到 OS CPU 0,这通常是第一个核心。提供rankfile 另外到主机文件或主机列表:
$ mpiexec --host localhost --report-bindings --rankfile ./rankfile -np 2 hostname
[cluster:03247] MCW rank 0 bound to socket 0[core 0]: [B . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .] (slot list 0)
[cluster:03247] MCW rank 1 bound to socket 0[core 0]: [B . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .] (slot list 0)
cluster
cluster
我对 MPI 有点陌生,如果这是一个微不足道的问题,请原谅我。我有一个四核 CPU。我想要 运行 一个在单个内核上使用两个进程的 OpenMPI C++ 程序。有什么办法吗?如果是这样,那又如何呢?我提到了 this link on stack overflow ,其中 很可能 说 可能 是一种方式......如果是这样,那我怎么能做吗?
由于 MPI 生成单独的进程,因此将进程调度到核心上是由您的操作系统 generally/usually 执行的。您仍然可以通过手动将进程的亲和力设置为特定核心来实现您想要的效果。
您可以在 Linux 中使用 sched_setaffinity
函数执行此操作。
要pin一个进程到特定的核心,可以使用以下方法:
#include <mpi.h>
#include <sched.h>
// ...
void pin_to_core(int cpuid) {
cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(cpuid,&set);
sched_setaffinity(0,sizeof(cpu_set_t),&set);
}
// ....
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
pin_to_core(0); // pin process to core 0
// ...
MPI_Finalize();
}
确保在 之后调用此函数 main
函数中调用 MPI_Init
并指定要 pin 的核心进程到。
使用 Open MPI 实现此目的的正确方法是提供一个 rankfile,它告诉库将每个进程放置在何处。以下 rankfile 应该足以满足您的情况:
rank 0=localhost slot=0
rank 1=localhost slot=0
它告诉 Open MPI,两个列都应该在本地主机上 运行 并绑定到 OS CPU 0,这通常是第一个核心。提供rankfile 另外到主机文件或主机列表:
$ mpiexec --host localhost --report-bindings --rankfile ./rankfile -np 2 hostname
[cluster:03247] MCW rank 0 bound to socket 0[core 0]: [B . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .] (slot list 0)
[cluster:03247] MCW rank 1 bound to socket 0[core 0]: [B . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .][. . . . . . . .] (slot list 0)
cluster
cluster