C++ 为C/C+永久分配MPI通信器+;
MPI通信器是用Fortran语言创建的,并传递给C语言,而C语言又将指针(C++ 为C/C+永久分配MPI通信器+;,c++,fortran,mpi,interop,openmpi,C++,Fortran,Mpi,Interop,Openmpi,MPI通信器是用Fortran语言创建的,并传递给C语言,而C语言又将指针(C_ptr)返回到C通信器。这样做是为了避免为每个C功能构建C通信器。但是当我试图在ReuseComm中重用C通信器时,我遇到了分段错误 Fortran模块 模块mymodule 使用mpi 使用,内在::ISO_C_绑定,仅限:C_ptr,C_null_ptr 隐式无 私有的 接口 子例程重用通信(comm)绑定(C,name=“重用通信”) 导入c_ptr 隐式无 类型(c_ptr),意图(in)::通信 结束子例程
C_ptr
)返回到C
通信器。这样做是为了避免为每个C
功能构建C
通信器。但是当我试图在ReuseComm
中重用C
通信器时,我遇到了分段错误
Fortran模块
模块mymodule
使用mpi
使用,内在::ISO_C_绑定,仅限:C_ptr,C_null_ptr
隐式无
私有的
接口
子例程重用通信(comm)绑定(C,name=“重用通信”)
导入c_ptr
隐式无
类型(c_ptr),意图(in)::通信
结束子例程重用\u通信
函数f_MPI_Comm_f2c(Comm)result(optr)bind(C,name=“f_MPI_Comm_f2c”)
导入c_ptr
隐式无
整数,意图(in)::comm
类型(c_ptr)::optr
结束函数f_MPI_Comm_f2c
端接口
类型(c_ptr),save::ccomm=c_null_ptr
public::CreateComm、ReuseComm、ccomm
包含
子例程CreateComm(com)
整数,意图(in)::com
ccomm=f_MPI_Comm_f2c(com)
结束子例程CreateComm
子例程ReuseComm()
呼叫复用通信(ccomm)
结束子例程ReuseComm
结束模块mymodule
Fortran驱动程序
主程序
使用mpi
仅使用定制模块:CreateComm、ReuseComm、ccomm
使用,内部::ISO_C_绑定,仅限:C_ptr
隐式无
整数误差
调用MPI_Init(错误)
调用CreateComm(MPI_COMM_WORLD)
调用ReuseComm()
调用MPI_Finalize(错误)
结束
C++
extern“C”
{
MPI_Comm*f_MPI_Comm_f2c(MPI_Fint*f_句柄)
{
MPI_通信*通信;
comm=(MPI_comm*)malloc(sizeof(MPI_comm));
*comm=MPI_comm_f2c(*f_句柄);
断言(*comm!=MPI_comm_NULL);
int sizep=-1;
MPI_Comm_size(*Comm,&sizep);
std::cout应该是reuse\u comm(MPI\u comm**comm)
?注意MPI\u comm\u f2c()
在开放式MPI(简单阵列访问)中非常有效因此,除非你有证据表明这是一个瓶颈,否则你应该省下精力去做一些更耗时的任务。这就解决了问题。我非常感谢你。网上的文档非常稀少。