2011-02-18 98 views
1

我無法讓MPI_Gatherv與std :: vector一起使用。我已經寫了一個小程序,應該用一個整數的秩+1來填充一個向量(避免0,因爲向量初始化爲0)。這只是一個使用2個MPI進程運行的示例程序,我意識到它不具有可擴展性。問題與MPI_Gatherv爲std :: vector

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


int main(int argc, char **argv) 
{ 
    int my_rank; //rank of process 
    int p;   //number of MPI processes 
    int tag=50;  //Tag for message 

    int X = 32; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &p); 

    std::vector<int> rcvvec(X); 
    std::vector<int> sndvec(X/p); 

    int rcounts[p]; 
    int rdisp[p]; 

    for(int i=0; i<p; ++i) { 
      rcounts[i] = X/p; 
      rdisp[i] = my_rank*(X/p); 
    } 

    for (int i = 0; i < X/p; ++i) 
      sndvec[i] = my_rank+1; 

    MPI_Gatherv(&sndvec.front(), rcounts[my_rank], MPI_INT, &rcvvec.front(), rcounts, rdisp, MPI_INT, 0, MPI_COMM_WORLD); 

    if (!my_rank) { 
      for (int i = 0; i < rcvvec.size(); ++i) { 
        std::cout<<rcvvec[i]<<" "; 
      } std::cout<<std::endl; 
    } 

    MPI_Finalize(); 
} 

我希望rcvvec包含1111111122222222

而是我得到2222222200000000

因此,對於某種原因,它只是在矢量上半年插入過程1的整數。有誰知道這裏發生了什麼?我也試着用一個普通的C風格的數組來實現它,並得到相同的結果。但如果我用C而不是C++編寫它,它就可以工作。這是否對我對C++和MPI的理解失敗?

感謝您的幫助!

回答

1

問題不在於std :: vector;代碼中只有一個計算位移的錯字。這:

for(int i=0; i<p; ++i) { 
     rcounts[i] = X/p; 
     rdisp[i] = my_rank*(X/p); 
} 

應該是這樣的:

for(int i=0; i<p; ++i) { 
     rcounts[i] = X/p; 
     rdisp[i] = i*(X/p); 
} 

因爲它是,秩爲零(在這種情況下是在置換陣列事項的唯一的地方),所有的位移爲零,所以一切都被寫入數組的開始,並且數組的後半部分未被觸及。

相關問題