OpenMP 4.5不会使用目标指令卸载到GPU

时间:2019-07-25 16:31:21

标签: c++ c gpu openmp

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

我已经安装了具有CUDA支持的g ++ 7.2.0编译器(位于我使用的群集中)。当我运行下面的代码时,它表明可以看到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种设备可用。

2 个答案:

答案 0 :(得分: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 ++方面比在其他方面做得更糟糕(似乎效率低下,非标准标志),但是Community Edition是免费提供的,只需稍加翻译即可让您快速在OpenACC中运行。

IBM XL似乎做得很好,但是我不知道它是否免费提供。

GCC的情况可能已经改变。如果您找到使它正常工作的方法,不胜感激,请您在此处发表评论。我的强烈建议是,您不要再尝试使用GCC7,而是使用GCC8或GCC9。 GPU卸载是一个快速发展的领域,您需要最新的编译器才能充分利用它。

答案 1 :(得分:0)

好像您在#pragma omp目标行中缺少设备(id):

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

除此之外,您没有明确要求OpenMP在CPU之外的任何地方运行。