引言:

什么是基于指令的移植方式呢?首先我这里说的移植可以理解为把原先在CPU上跑的程序放到像GPU一样的协处理器上跑的这个过程。在英文里可以叫Porting。移植有两种方式:一种是使用CUDA或者OpenCL来重新设计代码,然后使用硬件厂商提供的编译器来编译;一种是使用OpenACC或者OpenHMPP提供的指令集添加到你想使用GPU计算的源代码中的某个位置,让编译器来编译出GPU上执行的代码。后一种方式就是基于指令的移植方式。

例如,下面一个简单的循环:

for (i=; i<n;i++)
{
dosomething(i);
}

如果你想把这个循环放到GPU上,让每个线程计算一次i的话,可以这样做:

#pragma acc kernels

for (i=; i<n;i++)
{
dosomething(i);
}

网格化(gridification)
这样,编译器拿到加了OpenACC指令的那段代码后,就会把你的循环放到GPU或者其他硬件加速器(例如MIC)上。编译器分析了#pragma acc kernels下面的那个循环,就会根据循环的次数来分配线程数量,这个过程就叫网格化。为什么说是网格化呢?可以这样理解,因为GPU可以启动很多线程,这些线程就像一张渔网一样,可以认为一个网格代表一个线程,所以我就干脆叫这个过程为“网格化”了。

内核(kernel)
在OpenACC里可以这样理解内核:内核就是在协处理器(例如GPU)上被多个线程同时执行的一段代码。如果每个线程都做一个活,岂不是没意思了么?当然不是这样的,他们执行的代码是一样的,但是每个线程可以根据自己的ID号来针对不同的数据做同样的工作,这也就是数据并行的含义。

codelet
使用CAPS的HMPP Workbench编译加了OpenACC指导语句的源代码时,编译器会告诉你codelet产生了。实际上产生了一个CUDA或者OpenCL的源文件,这个源文件中包含了根据你的指导语句生成的CUDA或者OpenCL的源代码。那什么是codelet呢?可以认为codelet就是数据管理+内核。一个codelet要干的事情包括两部分:申请和管理CPU和协处理器之间的存储,还有就是启动在协处理上执行的代码。

work-sharing
这个词可以理解为名词“共享工作”。如果在协处理器上的线程们执行的工作时work-sharing的,那么每个线程可以根据自己的ID在不同的数据上干了相似的工作。这个词是在使用OpenACC或者OpenHMPP移植代码的时候遇到的,它描述的是CPU的串行代码中的状态,例如:

for (i=; i<n; i++)
{
a[i] = i;
}

在这段代码中,a[i]的计算与a[i]之外的a的元素没有依赖性,所以,每次循环的i可以使独立的完成的,像这样的状态就是work-sharing的。还有例如规约:

s = ;
for (i=; i<n; i++)
{
s+=a[i];
}

虽然s的计算与i相关,但是细想一下,加法在数学上市满足交换律的,s的每次加a[i]实际上不相关的,你不管以什么顺序加和a[i]到s,解结果总是一样的。所以规约也可以理解为是worksharing 的。

基于指令的移植方式的几个重要概念的理解(OpenHMPP, OpenACC)-转载的更多相关文章

  1. Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1

    Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我之前分享过关于离线方式部署Cloudera ...

  2. Spring中Bean的配置:基于XML文件的方式

    Bean的配置一共有两种方式:一种是基于XML文件的方式,另一种是基于注解的方式.本文主要介绍基于XML文件的方式 <bean id="helloWorld" class=& ...

  3. Entity Framework入门教程(18)---EF6中基于代码进行配置方式

    EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...

  4. 基于Xshell使用密钥方式连接远程主机

    基于Xshell使用密钥方式连接远程主机 连接远程主机,就验证身份而言,一般有两种方式,一种是通过用户密码:另一种通过公钥的方式(Public Key). 图1 xshell支持验证登录用户的方式 下 ...

  5. 基于AspectJ的注解方式进行AOP开发

    -------------------siwuxie095                                     基于 AspectJ 的注解方式进行 AOP 开发         ...

  6. 基于AspectJ的XML方式进行AOP开发

    -------------------siwuxie095                                 基于 AspectJ 的 XML 方式进行 AOP 开发         1 ...

  7. vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTable.diffHeight}"

    vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTabl ...

  8. 推荐一种非常好的新版DSP库源码移植方式,含V7,V6和V5的IAR以及MDK5的AC5和AC6版本

    说明: 1.新版CMSIS V5.6里面的DSP库比以前的版本人性化了好多. 2.本帖为大家分享一种源码的添加方式,之前一直是用的库方便,不方便查看源码部分. 3.DSP教程可以还看第1版的,在我们的 ...

  9. Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

随机推荐

  1. grunt 安装使用(一)

    grunt 依赖nodejs,所有在使用前确保你安装了nodejs,然后开始执行grunt命令. .安装node nodejs安装教程 安装完成后在命令行,执行命令: node  -v 出现版本信息, ...

  2. jsp中判断if 和 else

    <c:choose>                   <c:when test="${date==datetime}">                ...

  3. 统计学howto

    统计之都 http://cos.name/ 让你拥有超能力:程序员应该掌握的统计学公式 Statistical Formulas For Programmers http://www.evanmill ...

  4. [转]分享20佳好玩的 jQuery 游戏

    本文转自:http://www.cnblogs.com/lhb25/archive/2011/04/17/2001089.html jQuery是时下最流行的 JavaScript 库.现在,除了HT ...

  5. Murano Weekly Meeting 2015.09.22

    Meeting time: 2015.September.22th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting s ...

  6. lscons 命令,设置当前控制台设备的名称写至标准输出

    用途 将当前控制台设备的名称写至标准输出. 语法 lscons [ -s ] [ -a | -O ] lscons -b [ -s ] [ -a | -O ] lscons -d [ -s ] 描述 ...

  7. OpenCV细化算法简单解析

    细化算法它的原理也很简单: 我们对一副二值图像进行骨架提取,就是删除不需要的轮廓点,只保留其骨架点.假设一个像素点,我们定义该点为p1,则它的八邻域点p2->p9位置如下图所示,该算法考虑p1点 ...

  8. linux_api之进程控制

    本篇索引: 1.引言 2.进程标识 3.多进程 4.fork函数 5.vfork函数 6.exit函数 7.wait和waitpid函数 8.竞态 9.exec函数族 10.进程状态 11.syste ...

  9. join() 和 sleep() 区别

    来源于<Java多线程编程核心技术> 一.join() 作用 在很多情况,主线程创建并启动子线程,如果子线程中需要进行大量的耗时计算,主线程往往早于子线程结束.这时,如果主线程想等待子线程 ...

  10. 让你分分钟学会 javascript 闭包

    闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...