NVIDIA已经在过去五年里大力发展CUDA技术,我们估计CUDA开发人员超过15万,很多重要的科学应用正在CUDA的帮助下完成。但是我们仍然有一个很长的路要走,以帮助每个人从GPU计算中享受到好处。有很多开发者没有太多时间来学习和应用的并行编程语言。还有很多科学家和工程师,正在自己的代码上辛勤工作,他们只能对自己的代码做一些改动,以便适应于整个硬件和操作系统的便携式,并且能在多个平台上的计算。
这一类的开发,需要一个更高级别的GPU加速的方法。他们需要的东西就是简单,功能强大,移植方便,并开放。 这就是OpenACC推出的原因,它是一个开放的标准,是一个编译器指令集合,在标准C,C+ +和Fortran语言中指定代码循环和代码区域从主机CPU上卸载到一个加速器上,同时提供跨作业系统、主机CPU和加速器的可移植性。通过使用指令,开发人员可以让相同的代码运行在多核CPU、GPU或任何编译器支持的其他类型的并行硬件上。如果你是一个C或C+ +程序员,你可能熟悉的#pragma指令。
简单:一个OpenACC例子 这里是一个非常简单的使用OpenACC的例子。此循环执行SAXPY的操作。 SAXPY表示单精度A乘以X加Y。A是一个标值(scalar value ),而X和Y是向量,所以这是一个vector scale 和增加操作。 下面是一个C编写的简单的SAXPY,并用OpenACC指令并行。

 void saxpy_parallel(int n,
float a,
float*x,
float*restrict y)
{
#pragma acc kernels
for(int i =; i < n;++i)
y[i]= a*x[i]+ y[i];
}

下面是用Fortran写的

 subroutine saxpy(x,y,n,a)
real:: a, x( : ), y( : )
integer:: n, i
!$ acc kernels
do i = , n
y(i) = a*x(i)+y(i)
enddo
!$ acc end kernels
end subroutine saxpy

在C语言中的#pragma 行和Fortran语言中的 !$acc 行就是编译器指令:给编译器提示! 在这个程序里,我们只是建议这是个并行循环,编译器会试图生成一个并行内核代码给一个加速器(比如,一个GPU).同时注意我们不需要再对GPU做任何事情. 跟CUDA不同的是: - 我们不需要在设备上分配或者初试化阵列, - 我们也不需要将Host(CPU)的数据复制到加速器(GPU)上或者在循环后将加速器的结果返回到Host. - 我们不需要写一个CUDA内核去执行并行循环主体; - 我们也不需要明确在GPU上launch内核. OpenACC编译器都会在幕后做好这些工作!
便捷性 关于编译器指令(也许令人惊讶的)伟大的事情之一是他们可以被忽略不计。这意味着,你可以在不支持OpenACC的平台上编译代码, 而它会工作,就像你从来没有新增指令一样。这也意味着,一开始,亲的的代码就适应于CPU和GPU,不需要特别指定.
当然我也不打算骗你。有时要用OpenACC获得良好的加速,需要改变原代码。例如,一些数据的布局导致访问模式不是并行的。往往明智的做法是将一个结构数组(AOS)表示成阵列结构(SOA)。这是不指定GPU:SOA通常对任何并行处理器,包括CPU都可以用。这种类型的代码变化有助于暴露并行,因此,它往往具有普遍的性能优势。结合这些好处,加上编译器指令的可移植性,你离“性能可移植性”可望而不可及的目标不远了!
开放性:OpenACC的起源 OpenACC波特兰集团(PGI),Cray公司,CAPS和NVIDIA开发。 PGI,Cray,CAPS花了2年多的时间推出商业用的编译器以加速GPU,但他们的编译器之间有一些不同,所以就成立一个组织标准化指令加速方法。
OpenACC规范1.0版即将正式发布, 今天你可以开始使用上面列出的供应商的编译器。在我的下一篇文章中,我将使用的PGI编译器。今天,PGI的编译器实现了OpenACC加速 。如果您有兴趣尝试OpenACC,你可以下载一个免费试用PGI加速编译器尝试一下。
在我的下一篇文章[编程教程]用OpenACC指令将程序速度提升2倍,我将深入一个更有趣的代码示例演示如何使用OpenACC指令,只需几行代码给你一个3 - 4倍的加速!

