Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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

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
C++ 为C/C+永久分配MPI通信器+;_C++_Fortran_Mpi_Interop_Openmpi - Fatal编程技术网

C++ 为C/C+永久分配MPI通信器+;

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)::通信 结束子例程

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)::通信
结束子例程重用\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(简单阵列访问)中非常有效因此,除非你有证据表明这是一个瓶颈,否则你应该省下精力去做一些更耗时的任务。这就解决了问题。我非常感谢你。网上的文档非常稀少。