如果要在同一MPI作业中同时启动Fortran程序和Python程序,则必须使用以下方法:
mpiexec -n 1 fortran_program : -n 1 python main.py
Fortran程序将变为MPI等级0,而Python程序将变为MPI等级1。您还可以启动每个可执行文件中的多个,例如:
mpiexec -n 2 fortran_program : -n 4 python main.py
排名0和1来自Fortran程序,排名2至5-来自Python。
还要注意,comm.recv()
在mpi4py其他通信方式,与小写字母(启动comm.send()
,comm.irecv()
等),引擎盖下使用泡菜和实际上序列化Python对象进行操作。这与Fortran代码发送的字符数组不兼容。你必须要使用以大写字母(启动通信方式comm.Send()
,comm.Recv()
等等)上与NumPy阵列操作和接收显式类型信息。不幸的是,我的Python功能很弱,我现在无法提供完整的工作示例,但是MPI部分应该是这样的(未经验证的代码):
# Create an MPI status object
status = MPI.Status()
# Wait for a message without receiving it
comm.Probe(source=0, tag=22, status=status)
# Check the length of the message
nchars = status.Get_count(MPI.CHARACTER)
# Allocate a big enough data array of characters
data = np.empty(nchars, dtype='S')
# Receive the message
comm.Recv([data, MPI.CHARACTER], source=0, tag=22)
# Construct somehow the string out of the individual chars in "data"
在Fortran代码中,您必须指定目标等级1(如果您正在运行一个Fortran可执行文件和一个Python可执行文件)。