2016-06-30 5 views
0

OpenMPIとFortranの使用方法を学習中です。 OpenMPIのドキュメントを利用して、私は単純なクライアント/サーバプログラムを作成しようとしました。しかし、私はそれを実行したとき、私はクライアントからの次のエラーを取得する:"ORTE_ERROR_LOG:ファイルdpm_orte.cの167行目に見つかりません" OpenMPIを利用したFortranプログラムがクラッシュする

[Laptop:13402] [[54220,1],0] ORTE_ERROR_LOG: Not found in file dpm_orte.c at line 167 
[Laptop:13402] *** An error occurred in MPI_Comm_connect 
[Laptop:13402] *** reported by process [3553361921,0] 
[Laptop:13402] *** on communicator MPI_COMM_WORLD 
[Laptop:13402] *** MPI_ERR_INTERN: internal error 
[Laptop:13402] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort, 
[Laptop:13402] *** and potentially your MPI job) 
------------------------------------------------------- 
Primary job terminated normally, but 1 process returned 
a non-zero exit code.. Per user-direction, the job has been aborted. 
------------------------------------------------------- 
-------------------------------------------------------------------------- 
mpiexec detected that one or more processes exited with non-zero status, thus causing 
the job to be terminated. The first process to do so was: 
    Process name: [[54220,1],0] 
    Exit code: 17 
-------------------------------------------------------------------------- 

サーバーとクライアントのコードは、以下に見られることができます。

server.f90

program name 
use mpi 
implicit none 

    ! type declaration statements 
    INTEGER :: ierr, size, newcomm, loop, buf(255), status(MPI_STATUS_SIZE) 
    CHARACTER(MPI_MAX_PORT_NAME) :: port_name 

    ! executable statements 
    call MPI_Init(ierr) 
    call MPI_Comm_size(MPI_COMM_WORLD, size, ierr) 
    call MPI_Open_port(MPI_INFO_NULL, port_name, ierr) 
    print *, "Port name is: ", port_name 

    do while (.true.) 
     call MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, newcomm, ierr) 

     loop = 1 
     do while (loop .eq. 1) 
      call MPI_Recv(buf, 255, MPI_INTEGER, MPI_ANY_SOURCE, MPI_ANY_TAG, newcomm, status, ierr) 
      print *, "Looping the loop." 
      loop = 0 

     enddo 

     call MPI_Comm_free(newcomm, ierr) 
     call MPI_Close_port(port_name, ierr) 
     call MPI_Finalize(ierr)  

    enddo 

end program name 

クライアントを。 F90、私はコンパイルするmpif90 server.f90 -o server.outmpif90 client.f90 -o client.outを使用

program name 
use mpi 
implicit none 

    ! type declaration statements 
    INTEGER :: ierr, buf(255), tag, newcomm 
    CHARACTER(MPI_MAX_PORT_NAME) :: port_name 
    LOGICAL :: done 

    ! executable statements 
    call MPI_Init(ierr) 
    print *, "Please provide me with the port name: " 
    read(*,*) port_name 

    call MPI_Comm_connect(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, newcomm, ierr) 

    done = .false. 
    do while (.not. done) 
     tag = 0 
     call MPI_Send(buf, 255, MPI_INTEGER, 0, tag, newcomm, ierr) 
     done = .true. 
    enddo 

    call MPI_Send(buf, 0, MPI_INTEGER, 0, 1, newcomm, ierr) 
    call MPI_Comm_Disconnect(newcomm, ierr) 
    call MPI_Finalize(ierr) 

end program name 

mpiexec -np 1 server.outおよびmpiexec -np 1 client.outを実行してプログラムを実行します。これは、クライアントにポート名を提供するときです(つまり、readの後にEnterを押すとエラーが発生します)。

which dpm_orte.c戻りdpm_orte.c not found

私はLinuxを実行していると私はアーチエクストラからOpenMPIの1.10.3-1を設置。

+0

@ d_1999、私はMPI_Finalize()を移動してとにかく試しましたが、問題は残ります。 – GLaDER

答えて

3

これは簡単なFortranの入力処理ミスであり、MPIとはまったく関係がありません(Open MPIが完全に理解できないというエラーメッセージの他に)。ちょうど右のそれを読んだ後port_nameの値を印刷するclient.f90に行を挿入します。

print *, "Please provide me with the port name: " 
read(*,*) port_name 
print *, port_name 

実際のポート名は2527592448.0;tcp://10.0.1.6,10.0.1.2,192.168.122.1,10.10.11.10:55837+2527592449.0;tcp://10.0.1.6,10.0.1.4,192.168.122.1,10.10.11.10::300出力のようなものであることで2527592448.0になります。リスト指示入力は、区切り文字として;を処理し、その後の読み取りを停止するため、MPI_COMM_CONNECTに渡されたポートアドレスは不完全です。

ソリューションはまた、サーバ内のループがひどく書かれ

read(*,'(A)') port_name 

read(*,*) port_nameを交換することです。 MPI_FINALIZEに複数回電話をかけることはできません。また、直後にMPI_COMM_ACCEPTと呼んでいると、ポートを閉鎖することも悪い考えです。正しいループは次のようになります:

! executable statements 
call MPI_Init(ierr) 
call MPI_Comm_size(MPI_COMM_WORLD, size, ierr) 
call MPI_Open_port(MPI_INFO_NULL, port_name, ierr) 
print *, "Port name is: ", port_name 

do while (.true.) 
    call MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, newcomm, ierr) 

    loop = 1 
    do while (loop .eq. 1) 
     call MPI_Recv(buf, 255, MPI_INTEGER, MPI_ANY_SOURCE, MPI_ANY_TAG, newcomm, status, ierr) 
     print *, "Looping the loop." 
     loop = 0 
    enddo 

    call MPI_Comm_disconnect(newcomm, ierr) 
    call MPI_Comm_free(newcomm, ierr) 
enddo 

call MPI_Close_port(port_name, ierr) 
call MPI_Finalize(ierr) 
+0

'read'の説明には本当にありがとうございます。ループについては、それは良くないことを認識していますが、私は他のエラーにこだわり、より多くのことをしないように気をつけました。再びありがとう! – GLaDER

関連する問題