就像大一学C++,大二学汇编一样,我也写弄了些个月的CUDA,然后,想想,应该开始刨根问底地,去学点在CUDA之下层的东西,可能会对异构这个编程了解的多。

1 简介
OpenCL全称:开发计算语言,是并行程序的开发标准,使用与任何异构平台——包括多CPU、GPU、CPU与GPU结合等。OpenCL由Khronos Group维护。
OpenCL是一个用于异构平台上编程的开放性行业标准。这个平台可以包括 CPU GPU和其他各类计算设备,例如 DSP和Cell/B.E.等等。
OpenCL和CUDA的关系很和谐,前者是异构编程规范标准,后者是英伟达基于OpenCL之上开发的一个更面向程序员的GPUAPI。所以,OpenCL适合于包括英伟达和AMD等的显卡
程序开发。

2 认识OpenCL的框架

2.1 平台模型

[1个host]-[1..N个device] (主机:host;设备:device)
[1个device]-[1..N个CU] (计算单元:CU)
[1个CU]-[1..N个PE] (处理单元:PU)

host端管理者整个平台的所有计算资源,应用程序会从host端向各个 OpenCL设备的处理单元发送计算命令。在一个计算单元内的所有处理单元会执行完全相同的一套指令
流程。指令流可以是 SIMD模式或者SPMD模式。所有由OpenCL编写的应用程序都是从Host启动并结束,最终的计算都发生在PE中。

2.2 内存模型

内存介绍:
全局内存 (global memory):工作空间内所有的工作节点都可以读写此类内存中的任意元素。OpenCL C提供了缓存global buer的内建函数。
常量内存 (constant memory):工作空间内所有的工作节点可以只读此类内存中的任意元素。 host负责分配和初始化 constant buer,在内核执行过程中保持不变。
局部内存 (local memory):从属于一个工作组的内存,同一个工作组中所有的工作节点都可以共享使用该类内存。其实现既可以为 OpenCL执行为其分配一块专有内存空间,
也有可能直接将其映射到一块global buer上。
私有内存 (private memory):只从属于当前的工作节点。一个工作节点内部的private buer其他节点是完全不可见的。
在这点上,基本上和CUDA介绍的内存是一样的。这里的局部内存和CUDA的私有变量差不多一个概念。

内存使用:
在内存的使用上,有两种方式:内存拷贝和内存映射。
拷贝数据是指host通过相应的OpenCL API将数据从host写入到OpenCL设备的内存中或者从 OpenCL设备内存读出数据到 host内存中。
内存映射方法允许用户通过相应 OpenCLAPI将OpenCL的内存对象映射到 host端可见的内存地址空间中。映射之后用户就可以在 host端的映
射地址读写该内存了,在读写完成之后用户必须使用对应 API解除这种映射关系。同拷贝内存方式一样,映射内存也分block和non-block模式。

2.3 执行模型

OpenCL的执行模型可以分为两部分,一部分是在 host上执行的主程序(host program),另一部分是在 OpenCL设备上执行的内核程序(kernels),OpenCL通过主程序来
定义上下文并管理内核程序在OpenCL设备的执行。
执行模式最重要的是分配线程网络,这点和CUDA是一回事,可以引用。

2.4 编程模型

OpenCL支持按数据并行的编程模型和按任务并行的编程模型。
数据并行模型是指同一系的列指令会作用在内存对象的不同元素上,即在不同内存元素上按这个指令序列定义了统一的运算。
在任务并行编程模型是指工作空间内的每个工作节点在执行 kernel程序时相对于其他节点是绝对独立的。在这种模式下对每个工作节点都相当于工作在一个单一的计算单
元内,该单元内只有单一工作组,该工作组中只有该节点本身在执行。用户可以通过如下方法实现按任务并行:
-使用OpenCL设备支持的向量类型数据结构
-同时执行或选择性执行多个kernels
-在执行kernels同时交叉性执行一些native kernels程序

OpenCL提供了两个领域的同步:
-在同一个工作组中所有的工作节点之间的同步
-同一个上下文中不同的 command queues之间和同一个 command queue的不同commands之间的同步

从CUDA了解openCL是在阅读和理解相关CUDA编程知识后,在读《OpenCL中文教程》的一个第一章和第二章的知识汇总,去掉了CUDA编程指南中讲解的雷同知识。在了解和
明白OpenCL是怎么一回事儿后,我将开始openCL的Hello world了,虽然,仅仅一个helloword可能没什么意义,但是,象征性的程序必须写起来。

