2017-03-29 3 views
-1

MPI_Send()를 사용하여 순위 0에서 다른 순위로 전송되는 동적 할당 배열 수신 측에서는 동적 배열에 malloc()을 사용하여 메모리가 할당됩니다. MPI_Recv 다른 계급. 이 수신 함수에서 잘못된 버퍼 포인터 오류가 발생합니다.MPI_Recv() 무효 버퍼 포인터

struct graph{ 
    int count; 
    int * array; 
} a_graph; 

int x = 10; 
MPI_Status status; 

//ONLY 2 RANKS ARE PRESENT. RANK 0 SENDS MSG TO RANK 1 

if (rank == 0){ 
    a_graph * my_graph = malloc(sizeof(my_graph)) 
    my_graph->count = x; 
    my_graph->array = malloc(sizeof(int)*my_graph->count); 
    for(int i =0; i < my_graph->count; i++) 
     my_graph->array[i] = i; 
    MPI_Send(my_graph->array,my_graph->count,int,1,0,MPI_COMM_WORLD); 
    free(my_graph->array); 
    free(my_graph); 
    } 
else if (rank == 1){ 
    a_graph * my_graph = malloc(sizeof(my_graph)) 
    my_graph->count = x; 
    my_graph->array = malloc(sizeof(int)*my_graph->count); 
    MPI_Recv(my_graph->array,my_graph->count,int,0,0,MPI_COMM_WORLD,&status) // MPI INVALID BUFFER POINTER ERROR HAPPENS AT THIS RECV 
} 

I 메모리가 모두 보낸 사람에 할당되고 수신기가 아래

+0

[mcve]와 구체적인 오류 메시지를 제공해주십시오. 또한 MPI 구현 및 버전을 포함하는 데 도움이됩니다. – Zulan

+0

귀하의 제안에 따라 질문을 편집했습니다. gcc의 컴파일러 (MPICC) 버전 5.4.0 사용 –

+0

이 예제는 완전하거나 검증 할 수 없습니다. 코드는 원격으로 컴파일 할 수 없습니다. 페이지를 다시 읽으십시오. 또한 특정 오류를 제공하십시오. GCC는 MPI 구현이 아닙니다. – Zulan

답변

0

위를 기록하고 있기 때문에 이런 일이 발생 이유를 이해 해달라고하는 최소한의 작업 및 검증 (MWVE) :

코드는이 개념적으로 유사하다 줄란이 당신에게 제안한 예를 보여줍니다. 향후 질문에 MWVE를 제공해주십시오. 어쨌든 송수신에는 int 대신에 MPI 데이터 유형 MPI_INT을 사용해야합니다.

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

typedef struct graph{ 
    int count; 
    int * array; 
} a_graph; 

int main() 
{ 
    MPI_Init(NULL, NULL); 
    int rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    int x = 10; 
    MPI_Status status; 

    //ONLY 2 RANKS ARE PRESENT. RANK 0 SENDS MSG TO RANK 1 

    if (rank == 0){ 
     a_graph * my_graph = malloc(sizeof(a_graph)); 
     my_graph->count = x; 
     my_graph->array = malloc(sizeof(int)*my_graph->count); 
     for(int i =0; i < my_graph->count; i++) 
      my_graph->array[i] = i; 
     MPI_Send(my_graph->array,my_graph->count,MPI_INT,1,0,MPI_COMM_WORLD); 
     free(my_graph->array); 
     free(my_graph); 
    } 
    else if (rank == 1){ 
     a_graph * my_graph = malloc(sizeof(a_graph)); 
     my_graph->count = x; 
     my_graph->array = malloc(sizeof(int)*my_graph->count); 
     MPI_Recv(my_graph->array,my_graph->count,MPI_INT,0,0,MPI_COMM_WORLD,&status); 
     for (int i=0; i<my_graph->count; ++i) 
     { 
      printf("%i\n", my_graph->array[i]); 
     } 
    } 

    MPI_Finalize(); 

    return 0; 
}