2017-03-29 2 views
-1

Ich habe einen dynamisch zugewiesenen Array, das von Rank 0 zu anderen Reihen gesendet wird unter Verwendung von MPI_Send() Auf der Empfangsseite wird eine dynamische Speicheranordnung unter Verwendung von malloc zugeordnet wird() MPI_Recv() passiert, auf die anderen Ränge. Bei dieser Empfangsfunktion erhalte ich einen ungültigen Buffer Pointer-Fehler.MPI_Recv() ungültige Pufferzeiger

-Code ist vom Konzept her ähnlich wie diese:

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 
} 

Ich verstehe nicht, warum dieser Speicher in beiden Sender zugeordnet und Empfänger zählt

+0

Bitte geben Sie eine [mcve] und die spezifische Fehlermeldung, die Sie erhalten. Es hilft auch, die MPI-Implementierung und -Version einzuschließen. – Zulan

+0

Ich habe die Frage nach Ihrem Vorschlag bearbeitet. Verwendung des GCC-Compilers (MPICC) Version 5.4.0 –

+0

Das Beispiel ist weder vollständig noch verifizierbar. Der Code kann nicht einmal remote kompiliert werden. Bitte lesen Sie die Seite nochmals sorgfältig durch. Geben Sie auch den spezifischen Fehler an. GCC ist keine MPI-Implementierung. – Zulan

Antwort

0

Unten da passiert, ist eine minimale, Arbeits- und nachprüfbar (MWVE) Beispiel, zu dem Zulan dich vorgeschlagen hat. Bitte geben Sie MWVE in Ihren zukünftigen Fragen an. Wie auch immer, Sie müssen den MPI-Datentyp anstelle von int zum Senden und Empfangen verwenden.

#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; 
} 
Verwandte Themen