2016-01-07 54 views
0

我試圖寫與MPI C程序,主控進程使兩個2D陣列。矩陣乘法使用MPI(在C)代碼不工作超過6個節點

第一矩陣(稱爲A)的行被分發到所有從節點(使用MPI_Scatter)和第二矩陣(稱爲B)被複制到所有從節點(使用MPI_Bcast)。

矩陣A的行被複制到另一個一維數組中,並乘以A和矩陣B的行。使用MPI_Gather在第三個二維數組(稱爲C)中聚集乘法結果。

它正常工作時,我輸入4個或5個節點和4×4或5×5大小的陣列。 例如,它正常工作時,我輸入像命令

$mpiexec -n 5 -f machinefile ./mpi_test3 5 

( - >的第二個5含義是陣列的尺寸這意味着兩個5×5矩陣的乘法)

但它當我輸入6個以上的節點和6 * 6大小時沒有工作。 例如,

$mpiexec -n 6 -f machinefile ./mpi_test3 6 

我的代碼像這樣。

#include <stdio.h> 
#include <stdlib.h> 
#include <mpi.h> 
#include <time.h> 
    int main(int argc, char* argv[]) 
    { 
     int i, j, k,m, ran, size, myrank, nprocs; 
     int a[size][size], b[size][size], c[size][size],ar[size],cr[size]; 
     ran=10; 
     size= atoi(argv[1]); 
     MPI_Init(&argc,&argv); 
     MPI_Comm_size(MPI_COMM_WORLD, &nprocs); 
     MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    //Initialization of Receive Buffer 
     for(i=0;i<size;++i){ 
      cr[i]=0; 
     } 
    // make random values and put it into the two Matrix 
    if(myrank==0){ 
     srand((unsigned)time(NULL)); 
     for(i=0; i<size; ++i) 
     { 
       for(j=0; j<size; ++j) 
       { 
        a[i][j]= rand()%ran+1; 
        b[i][j]= rand()%ran+1; 
       } 
     } 

    } 
    //MPI SCATTER & BROAD CAST 
    MPI_Scatter(a,size,MPI_INT,&ar,size,MPI_INT,0,MPI_COMM_WORLD); 
    MPI_Bcast(b,size*size,MPI_INT,0,MPI_COMM_WORLD); 
    for(i=0;i<size;i++) 
    { 
      for(j=0;j<size;++j) 
      { 
        cr[i]+=ar[j]*b[j][i]; 
      } 
    } 
    MPI_Gather(cr,size,MPI_INT,c,size,MPI_INT,0,MPI_COMM_WORLD); 
    //Print the Result of Multiplication 
    if(myrank==0){ 
    printf("\t Result of Multiplication \n"); 
    for(i=0; i<size; ++i){ 
      for(j=0; j<size; ++j) 
      { 
        printf("%d ",c[i][j]); 
      } 
      printf("\n"); 
    } 
} 

    MPI_Finalize(); 
return 0; 
} 

和我的machineFile這樣。

clus15:2 
clus16:2 
clus17:2 
clus18:2 

我的代碼有什麼問題?

+1

我想你必須在定義數組大小之前設置'size'的值('size = atoi(argv [1]);')。 – milevyo

+0

謝謝,它工作正常! 這只是簡單的錯誤,但我沒有找到.. –

回答

1

在定義數組之前需要定義大小。

int a[size][size], b[size][size], c[size][size],ar[size],cr[size]; 

此時,size是未定義的變量,在函數進入之前,這些數組在堆棧上分配。

int a[atoi(argv[1])][atoi(argv[1])]...,cr[atoi(argv[1])]; 

此外,知道並非所有編譯器都支持在函數中初始化具有可變大小的數組。

,或者,你可以動態地分配這些陣列,以下列方式:

int **a, **b, **c, **ar, *cr; 
/* Be sure to check return value of malloc after each call */ 
a = malloc(sizeof(*a)*size); 
b = malloc(sizeof(*b)*size); 
c = malloc(sizeof(*c)*size); 
ar = malloc(sizeof(*ar)*size); 
cr = malloc(sizeof(*cr)*size); 
/* Be sure to check return value of malloc after each call */ 
for (int i = 0 ; i < size ; i++) 
    a[i] = malloc(sizeof(**a)*size) 
    b[i] = malloc(sizeof(**b)*size) 
    c[i] = malloc(sizeof(**c)*size) 
    ar[i] = malloc(sizeof(**ar)*size) 

目前您是在不確定的行爲境界,因爲數組實際上並非你想要的大小初始化,但具有非確定性值,它在初始化之前駐留在大小上。

嘗試

printf("Size of cr: %d\n", (sizeof(cr)/sizeof(cr[0])); 

在主函數中,看看是否數組大小等於你輸入的參數。

+0

感謝您的回答。它現在工作正常! –