我正在尝试在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核)的Lenovo D20和NVidia GeForce GTX 970视频卡,运行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;
}
答案 0 :(得分:2)
感谢您对此感兴趣。我是为OpenACC支持和将GPU代码卸载功能贡献给GCC的团队的一员,我们仍在努力之中。
您使用的编译器尚未构建为支持GPU代码卸载的功能-如您遇到的错误消息“ libgomp:不支持NVIDIA的设备类型”所指示。
实际上,到目前为止,我们还没有任何关于使用Windows主机的代码卸载支持构建GCC的报道。可能需要为GCC / nvptx-tools进行一些开发工作,但是到目前为止,我们都没有与之签约以进行此工作,也没有任何志愿者来贡献各自的代码更改。