c++ MPI未使用请求的线程数运行

3duebb1j  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(219)

我正在尝试运行下面的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绑定 * 做些什么,我看到在同一主题的一些答案中提到了这一点(12),但other answers完全排除了这些选项,所以我不确定这是否是正确的方法。

atmip9wb

atmip9wb1#

mpirun -np 1 ./example为您的程序分配一个内核(因此20个线程最终分时):这是Open MPI的默认行为(例如,使用-np 1-np 2运行时,每个MPI进程1个内核)。
./example(例如,单例模式)应使用所有可用内核,除非您已经在子集上运行。
如果您想使用mpirun的所有可用内核,您可以

mpirun --bind-to none -np 1 ./example

相关问题