为什么 OpenACC 教程代码不在 GPU 上执行?
Why isn't the OpenACC tutorial code executing on the GPU?
我正在尝试 运行 https://gcc.gnu.org/wiki/OpenACC#OpenACC_kernels_Construct_Optimization_Tutorial
上的 OpenACC 教程
编译器是 g++ 9.2 64 位,作为 MSYS MINGW64 包的一部分。
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 Free Software Foundation, Inc.
这是免费软件;有关复制条件,请参阅来源。没有
保修单;甚至不是针对特定用途的适销性或适用性。
这是构建我的代码的命令:
g++ -m64 -std=c++17 gpudemo.cpp -o gpudemo.exe -fopenmp -fopenacc
单线程和 OpenMP 多线程调用工作正常。但是 OpenACC 代码不会进入 GPU; CPU运行宁。 GPU运行时间与单线程运行时间相同。我的电脑是 Lenovo D20,配备双 Intel Xeon 5675 处理器(每个 6 核)和 NVidia GeForce GTX 970 显卡,运行ning Windows 7 Pro SP1 64 位。
程序输出:
C:\Users\TJ\Documents\GpuDemo>gpudemo
乘以 2000x2000 矩阵。
单线程:54104.1毫秒
多线程:5036.29 毫秒
GPU:54371.1 毫秒
如果我设置环境变量ACC_DEVICE_TYPE=NVIDIA,会报错"libgomp: device type NVIDIA not supported."
如何获取本教程代码以使用 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;
}
感谢您对此感兴趣。我是为 GCC 贡献 OpenACC 支持和 GPU 代码卸载的团队的一员,我们仍在努力。
您正在使用的编译器未构建为支持 GPU 代码卸载——如您 运行 进入的错误消息 "libgomp: device type NVIDIA not supported" 所示。
事实上,到目前为止,我们还没有看到任何关于人们构建 GCC 并支持 Windows 主机的代码卸载的报告。可能需要为 GCC/nvptx-tools 做一些开发工作,但到目前为止我们还没有签约从事这方面的工作,也没有任何志愿者贡献相应的代码更改。
我正在尝试 运行 https://gcc.gnu.org/wiki/OpenACC#OpenACC_kernels_Construct_Optimization_Tutorial
上的 OpenACC 教程编译器是 g++ 9.2 64 位,作为 MSYS MINGW64 包的一部分。
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 Free Software Foundation, Inc. 这是免费软件;有关复制条件,请参阅来源。没有 保修单;甚至不是针对特定用途的适销性或适用性。
这是构建我的代码的命令:
g++ -m64 -std=c++17 gpudemo.cpp -o gpudemo.exe -fopenmp -fopenacc
单线程和 OpenMP 多线程调用工作正常。但是 OpenACC 代码不会进入 GPU; CPU运行宁。 GPU运行时间与单线程运行时间相同。我的电脑是 Lenovo D20,配备双 Intel Xeon 5675 处理器(每个 6 核)和 NVidia GeForce GTX 970 显卡,运行ning Windows 7 Pro SP1 64 位。
程序输出:
C:\Users\TJ\Documents\GpuDemo>gpudemo
乘以 2000x2000 矩阵。
单线程:54104.1毫秒
多线程:5036.29 毫秒
GPU:54371.1 毫秒
如果我设置环境变量ACC_DEVICE_TYPE=NVIDIA,会报错"libgomp: device type NVIDIA not supported."
如何获取本教程代码以使用 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;
}
感谢您对此感兴趣。我是为 GCC 贡献 OpenACC 支持和 GPU 代码卸载的团队的一员,我们仍在努力。
您正在使用的编译器未构建为支持 GPU 代码卸载——如您 运行 进入的错误消息 "libgomp: device type NVIDIA not supported" 所示。
事实上,到目前为止,我们还没有看到任何关于人们构建 GCC 并支持 Windows 主机的代码卸载的报告。可能需要为 GCC/nvptx-tools 做一些开发工作,但到目前为止我们还没有签约从事这方面的工作,也没有任何志愿者贡献相应的代码更改。