2012-05-30 177 views
0

對於小時即時試圖通過MPI發送2D陣列以不同勢螺紋MPI數據類型。代碼如下(我會留下評論,以表明我已經tryed招數):用於2D陣列

類型定義:

// Define datatype 
//MPI_Type_contiguous(N, MPI_INT, &mpi_vector); 
//MPI_Type_vector(N, N, N, mpi_vector, &mpi_matrix); 
//MPI_Type_vector(N, N, N, MPI_INT, &mpi_matrix); 
//MPI_Type_contiguous(N, MPI_INTEGER, &mpi_vector); 
//MPI_Type_contiguous(N, mpi_vector, &mpi_matrix); 
MPI_Type_vector(N, N, 0, MPI_INTEGER, &mpi_matrix); 
//MPI_Type_commit(&mpi_vector); 
MPI_Type_commit(&mpi_matrix); 

發送和recieving:

int** tmp = new int*[N]; 
switch(r) { 
case T1: 
    inputMatrix(tmp, 2); 
    MPI_Send(tmp, 1, mpi_matrix, T2, 0, MPI_COMM_WORLD); 
    //task_T1(); 
    break; 
case T2: 
    //task_T2(); 
    inputMatrix(tmp, -1); 
    MPI_Recv(tmp, 1, mpi_matrix, T1, 0, MPI_COMM_WORLD, &s); 
    for(int i = 0; i < N; i++) 
    { 
     for(int j = 0; j < N; j++) { 
      cout << " " << tmp[i][j]; 
     } 
     cout << endl; 
    } 
    break; 
} 

我需要有這樣進行到早晨(7小時),我希望SMB能夠幫助我。

+0

,如果你保存你的二維數組作爲行/列優先的順序在單個陣列變得輕鬆了許多。 – suszterpatt

回答

5

MPI 不支持矩陣,其中每行被單獨分配,指針又名陣列行。 MPI工作平陣列,其中行被連續地存儲在存儲器中。使用平面陣列:

int** tmp = ... 

應該成爲

int* tmp = new int[rows*cols]; 

然後tmp[row][col]tmp[row*cols + col]進行訪問。

可以構造從MPI_INT的連續類型的單個行,然後構造從以前的連續式對整個矩陣的連續類型。還可以構造單個連續型的rows*colsMPI_INT元件。第一種方法更靈活,因爲您可能需要稍後發送單個行。