我为拉普拉斯方程(一个简单的加热板问题)在我的红黑 Gauss-Seidel 求解器中添加了 OpenACC 指令,但是 GPU 加速的代码并不比 CPU 快,即使对于大问题也是如此。
我还编写了一个 CUDA 版本,它比两者都快得多(对于 512x512,与 CPU 和 OpenACC 的 25 秒相比,大约为 2 秒)。
谁能想到造成这种差异的原因?我意识到 CUDA 提供了最大的潜在速度,但 OpenACC 应该为更大的问题提供比 CPU 更好的东西(例如这里演示的同类问题的 Jacobi 求解器)。
这是相关代码(完整的工作源在这里):
#pragma acc data copyin(aP[0:size], aW[0:size], aE[0:size], aS[0:size], aN[0:size], b[0:size]) copy(temp_red[0:size_temp], temp_black[0:size_temp])
// red-black Gauss-Seidel with SOR iteration loop
for (iter = 1; iter <= it_max; ++iter) {
Real norm_L2 = 0.0;
// update red cells
#pragma omp parallel for shared(aP, aW, aE, aS, aN, temp_black, …Run Code Online (Sandbox Code Playgroud)