2016-09-04 5 views
1

Ich habe ein einfaches Programm, das mit MPI mehrere kleine Arrays zu einem großen zusammenfassen soll.Ungültiger Zeiger- und Segmentierungsfehler bei Verwendung von MPI_Gather in Fortran

Ich habe einige Erfahrung mit MPI in C, aber für Fortran 90 scheint nichts zu funktionieren. Hier ist, wie ich kompilieren (ich benutze ifort) und führen Sie es:

mpif90 test.f90 -check all && mpirun -np 4 ./a.out 
      1   12 
      3   12 
      3 Errorcode:   0 
      1 Errorcode:   0 
      0   12 
      2   12 
      2 Errorcode:   0 
      0 Errorcode:   0 
*** Error in `./a.out': free(): invalid pointer: 0x0000000000a25790 *** 

=================================================================================== 
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES 
= PID 10889 RUNNING AT LenovoX1kabel 
= EXIT CODE: 6 
= CLEANING UP REMAINING PROCESSES 
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES 
=================================================================================== 

=================================================================================== 
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES 
= PID 10889 RUNNING AT LenovoX1kabel 
= EXIT CODE: 6 
= CLEANING UP REMAINING PROCESSES 
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES 
=================================================================================== 

Was mache ich falsch? Manchmal bekomme ich dieses Zeigerproblem, manchmal werde ich einen Segmentierungsfehler machen, aber für mich sieht es nicht so aus, als würden sich die ifort-Prüfungen beschweren.

Alle Fehlercodes sind 0, also bin ich mir nicht sicher, wo ich falsch liege.

+1

Wenn Sie 'Verwendung mpi' statt' include ‚mpif.h'' die Compiler für bestimmte Arten von Fehlern überprüfen können (abhängig von der Version der Bibliothek). –

+0

Ich habe es geändert, aber abgesehen von zwei ungenutzten Variablen bekomme ich keine Fehler/Warnungen. – Stein

Antwort

2

Sie sollten niemals die Anzahl der Prozesse in MPI-Kollektiven angeben. Das ist eine einfache Faustregel.

Daher ist die Zeile n_procs * BUFSIZE eindeutig falsch.

Und in der Tat des Handbuch erklärt, dass: recvcountAnzahl der Elemente für jeden einzelnen Empfang (integer, an der Wurzel nur signifikant).

Sie sollten einfach BUFSIZE verwenden. Dies gilt auch für C und Fortran.

+0

Das scheint richtig zu sein, aber sind dann alle Fehlercodes 0? – Stein

+1

Die Fehlercodes überprüfen nur auf bestimmte Fehler. Standardmäßig werden sie überhaupt nicht verwendet. Wenn ein Programm erkannt wird, wird das Programm sofort gestoppt. Siehe http://beige.ucs.indiana.edu/I590/node85.html –

Verwandte Themen