OpenACC:

openacc 可以用于fortran, c 和 c++程序,可以运行在CPU或者GPU设备.

openacc的代码就是在原有的C语言基础上进行修改,通过添加:
compiler directives 编译器指令(pragmas): #pragma 来标示.

cuda 中有 __syncthreads()来进行线程同步,目前的OpenAcc还没有线程同步机制.

OpenAcc device model

OpenAcc excute model

parallel loops

下面地一段代码和第二段代码是等效的,在OpenAcc中一个parallel区域有一个单个loop组成.

#pragma acc parallel loop copyin(M[0:Mh*Mw])
copyin(N[:Mw*Nw]) copyout(P[:Mh*Nw])
for (int i=; i<Mh; i++) {
...
} is equivalent to:
#pragma acc parallel copyin(M[0:Mh*Mw])
copyin(N[:Mw*Nw]) copyout(P[:Mh*Nw])
{
#pragma acc loop
for (int i=; i<Mh; i++) {
...
}
}
}

copyin对应拷贝内存从host到device,

copyout对应拷贝内存从device到host

gangs and workers

gangs可以类比成cuda的block,
workers可以类比成thread

#pragma acc parallel num_gangs(1024) num_workers(32)
{
#pragma acc loop gang
for (int i=; i<; i++) {
#pragma acc loop worker
for (int j=; j<; j++) {
foo(i,j);
}
}
}

这段代码会分配: 1024*32 = 32K 个thread, 这两个循环题一共是执行2048*512 = 1M, 所以每个thread执行foo()函数 1M/32K = 32 次.

再看另外一个代码:

#pragma acc parallel copyout(a) num_gangs(1024) num_workers(32)
{
a = ;
}

这段代码会分配1023*32个thread,每个gang=1024, 对于每个gang来说执行a =23 是冗余的,只需要执行一次即可.再看下面的例子:

#pragma acc parallel num_gangs(32)
{
Statement ;
#pragma acc loop gang
for (int i=; i<n; i++) {
Statement ;
}
Statement ;
#pragma acc loop gang
for (int i=; i<m; i++) {
Statement ;
}
Statement ;
if (condition) Statement ;
}

gang有32个,statement2的循环次数是n,statement4循环次数是m, 最终到底分配多少个thread取决于编译器,有可能m>n,则分配m个,当然实际情况可能更加复杂,

statement1, 3, 5,6 对于32gang来说是冗余的,情况和上面的相同,可以看出OpenAcc中的冗余是对于gang来说的,下面的这种写法可以消除这种冗余:

#pragma acc parallel num_gangs(1)
num_workers()
{
Statement ;
#pragma acc loop gang
for (int i=; i<n; i++) {
Statement ;
}
Statement ;
#pragma acc loop gang
for (int i=; i<m; i++) {
Statement ;
}
Statement ;
if (condition) Statement ;
}

kernel regions

#pragma acc kernels
{
#pragma acc loop num_gangs(1024)
for (int i=; i<; i++) {
a[i] = b[i];
}
#pragma acc loop num_gangs(512)
for (int j=; j<; j++) {
c[j] = a[j]*;
}
for (int k=; k<; k++) {
d[k] = c[k];
}
}

这段代码和前面的代码比较起来,区别是 acc kernel, 而前面的代码用的是acc parallel.

Kernel 结构主要是描述程序员的意图: 当前程序适合并行,编译器根据这个描述会有非常灵活的表现,

而parallel则是规定,规定编译器必须把下面的代码段并行操作.

