2011-04-07 28 views
3

這是我的第一個問題在這裏在stackoverflow。我有兩個進程,一個根0和一個從機1.從機分配一個二維數組(CHUNK_ROWS + 2,CHUNK_COLUMNS + 2)並且想發送一個[CHUNK_ROWS] [CHUNK_COLUMNS]子陣列。 Root分配一個2d數組(ROWS,COLUMNS)並接收想要從ddd [0] [0]存儲的子數組並打印它。結果我得到它是錯誤的。爲什麼? 我知道這是一個無意義的代碼,但它只是一個簡單的程序,應該可以幫助我處理更復雜的項目。 這裏代碼:MPI_Type_create_subarray和MPI_Send

#include <mpi.h> 
#include <iostream> 
using namespace std; 

#define ROWS 10 
#define COLUMNS 10 
#define CHUNK_ROWS 5 
#define CHUNK_COLUMNS 5 
#define TAG 0 

int** alloca_matrice(int righe, int colonne) 
{ 
int** matrice=NULL; 
int i; 

// per allocare la matrice devo fare in questo modo al fine di avere le righe contigue in memoria 
// e poter così utilizzare il tipo 'colonna' che definisco con MPI_Type_Vector() 
matrice = (int **)malloc(righe * sizeof(int*)); 

if(matrice != NULL){ 
    matrice[0] = (int *)malloc(righe*colonne*sizeof(int)); 
    if(matrice[0]!=NULL) 
     for(i=1; i<righe; i++) 
      matrice[i] = matrice[0]+i*colonne; 
    else{ 
     free(matrice); 
     matrice = NULL; 
    } 
} 
else{ 
    matrice = NULL; 
} 
return matrice; 
} 


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

int my_id, numprocs,length,i,j; 
int ndims, sizes[2],subsizes[2],starts[2]; 
int** DEBUG_CH; 
int** ddd; 
char name[BUFSIZ]; 
MPI_Datatype subarray; 
MPI_Status status; 
MPI_Init(&argc, &argv) ;     // Chiamata obbligatoria di inizializzazione  
MPI_Comm_rank(MPI_COMM_WORLD, &my_id) ;  // Ottiene l'identificativo del processo 
MPI_Comm_size(MPI_COMM_WORLD, &numprocs) ; // Ottiene quanti processi sono attivi 
MPI_Get_processor_name(name, &length);  // Il nome del nodo dove il processo ? in esecuzione 



if(my_id==1){ 
    //creo una sottomatrice ripulita dalle ghost cells 
    ndims=2; 
    sizes[0] = CHUNK_ROWS+2; 
    sizes[1] = CHUNK_COLUMNS+2; 
    subsizes[0] = CHUNK_ROWS; 
    subsizes[1] = CHUNK_COLUMNS; 
    starts[0] = 1; 
    starts[1] = 1; 
    MPI_Type_create_subarray(ndims,sizes,subsizes,starts,MPI_ORDER_C,MPI_INT,&subarray); 
    MPI_Type_commit(&subarray); 

    DEBUG_CH = alloca_matrice(CHUNK_ROWS+2,CHUNK_COLUMNS+2); 
    for(i=0; i<CHUNK_ROWS+2; i++){ 
     for(j=0; j<CHUNK_COLUMNS+2; j++){ 
      if(i==0 || i==CHUNK_ROWS+1 || j==0 || j==CHUNK_COLUMNS+1) 
       DEBUG_CH[i][j] = 5; 
      else 
       DEBUG_CH[i][j] = 1; 
     } 
    } 
    MPI_Send(DEBUG_CH,1,subarray,0,TAG,MPI_COMM_WORLD); 
    MPI_Type_free(&subarray); 
} 
if(my_id==0){ 
    //creo una sottomatrice ripulita dalle ghost cells 
    ndims=2; 
    sizes[0] = ROWS; 
    sizes[1] = COLUMNS; 
    subsizes[0] = CHUNK_ROWS; 
    subsizes[1] = CHUNK_COLUMNS; 
    starts[0] = 0; 
    starts[1] = 0; 
    MPI_Type_create_subarray(ndims,sizes,subsizes,starts,MPI_ORDER_C,MPI_INT,&subarray); 
    MPI_Type_commit(&subarray); 

    ddd = alloca_matrice(ROWS,COLUMNS); 
    MPI_Recv(ddd[0],1,subarray,1,TAG,MPI_COMM_WORLD,&status); 
    MPI_Type_free(&subarray); 
    for(i=0; i<CHUNK_ROWS; i++){ 
     for(j=0; j<CHUNK_COLUMNS; j++){ 
      printf("%d ",ddd[i][j]); 
     } 
     printf("\n"); 
    } 
} 
MPI_Finalize();        // Chiusura di MPI. 
return 0; 
} 

在此先感謝。

回答

2

Congratulazioni,你的代碼幾乎是完美的,在MPI_Recv中,MPI_Send中只有一個愚蠢的錯誤。

對於發送,您有

MPI_Send(DEBUG_CH,1,subarray,0,TAG,MPI_COMM_WORLD); 

而爲RECV,你有

MPI_Recv(ddd[0],1,subarray,1,TAG,MPI_COMM_WORLD,&status); 

第二個是正確的。您需要發送指向數據開始位置的指針;這不是DEBUG_CH,它是一個指向整數的指針,但是與ddd一樣,它是&(DEBUG_CH [0] [0]),或者等同於DEBUG_CH [0]。

+0

謝謝喬納森。有用!現在我編輯了一個類似問題的問題。也許這不是使用stackoverflow的正確方法。我正在嘗試學習。 – Riff 2011-04-07 17:30:02

+0

將它作爲第二篇文章可能會更好,因爲它現在是一個完全不同的問題。 – 2011-04-07 18:00:33

+0

好的。感謝您的建議。 – Riff 2011-04-07 18:06:28