c++ - MPI:如何启动将在不同线程中执行的三个函数

标签 c++ multithreading mpi

我有 3 个功能和 4 个核心。我想使用 MPI 和 C++ 在新线程中执行每个函数 我写这个

int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
size--;
if (rank == 0)
{
    Thread1();
}
else 
{
    if(rank == 1)
    {
        Thread2();
    }
    else
    {
        Thread3();
    }
}
MPI_Finalize();

但它只执行 Thread1()。我必须如何更改代码?

谢谢!

最佳答案

打印以筛选变量 size 的当前值(可能没有递减),您会发现 1。即:“有 1 进程正在运行”。

您可能以错误的方式运行编译后的代码。考虑使用 mpirun(或 mpiexec,取决于您的 MPI 实现)来执行它,即

 mpirun -np 4 ./MyCompiledCode

-np 参数指定您将启动的进程数(这样做,您的 MPI_Comm_size 将如您所期望的那样为 4)。


不过目前,由于 C++,您没有使用任何明确的东西。您可以考虑 MPI 的一些 C++ 绑定(bind),例如 Boost.MPI .


我在 code 上做了一些工作你提供。我稍微改变了一下,生成了 this 工作 mpi 代码(我用大写字母提供了一些需要的更正)。

仅供引用:

  • 编译(在 gcc、mpich 下):

     $ mpicxx -c mpi1.cpp 
     $ mpicxx -o mpi1 mpi1.o
    
  • 执行

    $ mpirun -np 4 ./mpi1
    
  • 输出

    size is 4
    size is 4
    size is 4
    2 function started.
    thread2
    3 function started.
    thread3
    3 function ended.
    2 function ended.
    size is 4
    1 function started.
    thread1
    1 function ended.
    

请注意 stdout 可能被搞砸了。

您确定您以正确的方式编译代码吗?

关于c++ - MPI:如何启动将在不同线程中执行的三个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13108937/

相关文章:

c++ - MPI_Cart_Shift.Corner 邻域

c++ - 全局指针变量如何存储在内存中?

c++ - 构造函数不能是虚拟的

c++ - C++ 中的图/边类构造函数

java - 线程-使用标志解锁锁,然后尝试/最终

python - 我不明白Python并发.futures

c - 动态检测两个处理器何时准备好在 MPI 中进行通信

c++ - 使用 SecureZeroMemory() 真的有助于提高应用程序的安全性吗?

python - MQTT 订阅在多线程中无法正常工作

python - 是否可以使用 MPI 将数据从 Fortran 程序发送到 Python?