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. Tomcat在处理GET和POST请求时产生的乱码问题

    最近一直在做关于Servlet的事情,常常出现乱码,很是烦人,处理乱码的方法有时候有效,有时候没有效果,今天抽个时间小结一下,以防以后再出现这种问题. 一般的处理乱码的方式都是用: request.s ...

  2. Spark为什么比Hadoop好?

    (1)Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk Hadoop每次计算先写磁盘,下次计算先从磁盘读,计算结果再写磁盘,如此往复.这对于迭代计算,是 ...

  3. Head First 设计模式笔记(模版方法模式)

    1.定义: 在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中.模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 2.类图:  3.说明: 模版方法可以理解为一个方法里面包 ...

  4. java多线程(二)

    线程的阻塞状态: 参考java多线程(一)多线程的生命周期图解,多线程的五种状态.     1.1 join(),如果在A线程体里面执行了B线程的join()方法,那么A线程阻塞,直到B线程生命周期结 ...

  5. window系统下SVN服务器和客户端的搭建和使用

    SVN服务器下载地址: http://subversion.apache.org/packages.html 这里我选用VisualSVN server 服务端和 TortoiseSVN客户端搭配使用 ...

  6. 信息检索和自然语言处理 IR&NLP howto

    课程: 6.891 (Fall 2003): Machine Learning Approaches for Natural Language Processing http://www.ai.mit ...

  7. inventor安装失败怎样卸载安装inventor 2015?

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  8. MATLAB矩阵求值和稀疏矩阵

    方阵的行列式: det(A) 矩阵线性无关的行数或列数,称为矩阵的秩. rank(A) 求3~20阶魔方矩阵的秩 for n=3:20 rank(magic(n)) end 矩阵的迹等于矩阵的对角线元 ...

  9. php 自带加密、解密函数

    php 自带的加密函数  不可逆的加密函数为:md5().crypt() md5() 用来计算 MD5 哈稀.语法为:string md5(string str); crypt() 将字符串用 UNI ...

  10. 利用COM组件实现对WORD书签处写入值

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Wo ...