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

时间:2012-10-28 12:53:12

标签: 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()。我该如何更改代码?

谢谢!

2 个答案:

答案 0 :(得分:6)

打印以筛选变量size的当前值(可能不会减少它),您将找到1。那就是:“1进程正在运行”。

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

 mpirun -np 4 ./MyCompiledCode

-np参数指定您将开始的流程数量(这样做,您的MPI_Comm_size将为您所期望的4个。)


目前,由于C ++,您没有明确使用任何内容。您可以考虑MPI的某些C ++绑定,例如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可能已经搞砸了。

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

答案 1 :(得分:2)

问题在于,MPI无法将控制台输入提供给许多进程,而只能进入排名为0的进程。由于main中的前三行:

int main(int argc, char *argv[]){

    int oper;
    std::cout << "Enter Size:";
    std::cin >> oper;           // <------- The problem is right here

    Operations* operations = new Operations(oper);
    int rank, size;
    MPI_Init(&argc, &argv);
    int tid;
    MPI_Comm_rank(MPI_COMM_WORLD, &tid);
    switch(tid)
    {

所有进程,但排名0阻止等待控制台输入,这是他们无法获得的。您应该重写main函数的开头,如下所示:

int main(int argc, char *argv[]){

    int oper;

    MPI_Init(&argc, &argv);
    int tid;
    MPI_Comm_rank(MPI_COMM_WORLD, &tid);

    if (tid == 0) {
       std::cout << "Enter Size:";
       std::cin >> oper;
    }
    MPI_Bcast(&oper, 1, MPI_INT, 0, MPI_COMM_WORLD);

    Operations* operations = new Operations(oper);
    switch(tid)
    {

它的工作原理如下:只有排名0显示提示,然后将控制台输入读入oper。然后执行来自等级oper的{​​{1}}值的广播,以便所有其他进程获得正确的值,创建0对象,然后分支到适当的函数。