2017-03-29 98 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 
} 

我不明白爲什麼會這樣,因爲存儲在發送者分配和接收器行列

+0

請提供[mcve]和您得到的具體錯誤消息。它也有助於包含MPI的實現和版本。 – Zulan

+0

我已根據您的建議編輯了該問題。使用gcc的編譯器(MPICC)版本5.4.0 –

+0

該示例既不完整也不可驗證。代碼甚至無法遠程編譯。請仔細閱讀該頁面。還提供了具體的錯誤。 GCC不是MPI實施。 – Zulan

回答

0

下面是一個最小的,工作的,可覈查(MWVE)佐蘭建議你做的例子。請在將來的問題中提供MWVE。無論如何,你需要使用MPI數據類型MPI_INT而不是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; 
}