2017-01-04 23 views
1

私はFortranコードをいくつかの部分に分割しようとしており、MPIを使用して各部分を並列化したいと考えています。各部分について、IMSLライブラリを使用して最適化問題を解決します(BCONFを使用)。しかし、IMSLライブラリにはMPIに関する独自のサブルーチンがあり、標準MPI開始サブルーチン「Call MPI_INIT(ierror)」を呼び出すことはできません。それはちょうど私に致命的なエラーを与え、プログラムを終了します。IMSLとMPIとの競合

私はこの問題を説明する2つの例を挙げます。各ノードから

例1、印刷の "Hello World":今、私は変更する場合

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!" 

:私はコンパイルしてIMSLライブラリなしで実行すると

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 

、それは私に正しい答えを与えますコードに何も追加せずにIMSLライブラリを追加すると、エラーが発生します。

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. 

最初の例では、chang

例2:直交ノードに

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 
を計算するためにMPIおよび各ノードの使用IMSLライブラリを使用する「LINK_MPIは」問題を治すために、それはここでは、より現実的な例では動作しませんINGの「$のLINK_FNL_STATIC_IMSL」

私はコンパイルして実行すると、プログラムは「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. 

私は$ LINK_MPI、IMSLライブラリサブルーチンでプログラムがクラッシュにリンクオプションを変更した場合:

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 
==================================================    ================================= 

私の学校のスーパーコンピュータのUNIXシステムでこのコードを実行しています。私は、IntelコンパイラとMPICHバージョン3.0.1を使用しています。私の実際のコードは、各ノードでいくつかのIMSLサブルーチンを使用する第2の例と非常によく似ています。それを働かせるために私を助けてもらえますか?ありがとうございました!

+1

私はあなた自身ではなく、mpiを初期化するためにIMSL関数( 'mp_setup()')を使う必要があると思います。例については、[here](https://www.sharcnet.ca/help/index.php/IMSL#Using_IMSL.27s_Built-in_MPI_Functionality)を参照してください - これをテストすることはできませんが、答え。 –

+0

なぜ 'integer'の代わりに' integer(kind = 4) 'を使うのですか?それは移植性が低く、醜いだけでなく、ずっと長いです... –

+0

こんにちはd_1999、私はIMSL関数(mp_setup())を使ってテストしました。プログラムはどこかで止まってしまいます。しかし、あなたが私に与えたリンクの中に解決策が見つかりました。フラグ$ LINK_MPIS($ LINK_MPIではなく)を使用することで、IMSLで共通のMPIサブルーチンを使用できます。どうもありがとうございました!もしあなたが望むなら、それを忘却として掲示するかもしれません。 –

答えて

0

最後に、d_1999linkで、この問題を解決するのに十分な情報が得られました。リンクフラグを$ LINK_MPISに変更するだけで、問題なく2番目のサンプルコードを実行できます。