OpenACC + MPI Fortran 程序入门

Posted

技术标签:

【中文标题】OpenACC + MPI Fortran 程序入门【英文标题】:Getting started with OpenACC + MPI Fortran program 【发布时间】:2022-01-08 14:05:27 【问题描述】:

我有一个工作串行代码和一个工作并行单 GPU 代码通过 OpenACC 并行化。现在我试图通过在多个 GPU 上运行来增加并行度,采用 mpi+openacc 范例。我在 Fortran-90 中编写了我的代码,并使用 Nvidia 的 HPC-SDK 的 nvfortran 编译器对其进行了编译。

我有几个初级问题:

    如何设置编译器环境以开始编写 mpi+openacc 代码。除了 Nvidia 的 HPC-SDK 之外,还有其他要求吗? 假设我有一个在 mpi+openacc 设置下编写的代码,我该如何准确地编译它?我必须编译两次吗?一个用于 cpus (mpif90),一个用于 gpus (openacc)。一个 make 文件或一些编译命令的示例会很有帮助。 当需要GPU-device-1和GPU-device-2之间的通信时,有没有办法直接在它们之间进行通信,或者我应该通过[GPU-device-1] ---> [CPU -host-1] ---> [CPU-host-2] ---> [GPU-device-2] 是否有任何带有 mpi+openacc 实现的示例 Fortran 代码?

【问题讨论】:

欢迎,我建议使用tour 并阅读How to Ask。请不要说您的问题非常广泛,有几个独立的编号点。你通常应该问一个明确的问题。 【参考方案1】:

正如@Vladimir F 指出的那样,您的问题非常广泛,因此如果您对特定点还有其他问题,您应该考虑单独发布每个点。也就是说,我会尽力回答每个问题。

    如果您安装了 NVIDIA HPC SDK,您应该拥有所需的一切。它将包括安装 OpenMPI 以及用于 OpenACC 的 NVIDIA 的 HPC 编译器。如果您也需要,您还将拥有各种数学库。 使用mpif90 编译所有内容。例如,mpif90 -acc=gpu 将使用 OpenACC 构建文件以包含 GPU 支持,而不包含 OpenACC 的文件将正常编译。 MPI 模块应在编译期间自动找到,并将链接到 MPI 库。 您可以使用acc host_data use_device 指令将数据的GPU 版本传递给MPI。我没有使用 MPI 的 Fortran 示例,但它看起来类似于此文件中的调用。 https://github.com/jefflarkin/openacc-interoperability/blob/master/openacc_cublas.f90#L19 此代码同时使用 OpenACC 和 MPI,但不使用我在 3 中引用的 host_data 指令。如果我找到另一个,我会更新这个答案。这是一种常见的模式,但我目前没有可用的开放代码。 https://github.com/UK-MAC/CloverLeaf_OpenACC

【讨论】:

以上是关于OpenACC + MPI Fortran 程序入门的主要内容,如果未能解决你的问题,请参考以下文章

openacc 与 openmp 和 mpi 的区别?

如何在 Fortran 中将 OpenACC 与 cublasDgetrfBatched 接口?

Fortran 90 和 MPI 错误

Fortran 和 MPI 的良好分析器

调用 Fortran 例程的 C MPI 程序崩溃

设备上的 OpenACC 重复数组