今天扫了一下OpenCL,大概印象是这样的(这里不在语法细节上纠结,只在大面儿上谈一下):OpenCL(Open Compute Language),异构系统(CPU+GPU)并行编程的一个开放标准,接口比较底层,可视为NV自家API向开放标准的一次升级或叫过渡。主要元素有:kernel程序可以在运行时编译(不像CUDA driver API那样由NVCC.exe预编译成ptx/cubin再作为module进行加载),这样可以针对特定上下文特定设备在运行时进行编译;引入buffer object概念进行囊括显存、kernel加载等操作,相当于引入了一个管家婆。

具体细节,请参看下面演示程序,演示程序来自OpenCL快速入门指南:

【演示程序】矢量加(kernel程序)

图中三处标注,第三处get_global_id(0)计算得到线程在work group(OpenCL将block称为work group)使用户屏蔽掉线程号计算的麻烦,此外OpenCL提供了get_local_id() get_work_dim() get_global_size()分别用来获得block内线程号、block内线程数、block个数。

【演示程序】 主机端程序(加载矢量加)

a)       CUDA驱动程序,首先NVCC.exe将其预编译为CUBIN文件vectorAdd.cubin

b)      OpenCL程序,加载的是sProgramSource源程序。

对比这两段程序:

1)  创建上下文的时候,CUDA先选设备,再为选择的设备创建上下文;而OpenGL是为某种类型的设备(比如这里是CL_DEVICE_TYPE_GPU)创建上下文,然后寻找支持这种上下文的设备,之后进行选择;

2)  为这个设备的这个上下文创建命令队列,命令队列里放的是显存读写操作和kernel加载指令;

3)  接着要加载并编译kernel程序啦。注意,这里的编译是特定于这个上下文环境的编译。

4)  下面创建kernel。其实就是在编译后的hProgram里找到VectorAdd那段儿程序,返回一句柄。

5)  接下来分配内存空间、初始化这段空间、分配显存空间。注意,OpenCL里显存是通过buffer对象来管理的。Buffer比CUDA内存管理函数意义要更丰富,可以设置只读、只写模式,也可以设置这段内存区域可直接被设备访问。

6)  执行参数设置,执行kernel。注意,OpenCL里通过clEnqueNDRangeKernel()来加载,可以指定work group和global group的size,都可以是1D/2D/3D。

7)  数据回拷。注意,OpenCL里通过clEnqueReadBuffer()来实现,可以指定回拷方式,例如同步读或异步读。

8)  善后。

【几点不同】CUDA driver API  VS. OpenCL

1.       指针传递

struct Node{Node* next;}

n = n -> next;

这个在CUDA里是允许的,但在OpenCL里不可以。在OpenCL里的指针,基于buffer和offset这样一组概念,即在同一个buffer里(不同buffer不能引用)用offset来引用,比如:

struct Node {unsigned int next;}

n = bufBase + n;

2.       kernel程序的执行方式

CUDA里kernel程序是先被nvcc.exe预编译成ptx / cubin文件,然后在一个CUDA上下文里将其作为module加载并调用其中的函数。而OpenCL程序是将kernel源程序包进来,在运行时根据你选择的设备进行编译(这是不是就是一定程度的跨平台了呢?),当然也可以像CUDA那样编译成二进制再进行加载(总不至于抛弃前辈是吧)。

3.       kernel加载内存偏移

