4

我读到 clang 编译器可以将 OpenMP 区域卸载到 GPU。但是,我对用clang编译代码的方式感到困惑。我们集群中安装的 clang 版本是 3.9.0(tags/RELEASE_390/final 288133)。我要卸载的代码基本上是矩阵矩阵乘法:

#pragma omp target parallel for  shared(C,P,T) private(i,j,k)
  for (i=0; i<N; i++) {
    for (j=0; j<N; j++) {
      for (k=0; k<N; k++) {
        C[i][j] += P[i][k]*T[k][j];
      }
    }
  }

我正在编译

clang -O3 -fopenmp-targets=x86_64-unknown-linux-gnu mm.c
clang-3.9: warning: argument unused during compilation: '-fopenmp-targets=x86_64-unknown-linux-gnu'

我不知道我安装的 clang 版本是否能够将代码卸载到 GPU 上,如果可以,我该怎么做。欢迎任何评论。

4

2 回答 2

2

从版本 7 开始,clang 支持将 OpenMP 卸载到 Nvidia GPU ( http://releases.llvm.org/7.0.0/tools/clang/docs/ReleaseNotes.html#id12 ):

Clang 获得了对 NVPTX 目标的 OpenMP 4.5 卸载的基本支持。

要为 NVPTX 目标编译程序,请使用以下选项:-fopenmp -fopenmp-targets=nvptx64-nvidia-cuda用于 64 位平台或-fopenmp -fopenmp-targets=nvptx-nvidia-cuda32 位平台。

于 2019-02-13T00:31:22.657 回答
2

简短回答:根据Clang 3.9.0 发行说明,它不是:

目前 Clang 支持 OpenMP 3.1 和 OpenMP 4.0/4.5 的所有非卸载功能。卸载功能正在开发中。


我在较新的发行说明中找不到任何关于它是否已同时正式添加到较新版本的信息。不过好像也有一些支持。libomptarget文档说明两个插件

  • 适用于以下目标的通用 64 位:

    • powerpc64-ibm-linux-gnu
    • powerpc64le-ibm-linux-gnu
    • x86_64-pc-linux-gnu
  • cuda,对于目标(见this):

    • nvptx-nvidia-cuda
    • nvptx64-nvidia-cuda

如果您想尝试构建自己的 Clang,也许这个文档会对您有所帮助。

可以在此处找到 OpenMP 实现的列表。GCC 6.1 和更新版本完全支持 OpenMP 4.5。GCC 5 及更高版本似乎支持卸载,但对于仅通过 OpenACC 的 Nvidia GPU,请参见此处

通常,target结构的支持,即卸载,不等于 GPU(或任何特定设备)支持,因为这需要每个设备的设备特定实现。微不足道的支持将卸载到主机设备,例如 x86-CPU,除了在没有加速器设备的情况下进行测试或兼容性之外,这对任何事情都没有好处。

希望有帮助。

于 2018-01-06T17:20:44.340 回答