zoukankan      html  css  js  c++  java
  • [NVIDIA编程教程]OpenACC: Directives for GPUs

    [NVIDIA编程教程]OpenACC: Directives for GPUs 

     NVIDIA已经在过去五年里大力发展CUDA技术,我们估计CUDA开发人员超过15万,很多重要的科学应用正在CUDA的帮助下完成。但是我们仍然有一个很长的路要走,以帮助每个人从GPU计算中享受到好处。有很多开发者没有太多时间来学习和应用的并行编程语言。还有很多科学家和工程师,正在自己的代码上辛勤工作,他们只能对自己的代码做一些改动,以便适应于整个硬件和操作系统的便携式,并且能在多个平台上的计算。

    这一类的开发,需要一个更高级别的GPU加速的方法。他们需要的东西就是简单,功能强大,移植方便,并开放。 这就是OpenACC推出的原因,它是一个开放的标准,是一个编译器指令集合,在标准C,C+ +和Fortran语言中指定代码循环和代码区域从主机CPU上卸载到一个加速器上,同时提供跨作业系统、主机CPU和加速器的可移植性。通过使用指令,开发人员可以让相同的代码运行在多核CPU、GPU或任何编译器支持的其他类型的并行硬件上。如果你是一个C或C+ +程序员,你可能熟悉的#pragma指令。

    简单:一个OpenACC例子
    这里是一个非常简单的使用OpenACC的例子。此循环执行SAXPY的操作。 SAXPY表示单精度A乘以XYA是一个标值(scalar value ,XY是向量,所以这是一个vector scale 和增加操作。
    下面是一个C编写的简单的SAXPY,并用OpenACC指令并行。


    void saxpy_parallel(int n,
                       
    float a,
                       
    float*x,
                       
    float*restrict y)
    {
    #pragma acc kernels
     
    for(int i =0; 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 = 1, 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的平台上编译代码而它会工作,就像你从来没有新增指令一样。这也意味着,一开始,亲的的代码就适应于CPUGPU,不需要特别指定.

    当然我也不打算骗你。有时要用OpenACC获得良好的加速,需要改变原代码。例如,一些数据的布局导致访问模式不是并行的。往往明智的做法是将一个结构数组(AOS)表示成阵列结构(SOA)。这是不指定GPUSOA通常对任何并行处理器,包括CPU都可以用。这种类型的代码变化有助于暴露并行,因此,它往往具有普遍的性能优势。结合这些好处,加上编译器指令的可移植性,你离性能可移植性可望而不可及的目标不远了!

    开放性:OpenACC的起源
    OpenACC波特兰集团(PGI),Cray公司,CAPSNVIDIA开发。 PGICrayCAPS花了2年多的时间推出商业用的编译器以加速GPU,但他们的编译器之间有一些不同,所以就成立一个组织标准化指令加速方法。

    OpenACC规范1.0版即将正式发布今天你可以开始使用上面列出的供应商的编译器。在我的下一篇文章中,我将使用的PGI编译器。今天,PGI的编译器实现了OpenACC加速 。如果您有兴趣尝试OpenACC,你可以下载一个免费试用PGI加速编译器尝试一下。

    在我的下一篇文章[编程教程]OpenACC指令将程序速度提升2,我将深入一个更有趣的代码示例演示如何使用OpenACC指令,只需几行代码给你一个3 - 4倍的加速!

    更多关于OpenACC的资料,可以上 bbs.gpuworld.cn上

  • 相关阅读:
    HDU1397:Goldbach's Conjecture
    火狐浏览器丢失书签,恢复无法处理备份文件的解决方案
    火狐浏览器单击链接总是在一个新的标签页打开的设置方法
    Mysql错误:#1054 Unknown column 'id' in 'field list' 解决办法
    关于PHP的内置服务器的使用
    PHP内置服务器
    SecurityManager 规格严格
    Centos或者Redhet开通telnet 规格严格
    搜索分布式 规格严格
    BenchMark 规格严格
  • 原文地址:https://www.cnblogs.com/gpus/p/2433119.html
Copyright © 2011-2022 走看看