2013-10-16 1 views
0

Hallo Iam은 MPI를 사용하여 C 언어로 병렬 프로그램을 작성하려고합니다. 프로그램은 배열에서 최대를 찾아야합니다. 루트 프로세스는 MPI_Scatter를 사용하여 모든 프로세스에 배열 청크를 보내고 MPI_Gather로 결과를 수집해야합니다. 나는이 프로그램을 실행하면이 같은 일반적인 오류가 발생합니다 : MPI_Scatter 및 MPI_Gather는 작동하지 않습니다.

는 아마도이 유닉스 오류 메시지가 도움이 될 것입니다 : 유닉스의 errno : 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 [0] 대신 buf1을 사용하면 더 명확합니다. 와 MPI_Finalize (이전 무료로 버퍼) : 뭔가 포인터에 문제가 있습니다

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

경우 무료 통화에 충돌합니다. max 함수에서 모든 숫자가 0보다 작 으면 maximun은 0입니다. 나는 그것을 고쳤다.

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; 
} 

감사합니다.

관련 문제