2017-02-26 16 views
1

我嘗試瞭解MPI_Ibcast是如何工作的。 我想出了一個測試,說明我需要什麼。 它可能不是正確的,因爲我可能不理解Ibcast權用法:MPI-Ibcast的用法

#include <iostream> 
#include <mpi.h> 
#include <string> 
#include <vector> 


using namespace std; 

class A { 
public: 
     int a[3]; 
     MPI_Request request; 
     int tag; 
     A() {} 
     int foo() { 
       int rank; 
       MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
       cout<<rank<<endl; 
       if (rank == 0) 
         tag = 5; 
       MPI_Ibcast(&tag, 1, MPI_INT, 0, MPI_COMM_WORLD, &request); 
     } 
}; 

int main(int argc, char* argv[]) { 
     MPI_Init(&argc, &argv); 
     int rank; 
     MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
     MPI_Status* status = new MPI_Status[2]; 
     MPI_Request* request = new MPI_Request[2]; 
     A* a = new A[2]; 
     for (int i = 0; i < 2; i++) { 
       a[i].request = request[i]; 
     } 

     for (int i = 0; i < 2; i++) { 
       if (i == 0 && rank == 0) { 
         a[0].foo(); 
       }else if (i == 1 && rank == 1) { 
         a[1].foo(); 
       } 
       int a; 
       for (int i = 0; i < 1000; i++) 
         a+=i; 
     } 
     MPI_Waitall(2, request, status); 
     cout <<a[1].tag<<" "<<a[1].tag<<" "<<a[1].tag<<endl; 
     MPI_Finalize(); 
} 

我想看看,如果MPI_Ibcast可以在函數中的第一次迭代被調用,那麼這個函數返回,而在另一個迭代另一個進程也會調用MPI_Ibcast,然後全部結束(標籤將在所有兩個進程中廣播並設置爲5)。我在這裏使用類的原因是,我將它們放在原始程序中,在這裏我嘗試模擬一個小問題。

所以,任務是:在分開的循環中,單獨進程中的單獨實例調用一個函數。其中一些組織成組,組內Ibcast廣播標籤。在這裏,我有一個組和兩個班。也許我應該改正這個例子?

回答

0

我不完全確定你想要做什麼,但這裏是你的例子的固定版本。我糾正了主要的是作爲你沒有等待合適的人的請求......

#include <iostream> 
#include <mpi.h> 

using namespace std; 

class A { 
    public: 
     MPI_Request request; 
     int tag; 
     A() : request(MPI_REQUEST_NULL), tag(-1){} 
     int foo() { 
      int rank; 
      MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
      cout<<rank<<endl; 
      if (rank == 0) 
       tag = 5; 
      MPI_Ibcast(&tag, 1, MPI_INT, 0, MPI_COMM_WORLD, &request); 
     } 
}; 

int main(int argc, char* argv[]) { 
    MPI_Init(&argc, &argv); 
    int rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    A a[2]; 

    for (int i = 0; i < 2; i++) { 
     if (i == 0 && rank == 0) { 
      a[0].foo(); 
     }else if (i == 1 && rank == 1) { 
      a[1].foo(); 
     } 
     int b = 0; 
     for (int i = 0; i < 1000; i++) 
      b+=i; 
    } 
    MPI_Wait(&a[rank].request, MPI_STATUS_IGNORE); 
    cout <<a[1].tag<<" "<<a[1].tag<<" "<<a[1].tag<<endl; 
    MPI_Finalize(); 
} 

這裏是什麼,當我編譯和我的機器上的兩個進程中運行它,它提供了:

~/tmp$ mpiicpc -O0 ibcst.cc 
~/tmp$ mpirun -n 2 ./a.out 
1 
0 
5 5 5 
-1 -1 -1 

現在,它的作品,並希望做你的預期。然而,你對過程組的描述使我相信你應該使用例如MPI_Comm_split()創建幾個子通信器以允許在...內使用集體呼叫...