【问题标题】:OpenMP 4.5 won't offload to GPU with target directiveOpenMP 4.5 不会使用 target 指令卸载到 GPU
【发布时间】:2019-07-25 16:31:21
【问题描述】:

我正在尝试使用 openMP 制作一个简单的 GPU 卸载程序。但是,当我尝试卸载时,它仍然在默认设备上运行,即我的 CPU。

我安装了一个编译器,g++ 7.2.0,它支持 CUDA(在我使用的集群上)。当我运行下面的代码时,它显示它可以看到 8 个 GPU,但是当我尝试卸载时它说它仍在 CPU 上。

#include <omp.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm> 
#define n 10000
#define m 10000

using namespace std;

int main()
{

    double tol = 1E-10;
    double err = 1;
    size_t iter_max = 10;
    size_t iter = 0;
    bool notGPU[1] = {true};

    double Anew[n][m];
    double A[n][m];

   int target[1];
   target[0] = omp_get_initial_device();
   cout << "Total Devices: " << omp_get_num_devices() << endl;
   cout << "Target: " << target[0] << endl;


    for (int iter = 0; iter < iter_max; iter++){
        #pragma omp target 
        {
        err = 0.0;
        #pragma omp parallel for reduction(max:err)
        for (int j = 1; j < n-1; ++j){
            target[0] = omp_is_initial_device();
            for (int i = 1; i < m-1; i++){
                Anew[j][i] = 0.25 * (A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]);
                err = fmax(err, fabs(Anew[j][i] - A[j][i]));
            }

        }
        }

    }
    if (target[0]){
       cout << "not on GPU" << endl;
} else{
    cout << "On GPU" << endl;}



    return 0;
}

当我运行它时,我总是发现它不在 GPU 上,而是有 8 个设备可用。

【问题讨论】:

    标签: c++ c gpu openmp


    【解决方案1】:

    这不是一个有据可查的过程!

    你必须安装一些看起来有点像的包:

    sudo apt install gcc-offload-nvptx
    

    您还需要在编译字符串中添加额外的标志。我在下面汇总了其中的一些。混合和匹配,直到某些东西起作用,或者将它们用作进一步谷歌搜索的基础。

    gcc -fopenmp -foffload=x86_64-intelmicemul-linux-gnu="-mavx2" -foffload=nvptx-none -foffload="-O3" -O2 test.c -fopenmp-targets=nvptx64-nvidia-cuda
    

    当我在 2018 年最后一次尝试使用 GCC 时,它只是没有用。当时,OpenMP 的目标卸载仅适用于 IBM XL 编译器,而 OpenACC(与 OpenMP 类似的一组指令)仅适用于 Nvidia 的 PGI compiler。我发现 PGI 在编译 C/C++ 方面做得比其他的更差(似乎效率低下、非标准标志),但社区版是免费提供的,稍微翻译一下就能让你在 OpenACC 中快速运行。

    IBM XL 似乎在编译方面做得很好,但我不知道它是否可以免费获得。

    情况可能因 GCC 而有所改变。如果你找到了让它工作的方法,我会很感激你在这里发表评论。我强烈建议您停止尝试使用 GCC7 并使用 GCC8 或 GCC9。 GPU 卸载是一个快速发展的领域,您需要最新的编译器充分利用它。

    【讨论】:

    • IBM XL C/C++ for Linux Community Edition 完全支持 OpenMP 4.5,并且免费提供。您可以使用ibm.com/us-en/marketplace/xl-cpp-linux-compiler-power的“立即下载”按钮下载它
    • -fopenmp-targets=nvptx64-nvidia-cuda 导致[build] g++-10: error: unrecognized command-line option ‘-fopenmp-targets=nvptx64-nvidia-cuda’。我希望某处有一个全面的语法描述。
    【解决方案2】:

    您的#pragma omp 目标行中似乎缺少设备(id):

    #pragma omp target device(/*your device id here*/)
    

    否则,您没有明确要求 OpenMP 在 CPU 以外的任何地方运行。

    【讨论】:

    • 您的设备 ID 应该是 [0, omp_get_num_devices()) 中的整数。
    • 我已经这样做了,即使使用的 ID 号大于可用设备的数量,但我得到了相同的结果。
    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多