2013-03-18 72 views
1

這可能是一個非常愚蠢的問題,但我看不到我的錯誤在此代碼...輸出是錯誤的,1個打印:MPI錯誤 - 發生了什麼?

3.000000 - 3.000000 - 3.000000 - 3.000000 - 3.000000 -
3.000000 - 3.000000 - 3.000000 - 3.000000 - 3.000000 -
3.000000 - 3.000000 - 3.000000 - 3.000000 - 3.000000 -
3.000000 - 3.000000 - 3.000000 - 3.000000 - 3.000000 -
3.000000 - 0.000000 - 0.000000 - 0.000000 - 0.000000 -

我需要用MPI_Recv來代替Bcast ... B發生了什麼事? = /這是我的malloc?或者我不能使用MPI_Recv發送整個矩陣?爲什麼整個數組不會進入另一個進程?

#include <stdio.h> 
#include <stdlib.h> 
#include "mpi.h" 

int main(int argc, char **argv){ 
    int rank, size; 
    int lines, cols; 
    int i, j; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    MPI_Status status; 

    lines = 5; 
    cols = 5; 

    if(rank == 0){ 
     double** array = (double**) malloc(lines*sizeof(double*)); 
     for(i=0; i<lines; i++) 
      array[i] = (double*) malloc(cols*sizeof(double)); 

     for(i=0; i<lines; i++) 
      for(j=0; j<cols; j++) 
        array[i][j] = 3; 

     for(i=0; i<lines; i++){ 
      for(j=0; j<cols; j++) 
        printf("%f - ", array[i][j]); 
      printf("\n"); 
     } 

     MPI_Send(&array[0][0], lines*cols, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); 
    } 
    else{ 
     double** arrayNew = (double**)malloc(lines*sizeof(double*)); 
     for (i=0; i<lines; i++) 
       arrayNew[i] = (double*) malloc(cols*sizeof(double)); 

     MPI_Recv(&arrayNew[0][0], lines*cols, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); 

     for(i=0; i<lines; i++){ 
       for(j=0; j<cols; j++) 
         printf("%f - ", arrayNew[i][j]); 
       printf("\n"); 
     } 
    } 
    MPI_Finalize(); 
} 

回答

2

這一直出現,問題是C和多維數組。

的問題是,這條線

MPI_Send(&array[0][0], lines*cols, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); 

告訴MPI發送lines*cols雙打從&(array[0][0])位置開始,同樣這條線

MPI_Recv(&arrayNew[0][0], lines*cols, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); 

告訴MPI接收lines*cols雙打到內存中的起始從位置&(array[0][0])。但是這種配置:

double** arrayNew = (double**)malloc(lines*sizeof(double*)); 
    for (i=0; i<lines; i++) 
      arrayNew[i] = (double*) malloc(cols*sizeof(double)); 

不會使lines*cols的連續數組變成雙數;它使lines陣列的cols雙打,並且這些行可能分散在整個內存。你需要做的是這樣的:

double** array = (double**) malloc(lines*sizeof(double*)); 
    array[0] = (double *)malloc(lines*cols*sizeof(double)); 
    for(i=1; i<lines; i++) 
     array[i] = &(array[0][i*cols]); 

    /* ... */ 

    free(array[0]); 
    free(array); 

分配和空閒內存連續lines*cols塊,你可以發送和接收到。

+0

哦!對,是真的!!我不記得那個,因爲我習慣用[] ...創造完美答案! 非常感謝! = d – user2183693 2013-03-18 21:20:23