问题描述
我正在 Fortran2003 中开发一个代码,该代码在很大程度上依赖于一个用 Fortran77 编写的大型、复杂且非常高效的遗留程序的输出。对于新项目的未来发展,旧程序在新程序启动之前不要通过生成大文件来传递数据,而是根据来自新程序的查询实时按需提供数据,这将是有用的。程序。在我见过的所有各种 IPC 机制中,似乎命名管道是最容易实现的,这可以使用 Fortran 内在特性来完成,而且速度也相当快(当然比通过真实文件进行通信要快得多! )
我用两个在流访问中打开同一个 fifo 的可执行文件测试了这个想法,看起来它工作正常:
program Proc1
implicit none
character(len=*),parameter :: DATA_FIFO ="data.fifo"
integer :: i,data_uid
integer,parameter :: N = 100000000
real(kind(1d0)) :: mat(N)
open(newunit=data_uid,file=DATA_FIFO,access="stream")
mat=1.d0
write(*,*) "sending data",sum(mat)
write(data_uid) (mat(i),i=1,N)
close(data_uid)
end program Proc1
program Proc2
implicit none
character(len=*),access="stream")
read(data_uid) (mat(i),N)
write(*,*)"data received",sum(mat)
close(data_uid)
end program Proc2
在实际情况下,我会修改遗留代码,使其成为能够侦听指令管道并将信息读/写到使用新程序打开的数据管道的“恶魔”。当新程序扩展到分布式内存时,每个节点都可以有自己的恶魔。然而,在继续之前,我想就这个方案是否是一个有效的想法得到反馈。如果答案是肯定的,是否有针对此问题的标准实现(即,传统 Fortran 代码之间的 IPC 临时转换为服务器,以及应该并行的新 Fortran 代码)?如果答案是否定的,那么什么是更有效的解决方案,既可以足够通用又不会变得非常复杂(内存共享对我来说看起来很棘手)? 非常感谢您的想法。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)