我正在尝试使用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种设备可用。
答案 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之外的任何地方运行。