7.OpenACC的更多相关文章

  1. PGI Compiler for OpenACC Output Syntax Highlighting

    PGI Compiler for OpenACC Output Syntax Highlighting When use the PGI compiler to compile codes with ...

  2. OpenACC 云水参数化方案

    ▶ 书上第十三章,用一系列步骤优化一个云水参数化方案.用于熟悉 Fortran 以及 OpenACC 在旗下的表现 ● 代码,文件较多,放在一起了 ! main.f90 PROGRAM main US ...

  3. OpenACC 绘制曼德勃罗集

    ▶ 书上第四章,用一系列步骤优化曼德勃罗集的计算过程. ● 代码 // constants.h ; ; ; ; const double xmin=-1.7; ; const double ymin= ...

  4. OpenACC 梯度下降法求解线性方程的优化

    ▶ 书上第二章,用一系列步骤优化梯度下降法解线性方程组.才发现 PGI community 编译器不支持 Windows 下的 C++ 编译(有 pgCC 命令但是不支持 .cpp 文件,要专业版才支 ...

  5. OpenACC 优化矩阵乘法

    ▶ 按书上的步骤使用不同的导语优化矩阵乘法 ● 所有的代码 #include <iostream> #include <cstdlib> #include <chrono ...

  6. OpenACC 简单的原子操作

    ▶ OpenACC 的原子操作,用到了 C++ 的一个高精度计时器 ● 代码,直接的原子操作 #include <iostream> #include <cstdlib> #i ...

  7. OpenACC 与 CUDA 的相互调用

    ▶ 按照书上的代码完成了 OpenACC 与CUDA 的相互调用,以及 OpenACC 调用 cuBLAS.便于过程遇到了很多问题,注入 CUDA 版本,代码版本,计算能力指定等,先放在这里,以后填坑 ...

  8. OpenACC Julia 图形

    ▶ 书上的代码,逐步优化绘制 Julia 图形的代码 ● 无并行优化(手动优化了变量等) #include <stdio.h> #include <stdlib.h> #inc ...

  9. OpenACC 异步计算

    ▶ 按照书上的例子,使用 async 导语实现主机与设备端的异步计算 ● 代码,非异步的代码只要将其中的 async 以及第 29 行删除即可 #include <stdio.h> #in ...

随机推荐

  1. [转载]C#缓存absoluteExpiration、slidingExpiration两个参数的疑惑

    看了很多资料终于搞明白cache中absoluteExpiration,slidingExpiration这两个参数的含义. absoluteExpiration:用于设置绝对过期时间,它表示只要时间 ...

  2. 如何保护 .NET 应用的安全?

    自从 Web 应用能给访问者提供丰富的内容之后,黑客们就把目光转向任何他们能够破坏,损毁,欺骗的漏洞.通过网络浏览器提供的应用越来越多,网络罪犯们可以利用的漏洞数量也呈指数增长起来. 大多数企业都依赖 ...

  3. linux下mysql修改数据库账户root密码

    #先停止mysql,再运行下一句 $ mysqld_safe --user=mysql --skip-grant-tables --skip-networking & $ mysql -u r ...

  4. HDU 5039 Hilarity

    题意:一棵树n个结点,每条边有0.1两种权值,每次询问权值为奇数的路径数目,或者改变某一条边的权值. 分析:这个题目很巧妙低利用了异或和的特性,dfs得到每个点到根结点的权值异或和,然后奇数则为1,偶 ...

  5. [itint5]字符串匹配

    http://www.itint5.com/oj/#15 用hash来做,目前为止做到最好也是case16超时(20w的规模),即使分桶也超时.注意计算hashcode时,'a'要算成1,否则如果'a ...

  6. H264/AVC视频解码时AVC1和H264的区别

    AVC1与H264的区别 http://blog.csdn.net/qiuchangyong/article/details/6660253 H.264 Video Types The followi ...

  7. 网上图书商城项目学习笔记-035工具类之JdbcUtils及TxQueryRunner及C3P0配置

    事务就是保证多个操作在同一个connection,TxQueryRunner通过JdbcUtils获取连接,而JdbcUtils通过ThreadLocal<Connection>确保了不同 ...

  8. delphi 反射(原理)

    关于反射的用途是『降低模块间的耦合度』这个倒未必尽然 单就delphi来说,从实现上看,它的所谓反射是基于RTTI,而RTTI的出现按照官方的说法是为了实现RAD中窗体文件DFM的持久化而产生的,其实 ...

  9. linux命令之-pstree使用说明

    pstree  shows running processes as a tree. The tree is rooted at either pid or init if pid is omitte ...

  10. socket关闭动作以及socket状态的总结

    主要部分,四次握手: 断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类的函数开始主动终止一个连接.这里先暂时说正常情况.当调用close ...