我正在尝试运行下面的MPI代码示例,该代码启动20个线程并使这些线程在一段时间内保持繁忙状态,但是,当我使用 * nmon * 或 * top * 等工具检查CPU利用率时,我发现只有一个线程在使用。
#include <iostream>
#include <thread>
#include <mpi.h>
using namespace std;
int main(int argc, char *argv[]) {
int provided, rank;
MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided);
if (provided != MPI_THREAD_FUNNELED)
exit(1);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
auto f = [](float x) {
float result = 0;
for (float i = 0; i < x; i++) { result += 10 * i + x; }
cout << "Result: " << result << endl;
};
thread threads[20];
for (int i = 0; i < 20; ++i)
threads[i] = thread(f, 100000000.f); // do some work
for (auto& th : threads)
th.join();
MPI_Finalize();
return 0;
}
我使用 * mpicxx * 编译此代码:mpicxx -std=c++11 -pthread example.cpp -o example
并使用 * mpirun * 运行它:mpirun -np 1 example
.
我使用的是OpenMPI版本4.1.4,它是用posix线程支持编译的(遵循this question的解释)。
$ mpicxx --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
$ mpirun --version
mpirun (Open MPI) 4.1.4
$ ompi_info | grep -i thread
Thread support: posix (MPI_THREAD_MULTIPLE: yes, OPAL support: yes, OMPI progress: no, ORTE progress: yes, Event lib: yes)
FT Checkpoint support: no (checkpoint thread: no)
$ mpicxx -std=c++11 -pthread example.cpp -o example
$ ./example
我的CPU有10个核心和20个线程,并在所有20个线程上运行example code above without MPI。那么,为什么带有MPI的代码不能在所有线程上运行呢?
我怀疑我可能需要对 * MPI绑定 * 做些什么,我看到在同一主题的一些答案中提到了这一点(1、2),但other answers完全排除了这些选项,所以我不确定这是否是正确的方法。
1条答案
按热度按时间atmip9wb1#
mpirun -np 1 ./example
为您的程序分配一个内核(因此20个线程最终分时):这是Open MPI的默认行为(例如,使用-np 1
或-np 2
运行时,每个MPI进程1个内核)。./example
(例如,单例模式)应使用所有可用内核,除非您已经在子集上运行。如果您想使用
mpirun
的所有可用内核,您可以