2013-10-16 60 views
0

Hallo Iam試圖用C語言編寫一個simlpe parralel程序,使用MPI。程序應該在數組中找到最大值。根進程應該使用MPI_Scatter向所有進程發送數組塊,然後通過MPI_Gather收集結果。當我運行程序我得到普遍的錯誤是這樣的:MPI_Scatter和MPI_Gather不工作

也許這Unix的錯誤信息會有所幫助: 的Unix錯誤號:14個 錯誤地址

我知道,有一些問題,MPI_Scatter和MPI_Gather或與我發送給這個函數的值。

我試圖找到解決方案,但我什麼也沒找到有用的東西。

這裏是我的代碼:

#include <mpi.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #define BUFSIZE 9 

    int max(int *buf, int N){ 
     int i; 
     int value = 0; 
     for(i=0; i<N; i++){ 
     if (buf[i]>value){ 
      value = buf[i]; 
     } 
     } 
return value; 
} 
int main(int argc, char** argv) 
{ int size, rank; 
    int slave; 
    int *buf; 
    int *buf1; 
    int *buf2;  
    int i, n, value; 
    MPI_Status status; 
    /* Initialize MPI */ 
    MPI_Init(NULL, NULL); 
    /* 
    * Determine size in the world group. 
    */ 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    if ((BUFSIZE % size) != 0) { 
    printf("Wrong Bufsize "); 
    return(0); 
    } 


    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (rank==0) { 
    buf = (int *)malloc(BUFSIZE*sizeof(int)); 
    buf2 = (int *)malloc(size*sizeof(int)); 

    printf("\n Generated array: \n"); 
    for(i=0; i<BUFSIZE; i++){ 
     buf[i] = rand() % 20; 
     printf("%d, ", buf[i]); 
    } 
    printf("\n"); 
    printf("\n Sending values to processes:"); 
    printf("\n -----------------------------"); 
    } 

    buf1 = (int *)malloc((BUFSIZE/size)*sizeof(int)); 

    MPI_Scatter(buf, BUFSIZE/size, MPI_INT, buf1, BUFSIZE/size, MPI_INT, 0, MPI_COMM_WORLD); 

    value = max(&buf1[0], BUFSIZE/size); 

    printf("\n Max from rocess %d : %d \n", rank, max(&buf1[0], BUFSIZE/size)); 

    MPI_Gather(&value, 1, MPI_INT, buf2, 1, MPI_INT, 0, MPI_COMM_WORLD); 

    if (rank == 0){ 
    printf("\n Max value: %d", max(&buf2[0], size)); 
    } 

    MPI_Finalize(); 
    return(0); 
    } 
+2

在最後一個'printf'語句內的'max()'第二次調用中缺少某些內容。 –

+0

最後一個'printf'語句也缺少%d。 – Dusty

+0

你是對的,但它在複製代碼的過程中必須丟失。我可以編譯程序沒有任何問題,但我不能跑它。 –

回答

1

初始化您的指針爲NULL,並跟蹤他們。 使用buf1而不是& buf1 [0],更清楚。 免費的MPI_Finalize(之前緩衝區):

if(bufferPionter != NULL) free(bufferPionter); 

如果事情是錯的指針會在免費通話崩潰。在最大函數中,如果所有數字都小於零,則最大值爲零。我解決這個問題。

int max(int *buf, int N){ 
     int i; 
     int value = N? buf[0] : 0; 
     for(i=0; i<N; i++){ 
     if (buf[i]>value){ 
      value = buf[i]; 
     } 
     } 
return value; 
} 

此致敬禮!