【发布时间】:2017-07-20 17:09:30
【问题描述】:
我正在尝试将并行 MPI Fortran 程序链接到也使用 MPI 的并行 C 库。软件架构是以 Fortran 为中心的,所以我试图尽可能多地保留 Fortran 方面。
所以我需要将 C 例程传递给 MPI 通信器的句柄。它们的形式是
int CFunction(int *something, MPI_Comm *Ccomm)
MPI 带有将 Fortran 转换为 C 通信器句柄的接口:
MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
但是,这些例程应该从 C 中调用,所以现在我必须添加 C 包装函数,我可以将 Fortran 通信器传递给:
int CFunction_FMPI(int *something, MPI_Fint *Fcomm)
{ MPI_Comm Ccomm; int status;
Ccomm = MPI_Comm_f2c(*Fcomm); // Convert Fortran->C communicator
status = CFunction(*something,*Ccomm); // Call original function
return status;
}
然后我必须使用 Fortran 的 C 绑定编写第二个接口——CFunction_FMPI,以允许从 Fortran 调用它。
我的问题是:有没有更好的方法来做到这一点,即避免使用 Fortran->C 通信器转换的 C 包装器?我认为直接从 Fortran 调用MPI_Comm_f2c 并将结果存储在type(c_ptr) 或integer(c_int) 变量中是最好的,但我无法做到这一点,因为MPI_Comm 之间没有直接/通用的绑定类型和 Fortran。
【问题讨论】:
标签: c fortran mpi fortran-iso-c-binding fortran2003