Clang编译器可以将OpenMP区域卸载到GPU上。

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上,如果可以,我该如何操作。欢迎任何评论。

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目标编译程序,请使用以下选项:64位平台使用-fopenmp -fopenmp-targets=nvptx64-nvidia-cuda,32位平台使用-fopenmp -fopenmp-targets=nvptx-nvidia-cuda

2
简短回答:根据Clang 3.9.0发布说明,它不支持OpenMP 4.0/4.5的卸载特性。目前Clang支持OpenMP 3.1和所有非卸载特性。
我在更新的发布说明中找不到任何关于它是否已经被正式添加到新版本中的信息。但似乎有一些支持。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。Offloading似乎由GCC 5及更高版本支持,但仅通过OpenACC支持Nvidia GPU,请参见此处
一般来说,“target”构造的支持,即卸载,与GPU(或任何特定设备)的支持不相等,因为这需要每个设备的特定实现。微不足道的支持将卸载到主机设备,例如x86-CPU,这对于除了测试或在加速器设备不存在时的兼容性之外没有任何好处。
希望有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接