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.
Können Sie nach einem [MCV] (https://stackoverflow.com/help/mcve)? – atru
Ich werde versuchen onde Ich komme nach Hause –
Warum malloc '' global_sample_receiver' und überschreiben Sie es dann die Zeile nach? –