Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;ORTE“U ERROR”日志:在第167行的dpm“ORTE.c文件中找不到”;导致使用OpenMPI的Fortran程序崩溃_Fortran_Mpi_Ipc_Openmpi - Fatal编程技术网

&引用;ORTE“U ERROR”日志:在第167行的dpm“ORTE.c文件中找不到”;导致使用OpenMPI的Fortran程序崩溃

&引用;ORTE“U ERROR”日志:在第167行的dpm“ORTE.c文件中找不到”;导致使用OpenMPI的Fortran程序崩溃,fortran,mpi,ipc,openmpi,Fortran,Mpi,Ipc,Openmpi,我正在学习如何使用OpenMPI和Fortran。通过使用OpenMPI文档,我尝试创建一个简单的客户机/服务器程序。但是,当我运行它时,从客户端收到以下错误: [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] *** reporte

我正在学习如何使用OpenMPI和Fortran。通过使用OpenMPI文档,我尝试创建一个简单的客户机/服务器程序。但是,当我运行它时,从客户端收到以下错误:

[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
client.f90

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
我使用
mpif90 server.f90-o server.out
mpif90-client.f90-o client.out
来编译和
mpiexec-np 1 server.out
mpiexec-np 1 client.out
来运行程序。当向客户端提供端口名时(即在
读取后按enter键时),会发生错误

未找到哪个dpm\u orte.c
返回的
dpm\u orte.c


我正在运行Linux,并从Arch Extra安装了OpenMPI 1.10.3-1。

这是一个微不足道的Fortran输入处理错误,与MPI没有任何关系(除了打开MPI输出的错误消息完全不可理解之外)。只需在
client.f90
中插入一行,即可在读取后立即打印
port_name
的值:

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.4192.168.122.1,10.10.11.10::300
输出将为
2527592448.0
。列表定向输入处理
作为分隔符,并在它之后停止读取,因此传递给
MPI\u COMM\u CONNECT
的端口地址不完整

解决方案是将
read(*,*)端口名称
替换为

read(*,'(A)') port_name
此外,服务器中的循环写得很糟糕。您不能多次调用
MPI\u FINALIZE
。关闭端口也是一个坏主意,因为您在之后立即调用
MPI\u COMM\u 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)

这是一个微不足道的Fortran输入处理错误,与MPI无关(除了OpenMPI输出完全不可理解的错误消息)。只需在
client.f90
中插入一行,即可在读取后立即打印
port_name
的值:

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.4192.168.122.1,10.10.11.10::300
输出将为
2527592448.0
。列表定向输入处理
作为分隔符,并在它之后停止读取,因此传递给
MPI\u COMM\u CONNECT
的端口地址不完整

解决方案是将
read(*,*)端口名称
替换为

read(*,'(A)') port_name
此外,服务器中的循环写得很糟糕。您不能多次调用
MPI\u FINALIZE
。关闭端口也是一个坏主意,因为您在之后立即调用
MPI\u COMM\u 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)

@d_1999,我移动了MPI_Finalize()并进行了尝试,但问题仍然存在。@d_1999,我移动了MPI_Finalize()并进行了尝试,但问题仍然存在。非常感谢
阅读
的澄清。至于循环,我意识到它不好,但我被另一个错误卡住了,只是不想做更多。再次感谢你!非常感谢您的
阅读
说明。至于循环,我意识到它不好,但我被另一个错误卡住了,只是不想做更多。再次感谢你!