为什么在GPU上不执行OpenACC教程代码?

问题描述 投票:0回答:1

我正在尝试在https://gcc.gnu.org/wiki/OpenACC#OpenACC_kernels_Construct_Optimization_Tutorial上运行OpenACC教程>

作为MSYS MINGW64软件包的一部分,编译器是g ++ 9.2 64位。

C:\ Users \ TJ \ Documents \ GpuDemo>其中g ++

C:\ msys64 \ mingw64 \ bin \ g ++。exe

C:\ Users \ TJ \ Documents \ GpuDemo> g ++ --version

g ++(Rev2,由MSYS2项目构建)9.2.0版权所有(C)2019自由软件基金会,Inc.这是免费软件;请参阅复制条件的来源。没有保证;甚至不是出于适销性或特定目的的适用性。

这是构建我的代码的命令:

g ++ -m64 -std = c ++ 17 gpudemo.cpp -o gpudemo.exe -fopenmp -fopenacc

单线程和OpenMP多线程调用工作正常。但是,OpenACC代码不会传递给GPU;它会传递给GPU。它正在CPU上运行。 GPU运行时间与单线程运行时间相同。我的计算机是带双Intel Xeon 5675处理器(每个6核)和NVidia GeForce GTX 970视频卡的Lenovo D20,运行64位Windows 7 Pro SP1。]

程序输出:

C:\ Users \ TJ \ Documents \ GpuDemo> gpudemo

乘以2000x2000矩阵。

单线程:54104.1毫秒

多线程:5036.29毫秒

GPU:54371.1毫秒

如果我设置环境变量ACC_DEVICE_TYPE = NVIDIA,则会出现错误“ libgomp:不支持NVIDIA的设备类型。”

如何获得本教程的代码以使用GPU?


// https://gcc.gnu.org/wiki/OpenACC


#include <iostream>
#include <chrono>

#define N 2000

void matrix_multiply_single_thread (float r[N][N], const float a[N][N], const float b[N][N])
{
  for (int j = 0; j < N; j++)
    {
      for (int i = 0; i < N; i++)
        {
          float sum = 0;
          for (int k = 0; k < N ; k++)
            sum += a[i][k] * b[k][j];
          r[i][j] = sum;
        }
    }
}

void matrix_multiply_multi_thread (float r[N][N], const float a[N][N], const float b[N][N])
{
    #pragma omp parallel for
  for (int j = 0; j < N; j++)
    {
      for (int i = 0; i < N; i++)
        {
          float sum = 0;
          for (int k = 0; k < N ; k++)
            sum += a[i][k] * b[k][j];
          r[i][j] = sum;
        }
    }
}

void matrix_multiply_gpu (float r[N][N], const float a[N][N], const float b[N][N])
{
  #pragma acc kernels \
    copy(r[0:N][0:N], a[0:N][0:N], b[0:N][0:N])
  {
    #pragma acc loop independent
    for (int j = 0; j < N; j++)
      {
        #pragma acc loop independent
        for (int i = 0; i < N; i++)
          {
            float sum = 0;
            // #pragma acc loop seq
            #pragma acc loop independent reduction(+: sum)
            for (int k = 0; k < N ; k++)
              sum += a[i][k] * b[k][j];
            r[i][j] = sum;
          }
      }
  }
}

static float a[N][N], b[N][N], r[N][N];

int main()
{
    std::cout << "Multiply a " << N << "x" << N << " matrix.\n\n";
    srand(time(0));
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            a[i][j] = rand();
            b[i][j] = rand();
        }
    }
    auto start = std::chrono::high_resolution_clock::now();
    matrix_multiply_single_thread(r, a, b);
    auto finish = std::chrono::high_resolution_clock::now();
    auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(finish - start);
    double milliseconds = (double)microseconds.count() / 1000;
    std::cout << "\nsingle thread: " << milliseconds << " milliseconds\n";

    start = std::chrono::high_resolution_clock::now();
    matrix_multiply_multi_thread(r, a, b);
    finish = std::chrono::high_resolution_clock::now();
    microseconds = std::chrono::duration_cast<std::chrono::microseconds>(finish - start);
    milliseconds = (double)microseconds.count() / 1000;
    std::cout << "multi thread:   " << milliseconds << " milliseconds\n";

    start = std::chrono::high_resolution_clock::now();
    matrix_multiply_gpu(r, a, b);
    finish = std::chrono::high_resolution_clock::now();
    microseconds = std::chrono::duration_cast<std::chrono::microseconds>(finish - start);
    milliseconds = (double)microseconds.count() / 1000;
    std::cout << "GPU:           " << milliseconds << " milliseconds\n";

    return 0;
}

我正在尝试在https://gcc.gnu.org/wiki/OpenACC#OpenACC_kernels_Construct_Optimization_Tutorial上运行OpenACC教程。编译器是M ++ MINGW64软件包的一部分,是g ++ 9.2 64位。 C:\ ...

g++ openacc
1个回答
0
投票

感谢您对此感兴趣。我是为OpenACC支持和GPU代码卸载功能向GCC贡献力量的团队的一员,我们仍在努力之中。

[您正在使用的编译器尚未构建为支持GPU代码卸载-如您遇到的错误消息“ libgomp:不支持NVIDIA的设备类型”所指示。

© www.soinside.com 2019 - 2024. All rights reserved.