话说OpenCL(一)相关推荐

  1. OpenCL “速成”冲刺【第一天】

    话说软件开发从来没有速成一说,一门语言你学的越快,说明你在别的语言上下个功夫越多,所以这次加了引号,只不过几周之后可能会有一个公司内部OpenCL的考核,虽然本人不需要考核,不过也正好借机整理下之前O ...

  2. opencl 加速 c语言程序_在AlveoU200加速卡上实现简单手写数字识别

    最近实验室租了块xilinx家的AlveoU200加速卡,过去几天被这块板吸引了注意力.刚开始了解,做点什么来试试水呢?一想,可以把曾经学 @蔡宇杰 大佬在pynq-z2上做的那个手写数字识别工程在这 ...

  3. OpenCL,OpenGL编译

    OpenCL,OpenGL编译 TVM已经支持多个硬件后端:CPU,GPU,移动设备等-添加了另一个后端:OpenGL / WebGL. OpenGL / WebGL能够在没有安装CUDA的环境中利用 ...

  4. OpenCL编程详细解析与实例

    OpenCL编程详细解析与实例 C语言与OpenCL的编程示例比较 参考链接: https://www.zhihu.com/people/wujianming_110117/posts 先以图像旋转的 ...

  5. C语言与OpenCL的编程示例比较

    C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...

  6. OpenCL产业开发链

    OpenCL产业开发链 OPEN STANDARD FOR PARALLEL PROGRAMMING OF HETEROGENEOUS SYSTEMS OpenCL™ (Open Computing ...

  7. OpenCL框架与示例

    OpenCL框架与示例 下面的图简单说明了OpenCL的编程框架,图是用的GPU,其他类似: 名词的概念: Platform (平台):主机加上OpenCL框架管理下的若干设备构成了这个平台,通过这个 ...

  8. OpenCL™(开放计算语言)概述

    OpenCL™(开放计算语言)概述 异构系统并行编程的开准 OpenCL™(开放计算语言)是一种开放的.免版税的标准,用于对超级计算机.云服务器.个人计算机.移动设备和嵌入式平台中的,各种加速器进行跨 ...

  9. OpenCL通用异构开放环境

    OpenCL通用异构开放环境 OpenCL全称Open Computing Language,第一个面向异构系统通用目的并行编程的开放式.免费标准,一个统一的编程环境,便于软件开发人员为高性能计算服务 ...

最新文章

  1. linux ssh命令详解
  2. 2017春季华为实习生编程题
  3. C语言在二进制搜索树中查找键的successor and predecessor后继和前任(附完整源码)
  4. 枚举型是什么类型_金属缠绕垫片如何选用?A、B、C、D型都是什么类型?
  5. 怎么做图片文字二维码一起_怎么做?才能让文字编排更出彩
  6. HttpModules 管道过滤 自定义页面
  7. Verilog 教程
  8. 移动通信原理学习笔记之一
  9. 2022深圳杯D题思路:复杂水平井三维轨道设计
  10. 射频中的回波损耗,反射系数,电压驻波比以及S参数的含义和关系
  11. python正则取反,一文搞定Python正则表达式
  12. 屏蔽所有统计代码(51.la cnzz 百度统计 谷歌分析师adsense、屏蔽淘宝客广告代码)的方法
  13. 这篇文章不错,仔细读读,码农晋升为技术管理者后,痛并快乐着的纠结内心...
  14. 基于QPSK+LDPC的微波信道误码率matlab仿真
  15. Python实现一键生成微信好友头像墙
  16. 计算机系单身率排行榜,单身率最高的专业排行!脱不了单的原因找到了
  17. 理解特性阻抗、VSWR 和反射系数(二)
  18. C51单片机各引脚功能
  19. 程序员必备的十大职业生存技巧,收藏保命!
  20. 随机过程笔记(9) 瑞利分布和窄带高斯

热门文章

  1. 《倍增商业成功宝典》全新升级上线!炙夏新品,久等终至!
  2. maya软件需要计算机配置,【答疑】Maya软件对电脑的配置要求 - 视频教程线上学...
  3. 中一级计算机word2010测试题,中一级计算机WORD2010测试题(经修改).doc
  4. 美国计算机图形学研究生排名,美国研究生专业介绍及排名-电子工程EE
  5. C#--第2周实验--任务五--编写一个控制台应用--求两个整数的最小公倍数与最大公约数
  6. javaweb台球俱乐部管理系统
  7. win10输入法不能切换_Win10系统输入法无法切换怎么办?
  8. CVPR2022论文速递(2022.4.1)!共33篇,已分类!
  9. python画地球仪_如何选择纬度和经度在地球仪上形成一个“矩形”?
  10. Spark之提高并行度