转载自:http://www.cmnsoft.com/wordpress/?p=1429

前几节我们一起学习了几个用OPENCL完成任务的简单例子,从这节起我们将更详细的对OPENCL进行一些“理论”学习。

kernel:是指一个用opencl c语言编写的、代表一个单一执行实例的代码单元。opencl c语言看起来跟C语言函数非常相像,都有一个参数列表“局部”变量定义和标准控制流结构。opencl术语中把这种kernel实例称为work-item(工作项)。但opencl kernel与c语方函数的区别在于其并行语义。

work_item:是定义在一个很大的并行执行空间中的一小部分。是并行操作中每一部分的实例化。通俗来说,可以理解为kernel里定义的执行函数。当kernel启动后会创建大量work_item来同时执行,以完成并行任务。work_item根所其数据结构大小可分为一维、二维和三维数据。work_item之是的运行是相互独立的,不同步的。

work_group:opencl将全局执行空间划分为大量大小相等的,一维、二维、三维的work_item集合,这个集合就是work_group。在work_group内部,各个work_item之间允许一定程度的通信。而有work_group保证并发执行来允许其内部的work_item之间的本地同步。

在实际编写内核中,要了解线程调度的维度数,work_group的大小是很重要的,这有利于我们优化编写的内核程序。opencl提供了一此非常有用的函数供我们调用(在内核中调用)。

uint get_work_dim() : 返回线程调度的维度数。

uint get_global_size(uint dimension) : 返回在所请求维度上work_item的总数。

uint get_global_id(uint dimension) : 返回在所请求的维度上当前work_item在全局空间中的索引。

uint get_local_size(uint dimension) : 返回在所请求的维度上work-group的大小。

uint get_local_id(uint dimension) : 返回在所请求的维度上,当前work_item在work_group中的索引。

uint get_number_groups(uint dimension) : 返回在所请求维度上work-group的数目,这个值等于get_global_size 除以 get_local_size。

uint get_group_id(uint dimension) : 返回在所请求的维度上当前wrok_group在全局空间中的索引。

关于使用这些函数,我们举一个之前学过的例子。在第7课《旋转变换(1)》中的内核程序中原文是这样的。

__kernel void rotation(__global int* A,
__global int* B,
int width,
int height,
float sinangle,
float cosangle)
{
//获取索引号,这里是二维的,所以可以取两个
//否则另一个永远是0
int col = get_global_id();
int row = get_global_id(); //计算图形中心点
float cx = ((float)width)/;
float cy = ((float)height)/; int nx = (int)(cx + cosangle * ((float)col-cx) + sinangle * ((float)row-cy));
int ny = (int)(cy + (-*sinangle) * ((float)col-cx) + cosangle * ((float)row-cy)); //边界检测
if(nx>= && nx<width && ny>= && ny<height)
{
B[nx + ny*width] = A[col + row*width];
} }

这里传递的width和height大小是一样的,表示图像数据长宽的大小。其实也就是维度上work_item的总数,我们可以把代码改成。

__kernel void rotation(__global int* A,
__global int* B,
int width,
int height,
float sinangle,
float cosangle)
{
//获取索引号,这里是二维的,所以可以取两个
//否则另一个永远是0
int col = get_global_id();
int row = get_global_id(); //计算图形中心点
float cx = ((float)get_global_size())/;
float cy = ((float)get_global_size())/; int nx = (int)(cx + cosangle * ((float)col-cx) + sinangle * ((float)row-cy));
int ny = (int)(cy + (-*sinangle) * ((float)col-cx) + cosangle * ((float)row-cy)); //边界检测
if(nx>= && nx<get_global_size() && ny>= && ny<get_global_size())
{
B[nx + ny*get_global_size()] = A[col + row*get_global_size()];
} }

把所有的width和heigh全部改成get_global_size(0),程序运行结果是一样的。而且我们还可以少传递两个参数。节省空间,提高效率。大家看下以前的例子,看看那些代码我们还可以优化呢。