[NVIDIA编程教程]OpenACC: Directives for GPUs的更多相关文章

  1. Shader编程教程

    2010-05-13 11:37:14|  分类: DirectX 3D学习|举报|字号 订阅     Shader编程教程1-环境光照 您好,欢迎来到XNA Shader教程1.我的名字叫Petri ...

  2. 超全面的.NET GDI+图形图像编程教程

    本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...

  3. IOS编程教程(八):在你的应用程序添加启动画面

    IOS编程教程(八):在你的应用程序添加启动画面   虽然你可能认为你需要编写闪屏的代码,苹果已经可以非常轻松地把它做在Xcode中.不需要任何编码.你只需要做的是设置一些配置. 什么是闪屏 对于那些 ...

  4. [转]超全面的.NET GDI+图形图像编程教程

    本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ GDI+绘图基础 编写图形程序时需要使用GDI(Gr ...

  5. 少儿编程|Scratch编程教程系列合集,总有一款适合你

    如果觉得资源不错,友情转发,贵在分享!!! 少儿编程Scratch: 少儿编程Scratch第一讲:Scratch完美的初体验少儿编程Scratch第二讲:奇妙的接球小游戏少儿编程Scratch第三讲 ...

  6. hive udf编程教程

    hive udf编程教程 https://blog.csdn.net/u010376788/article/details/50532166

  7. 使用Keil语言的嵌入式C编程教程(下)

    使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...

  8. 使用Keil语言的嵌入式C编程教程(上)

    使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...

  9. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

随机推荐

  1. oracle 用mybatis生成主键

    oracle主键是不能像mysql一样自动管理的,需要自己手动管理,先生成,再插入. <selectKey keyProperty="id" resultType=" ...

  2. spring webapp的配置文件放置在项目外的方法

    在web.xml中,填写     <context-param>         <param-name>CFG_HOME</param-name>         ...

  3. UGUI Slider

    1.新建一个Cube命名为Player,在上面挂一个脚本命名为Player,脚本内容如下: using System.Collections; using System.Collections.Gen ...

  4. windows当代理服务器-CCProx的使用

    参考 https://jingyan.baidu.com/article/0f5fb099ef3a2c6d8234ea75.html 在ubuntu下设置网络代理,选择手动方式

  5. Nginx实践:(1) Nginx安装及日志配置

    1. 安装 (1)  Nginx下载地址:https://nginx.org/download/nginx-1.14.0.tar.gz (2)  安装时可能出现依赖库不存在,比如prec包,可以使用y ...

  6. 嵌入式 C 语言编程总结

    嵌入式 C 语言编程总结 目录: 全局变量 1.全局变量 在纯 C 语言(Pure C)开发的嵌入式程序中,需要在多处用到同一个变量,需要注意几点: 不要在头文件中对变量进行定义 头文件中变量的声明添 ...

  7. 【Ionic】---Using Local Notifications In Your Ionic Framework App

    Using Local Notifications In Your Ionic Framework App 配置好ng-cordova先 <script src="lib/ngCord ...

  8. net图片转格式

    http://blog.csdn.net/nrlovestudy/article/details/48137339 图片转格式 Bitmap bmp=new Bitmap("filename ...

  9. 关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究

    关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究2018年04月24日 15:47:26 守望dfdfdf 阅读数:735 标签: @colunmhibern ...

  10. centos系统安装mysql

    方式一. 通过yum install mysql-server安装mysql服务器.chkconfig mysqld on设置开机启动,并service mysqld start启动mysql服务,并 ...