2017-12-17 12 views
1

Ich implementiere den Chan und Dehne Sortieralgorithmus mit MPI und dem CGM realistischen parallelen Modell. Bis jetzt erhält jeder Prozess N/p-Zahlen vom ursprünglichen Vektor, jeder Prozess sortiert dann seine Zahlen sequentiell unter Verwendung der schnellen Sortierung, jeder Prozess erzeugt dann eine Probe von seinem lokalen Vektor (die Probe hat die Größe p), jeder Prozess sendet dann seine Probe vorbei zu P0; P0 sollte alle Samples in einem größeren Vektor der Größe p * p empfangen, damit Daten von allen Prozessoren aufgenommen werden können. Dies ist, wo ich feststecke, scheint es zu funktionieren, aber aus irgendeinem Grund, nachdem P0 alle Daten erhält, die es mit Signal: Segmentation fault (11) verlässt. Vielen Dank.Versuch, einen Vektor mit MPI_Recv zu empfangen

Hier ist der relevante Teil des Codes:

// Step 2. Each process calculates it's local sample with size comm_sz 
     local_sample = create_local_sample(sub_vec, n_over_p, comm_sz); 

// Step 3. Each process sends it's local sample to P0 
     if (my_rank == 0) { 
      global_sample_receiver = (int*)malloc(pow(comm_sz,2)*sizeof(int)); 
      global_sample_receiver = local_sample; 
      for (i = 1; i < comm_sz; i++) { 
       MPI_Recv(global_sample_receiver+(i*comm_sz), comm_sz, MPI_INT, 
       i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
      } 
     } else { 
      MPI_Send(local_sample, comm_sz, MPI_INT, 0, 0, MPI_COMM_WORLD); 
     } 

     printf("P%d got here\n", my_rank); 

     MPI_Finalize(); 

Was lustig ist, ist, dass jeder Prozess printf("P%d got here\n", my_rank); und daher druckt das Terminal den Befehl reachs. Auch global_sample_receiver enthält die Daten, die es am Ende enthalten soll, aber das Programm ist noch mit einem Segmentierungsfehler beendet. Hier

ist die Ausgabe:

P2 got here 
P0 got here 
P3 got here 
P1 got here 
[Krabbe-Ubuntu:05969] *** Process received signal *** 
[Krabbe-Ubuntu:05969] Signal: Segmentation fault (11) 
[Krabbe-Ubuntu:05969] Signal code: Address not mapped (1) 
[Krabbe-Ubuntu:05969] Failing at address: 0x18000003e7 
-------------------------------------------------------------------------- 
mpiexec noticed that process rank 0 with PID 5969 on node Krabbe-Ubuntu 
exited on signal 11 (Segmentation fault). 
-------------------------------------------------------------------------- 

Edit: Ich habe das Problem gefunden, stellt sich heraus, local_sample auch eine malloc benötigt.

+1

Können Sie nach einem [MCV] (https://stackoverflow.com/help/mcve)? – atru

+0

Ich werde versuchen onde Ich komme nach Hause –

+0

Warum malloc '' global_sample_receiver' und überschreiben Sie es dann die Zeile nach? –

Antwort

2

Das Problem ist, dass Sie global_sample_receiver (das ist ein Zeiger) mit (die ein anderer Zeiger ist) auf Rang Null überschreiben.

Wenn Sie die ersten comm_sz Elemente global_sample_receiver mit den ersten comm_sz Elemente aus local_sample setzen wollen, dann müssen Sie die Daten kopieren (z nicht der Zeiger) manuell.

memcpy(global_sample_receiver, local_sample, comm_sz * sizeof(int)); 

aber sagen, dass die natürliche MPI Weg, dies zu tun, ist über MPI_Gather(). Hier

ist, was Schritt 3 würde wie folgt aussehen:

// Step 3. Each process sends it's local sample to P0 
if (my_rank == 0) { 
    global_sample_receiver = (int*)malloc(pow(comm_sz,2)*sizeof(int)); 
} 
MPI_Gather(global_sample_receiver,comm_sz, MPI_INT, local_sample, comm_sz, MPI_INT, 0, MPI_COMM_WORLD); 
Verwandte Themen