OpenCL 第10课:kernel,work_item和workgroup的更多相关文章

  1. bayaim——听课笔记_01.Docker基础应用 10课.txt

    ===========2019年8月5日18:39:06====================10.20.100.21rootbayaim ==========01-Docker介绍======== ...

  2. OpenCL 增强单work-item kernel性能策略

    1.基于反馈的Optimization Report解决单个Work-item的Kernel相关性 在许多情况下,将OpenCL™应用程序设计为单个工作项内核就足以在不执行其他优化步骤的情况下最大化性 ...

  3. 第10课 OpenGL 3D世界

    加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由Lionel Brits (βtelge ...

  4. 第10课_dg

    export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACLE ...

  5. 第10课 C++中的新成员

    1. 动态内存分配 (1)C++通过new关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)delete关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第1个元素. [ ...

  6. 【Deep Learning Nanodegree Foundation笔记】第 10 课:Sentiment Analysis with Andrew Trask

    In this lesson, Andrew Trask, the author of Grokking Deep Learning, will walk you through using neur ...

  7. 缓冲区溢出分析第10课:Winamp缓冲区溢出研究

    前言 Winamp是一款非常经典的音乐播放软件,它于上世纪九十年代后期问世.与现在音乐播放软件行业百家争鸣的情况不同,当时可以说Winamp就是听音乐的唯一选择了,相信那个时代的电脑玩家是深有体会的. ...

  8. Android 学习第10课,Android的布局

    Android的布局 线性布局

  9. 第10课 std::bind和std::function(1)_可调用对象

    1. 几种可调用对象(Callable Objects) (1)普通函数指针或类成员的函数指针 (2)具有operator()成员函数的类对象(仿函数).如c++11中的std::function类模 ...

随机推荐

  1. java中的JSON对象的使用

    申明:没工作之前都没听过JSON,可能是自己太菜了.可能在前台AJAX接触到JSON,这几天要求在纯java的编程中,返回JSON字符串形式. 网上有两种解析JSON对象的jar包:JSON-lib. ...

  2. Android LayoutInflater.inflate使用上的问题解惑

    最近在在使用LayoutInflater.inflate方法时遇到了一些问题,以前没有仔细看过此类的使用方法,故将其记录下来,方便日后查阅. 相信大家都知道LayoutInflater.inflate ...

  3. js获取任意元素到页面的距离

    function getPos(obj){ var pos={left:0,top:0} while(obj){ pos.left+=obj.offsetLeft; pos.top+=obj.offs ...

  4. sort对象数组排序

    function objectSort(property, desc) { //降序排列 if (desc) { return function (a, b) { return (a[property ...

  5. Gitlab服务器搭建(For fedora23)

    1. Install and configure the necessary dependencies sudo yum install curl policycoreutils openssh-se ...

  6. MySql中常用语句

    1.查询语句: SELECT  查询字段  FROM  表名   WHERE 条件 查询字段可以使用 通配符* 字段名 别名(把长的名字命名一个别名,比较短的) 通配符:SELECT * FROM ' ...

  7. 如何处理ajax中嵌套一个ajax

    在做项目的时候 遇到过第二次了 当我第二次去问'公子'的时候 被吐槽了 原来我以前遇到过 只是忘记了...他老人家竟然还记得... ajax由于他的异步特性 在第一次请求中的循环中嵌套第二个ajax会 ...

  8. IP,TCP,UDP Checksum校验

    IP数据报的校验: IP数据报只需要对数据头进行校验,步骤如下: 将接收到的数据的checksum字段设置为0 把需要校验的字段的所有位划分为16位(2字节)的字 把所有16位的字相加,如果遇到进位, ...

  9. htm、html、shtml区别

    htm.html.shtml都是静态网页的后缀,三者也可以说都是只是扩展名不同,其他一样,都是静态的网页. htm和html是完全静态的网页不通过服务器编译解释直接送出给浏览器读取的静态网页,以htm ...

  10. VC释放EXE资源文件

    原文地址:http://blog.csdn.net/wangningyu/article/details/4378378 今天有个朋友问到VC能否释放多个EXE.DLL或WAV等文件,我便做了个实例给 ...