2017-01-04 4 views
1

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!

+1

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. –

+0

Warum verwenden Sie 'integer (art = 4)' anstelle von 'integer'? Nicht nur ist es weniger tragbar und hässlich, sondern auch viel länger ... –

+0

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. –

Antwort

0

Schließlich d_1999 zur Verfügung gestellt eine link, die mir genug Informationen gibt, um dieses Problem zu lösen. Ich muss nur das Verbindungsflag zu $ ​​LINK_MPIS ändern, und dann kann ich den zweiten Beispielcode problemlos ausführen.

Verwandte Themen