【问题标题】:How to offload to the GPU with OpenACC in Windows?如何在 Windows 中使用 OpenACC 卸载到 GPU?
【发布时间】:2021-06-07 15:42:16
【问题描述】:

我正在尝试在 Windows 中使用 OpenACC。我正在使用 GCC 进行编译。 (与版本 8.1.0)

我在网上找到了一个使用 OpenACC 的示例代码。

所以使用命令提示符,我输入如下。

"C:\Users\chang>g++ -fopenacc -o C:\Users\chang\source\repos\Project18\Project18\testing.exe C:\Users\chang\source\repos\Project18\Project18\Source1 .cpp"

如果我在代码运行时查看任务管理器中的性能,我看不到 GPU 使用率有任何变化。

如果我跳过 -fopenacc

"C:\Users\chang>g++ -o C:\Users\chang\source\repos\Project18\Project18\testing.exe C:\Users\chang\source\repos\Project18\Project18\Source1.cpp "

使用 -fopenacc 和不使用在速度上没有区别。

所以我想知道在我使用这个 OpenACC 之前是否有先决条件。

下面是我找到的示例代码。

提前致谢。

附言 据我记得,我还没有下载 openacc.h 并试图在网上找到它但找不到它在哪里。这可能是个问题吗?我认为既然我可以运行 exe 文件,这似乎不是问题,但以防万一。

    /*
 *  Copyright 2012 NVIDIA Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
#include <iostream>
#include <math.h> 
#include <string.h>
#include <openacc.h>
#include <chrono>

#define NN 4096
#define NM 4096
using namespace std;
using namespace chrono;

double A[NN][NM];
double Anew[NN][NM];

int main(int argc, char** argv)
{
    const int n = NN;
    const int m = NM;
    const int iter_max = 1000;

    const double tol = 1.0e-6;
    double error = 1.0;

    memset(A, 0, n * m * sizeof(double));
    memset(Anew, 0, n * m * sizeof(double));

    for (int j = 0; j < n; j++)
    {
        A[j][0] = 1.0;
        Anew[j][0] = 1.0;
    }

    printf("Jacobi relaxation Calculation: %d x %d mesh\n", n, m);

    system_clock::time_point start = system_clock::now();
    int iter = 0;
    #pragma acc data copy(A), create(Anew)
    while (error > tol && iter < iter_max)
    {
        error = 0.0;

        #pragma acc kernels
        for (int j = 1; j < n - 1; j++)
        {
            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]);
                error = fmax(error, fabs(Anew[j][i] - A[j][i]));
            }
        }

        #pragma acc kernels
        for (int j = 1; j < n - 1; j++)
        {
            for (int i = 1; i < m - 1; i++)
            {
                A[j][i] = Anew[j][i];
            }
        }

        if (iter % 100 == 0) printf("%5d, %0.6f\n", iter, error);

        iter++;
    }

    system_clock::time_point end = system_clock::now();
    std::chrono::duration<float> sec = end - start;
    cout << sec.count() << endl;
}

【问题讨论】:

    标签: c++ gpgpu openacc


    【解决方案1】:

    目前,GCC 不支持在 Windows 上卸载 GPU 代码。例如,请参阅 https://stackoverflow.com/a/59376314/664214 或 http://mid.mail-archive.com/87d08zjlbd.fsf@euler.schwinge.homeip.net。当然可以实现,但需要有人去做,或者为工作付费。

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 2021-07-28
      • 2019-01-02
      • 2015-05-31
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2011-08-06
      相关资源
      最近更新 更多