Ich versuche meinen Fortran Code in mehrere Teile zu teilen und ich möchte jeden Teil mit MPI parallelisieren. Für jeden Teil verwende ich die IMSL-Bibliothek, um ein Optimierungsproblem zu lösen (verwende BCONF). Ich finde jedoch, dass die IMSL-Bibliothek eigene Unterprogramme über MPI besitzt und es mir nicht erlaubt, das Standard-MPI-Start-Unterprogramm "Call MPI_INIT (ierror)" aufzurufen. Es gibt mir nur einen fatalen Fehler und beendet das Programm.Konflikt zwischen IMSL und MPI
Ich gebe zwei Beispiele, um das Problem zu veranschaulichen.
Beispiel 1 print "Hallo Welt" von jedem Knoten:
program main
use mpi
implicit none
integer (kind = 4) error
integer (kind = 4) id
integer (kind = 4) p
call MPI_Init (error)
call MPI_Comm_size (MPI_COMM_WORLD, p, error)
call MPI_Comm_rank (MPI_COMM_WORLD, id, error)
write (*, *) ' Process ', id, ' says "Hello, world!"'
call MPI_Finalize (error)
end program
Wenn ich ohne IMSL Bibliothek kompilieren und ausführen, es gibt mir die richtige Antwort gibt:
mpif90 -o a.out hello_mpi.f90
mpiexec -n 4 ./a.out
Process 3 says "Hello, world!"
Process 0 says "Hello, world!"
Process 2 says "Hello, world!"
Process 1 says "Hello, world!"
Jetzt Wenn ich ändern nichts zu dem Code, sondern einfach IMSL-Bibliothek hinzufügen, wird es den Fehler verursachen:
mpif90 -o a.out hello_mpi.f90 $LINK_FNL_STATIC_IMSL $F90FLAGS
mpiexec -n 4 ./a.out
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
Im ersten Beispiel, chang „$ LINK_FNL_STATIC_IMSL“ ing auf „LINK_MPI“ wird das Problem heilen, aber es funktioniert nicht in einem realistischeren Beispiel hier:
Beispiel 2: Verwendung MPI und jeden Knoten Verwendung IMSL Bibliothek Quadratur Knoten berechnet
program main
USE GQRUL_INT
use mpi
implicit none
integer (kind = 4) error
integer (kind = 4) id
integer (kind = 4) p
real (kind = 8) QW(10), QX(10)
call MPI_Init (error)
call MPI_Comm_size (MPI_COMM_WORLD, p, error)
call MPI_Comm_rank (MPI_COMM_WORLD, id, error)
write (*, *) ' Process ', id, ' says "Hello, world!"'
CALL GQRUL (10, QX, QW)
call MPI_Finalize (error)
end program
Wenn ich kompilieren und ausführen, Programm hält an "MPI_Init":
mpif90 -o a.out hello_mpi.f90 $LINK_FNL_STATIC_IMSL $F90FLAGS
mpiexec -n 4 ./a.out
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** FATAL ERROR 1 from MPI_INIT. A CALL was executed using the IMSL
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
*** dummy routine. Parallel performance needs a functioning MPI
*** library.
Wenn ich die Verknüpfung Option auf $ LINK_MPI ändern, das Programm an der IMSL Bibliothek Unterprogramm stürzt ab:
mpif90 -o a.out hello_mpi.f90 $LINK_MPI $F90FLAGS
mpiexec -n 4 ./a.out
Process 1 says "Hello, world!"
Process 0 says "Hello, world!"
Process 3 says "Hello, world!"
Process 2 says "Hello, world!"
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007EFC178C67E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007EFC16F7BD1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007EFDE2A037E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007EFDE20B8D1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007FBF21C277E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007FBF212DCD1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00000000018D5C75 Unknown Unknown Unknown
a.out 00000000018D3A37 Unknown Unknown Unknown
a.out 000000000188ADC4 Unknown Unknown Unknown
a.out 000000000188ABD6 Unknown Unknown Unknown
a.out 000000000184BCB9 Unknown Unknown Unknown
a.out 000000000184F410 Unknown Unknown Unknown
libpthread.so.0 00007F8084FD67E0 Unknown Unknown Unknown
a.out 000000000178E634 Unknown Unknown Unknown
a.out 000000000178A423 Unknown Unknown Unknown
a.out 0000000000430491 Unknown Unknown Unknown
a.out 000000000042AACD Unknown Unknown Unknown
a.out 00000000004233D2 Unknown Unknown Unknown
a.out 0000000000422FEA Unknown Unknown Unknown
a.out 0000000000422DD0 Unknown Unknown Unknown
a.out 0000000000422C9E Unknown Unknown Unknown
libc.so.6 00007F808468BD1D Unknown Unknown Unknown
a.out 0000000000422B29 Unknown Unknown Unknown
================================================== =================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 174
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
================================================== =================================
Ich führe diesen Code auf einem UNIX-System auf meiner Schule Supercomputer und ich verwende Intel Compiler und MPICH Version 3.0.1. Mein tatsächlicher Code ist dem zweiten Beispiel sehr ähnlich, der einige IMSL-Subroutinen auf jedem Knoten verwendet. Können Sie mir bitte helfen, damit es funktioniert? Vielen Dank!
Ich denke, Sie müssen eine IMSL-Funktion ('mp_setup()') verwenden, um mpi zu initialisieren, anstatt es selbst zu tun. Sehen Sie [hier] (https://www.sharcnet.ca/help/index.php/IMSL#Using_IMSL.27s_Built-in_MPI_Functionality) für ein Beispiel - ich kann das zwar nicht testen, möchte es aber nicht als Post posten eine Antwort. –
Warum verwenden Sie 'integer (art = 4)' anstelle von 'integer'? Nicht nur ist es weniger tragbar und hässlich, sondern auch viel länger ... –
hi d_1999, habe ich getestet mit IMSL-Funktion (mp_setup()) und das Programm wird irgendwo stecken bleiben. Allerdings habe ich die Lösung in dem Link gefunden, den Sie mir gegeben haben. Mit dem Flag $ LINK_MPIS (nicht $ LINK_MPI) kann ich die allgemeinen MPI-Subroutinen mit IMSL verwenden. Vielen Dank! Wenn Sie möchten, können Sie es als Asnwer veröffentlichen. –