转载于:https://www.cnblogs.com/viviman/archive/2012/12/24/2830610.html

从CUDA开始读OpenCL相关推荐

  1. OpenCL 与 CUDA

    根据网站资料,简单地汇编一下CUDA与OpenCL的区别.如有错误请指出. 题外话: 美国Sandia国家实验室一项模拟测试证明:由于存储机制和内存带宽的限制,16核.32核甚至64核处理器对于超级计 ...

  2. CUDA与OpenCL架构

    原文https://www.cnblogs.com/hlwfirst/p/5003504.html CUDA与OpenCL架构 目录 CUDA与OpenCL架构 目录 1 GPU的体系结构 1.1 G ...

  3. OpenCL与Cuda

    作者:Boy Holy 链接:https://www.zhihu.com/question/19780484/answer/33008684 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 根 ...

  4. 两种GPU计算平台:CUDA 与 OpenCL

    目录 1.硬件层面 2.操作系统 3.软件和社区 4.编程模型 5.CUDA 的优点和局限性 优点 限制 6.OpenCL 的优点和限制 优点 限制 7.补充一点 参考 1.硬件层面 图形加速器的三大 ...

  5. OpenCL/DirectX与CUDA,鱼和熊掌可以兼得?

    OpenCL/DirectX 与 CUDA ,鱼和熊掌可以兼得? 什么是 OpenCL ? OpenCL ( Open Computing Language )是一个为异构平台( CPU . GPU ...

  6. linux 编译opencl,OpenCL编译环境配置(VS+Nvidia)

    英伟达的显卡首先要下载安装CUDA开发包,可以参考这里的步骤:   VS2015编译环境下CUDA安装配置 安装好CUDA之后,OpenCL的配置就已经完成了80%了,剩下的工作就是把OpenCL的路 ...

  7. CUDA刷新:GPU计算生态系统

    CUDA刷新:GPU计算生态系统 CUDA Refresher: The GPU Computing Ecosystem 这是CUDA Refresher系列的第三篇文章,其目标是刷新CUDA中的关键 ...

  8. OpenCL与异构并行计算

    原文:http://blog.csdn.net/changan2001/article/details/52955251 由于人工智能.深度学习和大数据处理随着移动互联的兴起,特别是对于图片.视频.语 ...

  9. 【OpenCV开发】使用OpenCV的OpenCL(ocl)模块

    参加OpenCV的OpenCL模块(以下称OCL)移植工作已经有2个月了.这里我说移植而不是开发,是因为大部分OCL模块的函数都是从已经很成熟的GPU模块移植过来的.于是目前阶段OCL模块所支持的函数 ...

最新文章

  1. [译]Java 设计模式之命令
  2. mui html5电子签名,关于H5电子签名的实现。
  3. linux使关机命令失效,解决Linux系统在设置alias命令重启后失效的问题
  4. 混合式安全灵活性可充分满足无边界企业的发展
  5. 写题过程中碰见的小问题
  6. linux命令---tar
  7. java 13种技术_JavaEE的13种核心技术
  8. 安卓10省电还是费电_拍照成罪魁祸首 安卓十大耗电App排行公布
  9. PhoneClean(iOS设备清理)下载安装,软件介绍
  10. 不定期备考小tips[数模][0] #20210529
  11. Debian 7.4 下mentohust开机自动认证
  12. Kafka SSL 和 ACL 配置
  13. 华南理工网络教育计算机平时作业,2017年华南理工大学网络教育计算机应用基础平时作业...
  14. 常用模块】HC-05蓝牙串口通信模块使用详解
  15. 浅尝辄止MongoDB:操作(1)
  16. HDU 2047 阿牛的EOF牛肉串的java实现思路
  17. Google BigQuery 数据集下载示例
  18. 【陈工笔记】SNN(Spiking Neural Network)的理解
  19. 【python安全攻防】python简易端口扫描器
  20. 【Proteus仿真】51单片机+SHT11温湿度传感器+LCD1602显示

热门文章

  1. spring事务介绍 1
  2. python实现斐波那契数列
  3. python-matplotlib学习(1)
  4. 我希望早几年知道的5个Unix命令
  5. 都9012了,这几个公众号你还没关注?
  6. Simulink之绝缘栅双极型晶体管(IGBT)
  7. 还在手写 Getter/Setter 方法吗?Lombok 让你的代码更简洁!
  8. 求你了,别再随便打日志了,教你动态修改日志级别!
  9. Python 之父退休,C 语言之父与世长辞,各大编程语言创始人现状大曝光!
  10. 微服务架构设计总结实践