---
title: OpenACC引导语优化
description: "OpenACC（开源加速器Open Accelerators的简称）是一个由克雷公司，CAPS公司，NVIDIA公司和PGI公司共同开发的并行计算编程标准。设计这个标准的初衷是为了简化异构计算（CPU/GPU）系统的并行编程。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/gputuing-wp/kunpenggpu_19_0023.html
sourcePath: /source/zh/perftuning/gputuing-wp/kunpenggpu_19_0023.html
indexId: a4ba5d36e03b92c8c320c0da1db5e64788981a685f2c0e84046a4b8f4eedc37057
---
# OpenACC引导语优化

OpenACC（开源加速器Open Accelerators的简称）是一个由克雷公司，CAPS公司，NVIDIA公司和PGI公司共同开发的并行计算编程标准。设计这个标准的初衷是为了简化异构计算（CPU/GPU）系统的并行编程。

正如在OpenMP中那样，程序员可以通过在C、C++和Fortran源代码中添加注释以指明哪些代码段需要使用编译指令或其他函数加速。与OpenMP 4.0或其更新的版本类似，OpenACC的代码既可以在CPU上启动，也可以在GPU上启动。

OpenACC指令包含导语和子语两部分如：

```
#pragma acc loop independent
```

其中#pragma acc loop是导语，independent是子语，导语的作用是告诉编译器接下来代码中大致要转换为怎样的并行代码（实现什么功能），子语的作用是帮助编译器更精确地改代码，具体的作用可以在用的过程中理解。

```
int main()
{
int N = 1024；
int input_1[N][N], input_2[N][N], out[N][N];
for (int i =  0; i < N; i++)
{
for (int j =  0; i < N; i++)
{
input_1[i][j] = rand()；
input_2[i][j] = rand()；
}
}
#pragma acc kernels
for (int i =  0; i < N; i++)
{
for (int j =  0; i < N; i++)
{
out[i][j] = input_1[i][j] + input_2[i][j];
}
}
}
```

与OpenMP类似，OpenACC通过#pragma acc kernels引导语使能并行化操作。与OpenMP后续加入卸载到GPU的并行操作相比，OpenACC一开始就是设计用于卸载到GPU，因此这里没有做数据的搬迁，OpenACC也会将并行化操作卸载到GPU上。
