微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Windows 中使用 OpenACC 卸载到 GPU?

如何解决如何在 Windows 中使用 OpenACC 卸载到 GPU?

我正在尝试在 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,n * m * sizeof(double));
    memset(Anew,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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。