OpenACC + MPI Fortran 程序入门

Getting started with OpenACC + MPI Fortran program

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

我有几个初学者级别的问题:

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

正如@Vladimir F 指出的那样,您的问题非常广泛,因此如果您对具体要点有进一步的疑问,您应该考虑单独发布每个要点。也就是说,我会尽力回答每个问题。

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