【问题标题】:Calling C++ from Fortran with OpenMPI使用 OpenMPI 从 Fortran 调用 C++
【发布时间】:2016-05-11 21:14:52
【问题描述】:

我遇到了一个编译时问题,我已将其简化为以下测试用例。我希望从 fortran 调用 C++ 例程并让 C++ 例程能够识别 MPI。

考虑以下示例代码,

Fortran 主程序:

! -- main.f90
program main
   implicit none
   external return_three
   integer return_three

   write(*,*) return_three()
end program main

C++ 子程序:

// -- subs.cpp
#include <mpi.h>

extern "C"
{
   int return_three_();
}

int return_three_()
{
   return 3;
}

请注意,为了重现问题,我只需要包含mpi.h

使用 GCC 5.3 和 OpenMPI 1.10.1 进行编译(我也检查了 GCC 4.8 和 PGI 15.10)在链接过程中会出现以下问题:

% mpic++ -c subs.cpp
% mpifort -c main.f90
% mpifort -o main subs.o main.o -lstdc++ -lgcc_s
subs.o: In function `MPI::Intracomm::Intracomm()':
subs.cpp:(.text._ZN3MPI9IntracommC2Ev[_ZN3MPI9IntracommC5Ev]+0x14): undefined reference to `MPI::Comm::Comm()'
subs.o: In function `MPI::Intracomm::Intracomm(ompi_communicator_t*)':
subs.cpp:(.text._ZN3MPI9IntracommC2EP19ompi_communicator_t[_ZN3MPI9IntracommC5EP19ompi_communicator_t]+0x19): undefined reference to `MPI::Comm::Comm()'
subs.o: In function `MPI::Op::Init(void (*)(void const*, void*, int, MPI::Datatype const&), bool)':
subs.cpp:(.text._ZN3MPI2Op4InitEPFvPKvPviRKNS_8DatatypeEEb[_ZN3MPI2Op4InitEPFvPKvPviRKNS_8DatatypeEEb]+0x24): undefined reference to `ompi_mpi_cxx_op_intercept'
subs.o:(.rodata._ZTVN3MPI3WinE[_ZTVN3MPI3WinE]+0x48): undefined reference to `MPI::Win::Free()'
subs.o:(.rodata._ZTVN3MPI8DatatypeE[_ZTVN3MPI8DatatypeE]+0x78): undefined reference to `MPI::Datatype::Free()'
collect2: error: ld returned 1 exit status

在我看来,mpifort 缺少一些与 C++ 相关的库。不过,我的理解是 mpifort 应该用于编译 fortran 主程序。针对 OpenMPI 1.10.1 编译的 Intel 16.0 不会出现此问题。

我的问题是:

  • 这里发生了什么?为什么英特尔能够处理此示例代码而 PGI/GCC 却不行?
  • 是否有一种可移植的方式在 fortran 代码中包含带有 MPI 的 C++ 子例程?
  • (如果可能)是否有一种简单的方法可以解决我当前的问题?我正在尝试在我的机器上编译一个包,所以最好添加-lmagicfix 或其他内容。

【问题讨论】:

    标签: c++ gcc fortran openmpi


    【解决方案1】:

    通过在最后一步添加 -lmpi_cxx,我能够使用 GCC 5.3.0 和 openMPI 1.10.2 编译您的代码:

    % mpic++ -c subs.cpp
    % mpifort -c main.f90
    % mpifort -o main main.o subs.o -lstdc++ -lmpi_cxx
    

    原因是 openMPI 包装编译器 mpifort 和 mpic++ 链接到不同的 MPI 库。您可以使用-showme:libs 选项进行检查:

    % mpifort -showme:libs
    mpi_usempif08 mpi_usempi_ignore_tkr mpi_mpifh mpi
    % mpic++ -showme:libs
    mpi_cxx mpi
    

    因此,为了使用 C++ MPI 库,您必须明确告诉 mpifort 链接到它。

    【讨论】:

    • 这似乎正是我想要的,谢谢。
    猜你喜欢
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2016-03-25
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多