【问题标题】:Compiling a standardized MPI shared object编译标准化的 MPI 共享对象
【发布时间】:2019-12-02 16:27:17
【问题描述】:

我用 C++ 编写了一个使用 MPI 并行化的包。但是,由于模板繁多,编译完成需要半个小时左右。对此,自然有不少用户抱怨。

为了解决这个问题,我认为最好的做法是预编译所有代码。然后将所有共享对象捆绑为一个,但不链接到 MPI。最终用户将根据他们的平台获取共享对象,并将其链接到他们系统上的 MPI 实现。

但是在这样做并采取“nm -B --undefined-only”之后。我看到有些符号只在​​ openmpi 中定义(我使用的头文件来自 openmpi),例如 ompi_mpi_op_sum 或 ompi_mpi_int。

虽然我在头文件中使用标准定义,但有一些宏可以做到这一点:

MPI_Sum-> ompi_mpi_op_sum MPI_Int-> ompi_mpi_int

我环顾四周,找不到任何关于这个主题的东西。有没有办法克服这个?或解决此问题的其他方法?

【问题讨论】:

  • 长话短说,MPI 是源代码级别的标准。您不能说使用 MPICH 编译您的应用程序并将其与 Open MPI 链接,因为该标准不要求二进制接口。来自同一供应商的两个版本甚至可能不兼容二进制。
  • 这可能会有所帮助:stackoverflow.com/questions/38442254/…

标签: linker shared-libraries mpi


【解决方案1】:

正如@ptb 在 cmets 中指出的那样,有一个类似的线程处理类似的主题:

How to write an MPI wrapper for dynamic loading

在阅读了帖子并对 Bridge 设计模式等进行了进一步研究后,我找到了解决方案:静态 PIMPL(参见https://www.gamedev.net/articles/programming/general-and-gameplay-programming/static-zero-overhead-probably-pimpl-in-c-r4338/

我为遇到相同问题的任何人创建了一个 github 存储库。它绝不是完美的,但我愿意根据要求扩展/改进/概括它。

https://github.com/sinamoeini/mpi_bridge

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2016-10-09
    • 2017-03-24
    • 2018-07-05
    • 2018-04-04
    相关资源
    最近更新 更多