当前位置: 首页 > news >正文

OpenCL 学习(1)---- OpenCL 基本概念

目录

        • Overview
        • 异构并行计算
        • OpenCL 架构
          • 平台模型
          • 执行模型
          • OpenCL 上下文
          • OpenCL 命令队列
          • 内核执行
          • 编程模型
          • 存储器模型
          • 存储器对象
          • 共享虚拟存储器

Overview

OpenCL(Open Computing Language,开放计算语言) 最早由苹果公司提交草案,并于 AMD, IBM ,intelnvdia 逐渐完善

  • 2008年 OpenCL 1.0 技术规范发布
  • 2010年 OpenCL 1.1 发布
  • 2011年 OpenCL 1.2 发布
  • 2013年 OpenCL 2.0 发布
  • 2020年 OpenCL 3.0 发布

OpenCL_Arch

异构并行计算

过去利用 GPU 对图像渲染进行加速的技术已经十分成熟,我们知道GPU的结构适合大规模的并行计算,CPU 则适合逻辑控制,因此不只局限于图像渲染,
人们希望将这种计算能力扩展到更多领域,但是那个时候的GPU 还是为图形渲染特殊设计的流水线,那时GPU的每个部件都是为了图形渲染的某个阶段特殊设计。
在那个时代,要使用GPU计算,则必须要将算法映射成图形的渲染过程

2007年NVIDIA推出 GTX8800 GPU(采用统一的渲染架构,使得在GPU上进行通用计算更容易)和 CUDA(Computing Unified Device Architecture)计算环境开始,
异构并行计算逐渐得到认可。异构并行计算包含两个子概念:异构并行

  • 异构指的是异构并行计算需要同时处理不同架构的计算平台的问题,比如目前主流的异构并行计算平台 x86+GPU、x86+FPGA,以及正在研发的 ARM+GPU
  • 并行指的是并行计算主要采用并行的编程方式,无论是x86处理器,还是ARM和GPU处理器,这里的处理器都是多核向量处理器,要发挥多种处理器混合平台的性能,也必须采用并行的编程方式

OpenCL是一个为异构并行计算平台编写程序的工业标准,此异构计算平台可映射到CPUGPUDSPFPGA等计算设备
OpenCL提供了底层硬件结构的抽象模型,旨在提供一个通用的开放API,既减轻开发人员的编程难度,又让开发人员能够写出高效可移植代码

OpenCL 架构

为了描述OpenCL设计的核心,khronos GroupOpenCL异构计算架构划分为平台模型(platform Model),存储器模型(memory Model),执行模型(excution Model)和编程模型(programming Model),这些模型既相互独立,又相互联系,组成了OpenCL的有机整体

平台模型

平台模型是关于opencl 如何看待硬件的一个抽象描述:
OpenCL平台模型由主机及其相连的一个或者多个OpenCL设备组成,通常主机包含x86ARM处理器的计算平台。
OpenCL 的平台是OpenCL设备和OpenCL框架的组合,不同的OpenCL厂商属于不同的平台

OpenCL 设计可以是 CPU(也可以将主机端的CPU作为设备)、GPUDSP、或者专门的硬件,OpenCL开发商支持的任何处理器。每个OpenCL设备有一个或者多个计算单元,而每个计算单元又是由
一个或者多个处理单元组成,处理单元是设备上执行数据计算的最小单元

OpenCL通常包含HostDevice两种处理器,如何连接这两种处理器就和在这两种处理器之间传输信息的性能密切相关,比如如果设备是 GPU 显卡,主机与其连接的方式就是PCI-E
Platform_Model

执行模型

OpenCL 程序包含主机端程序和设备端内核(kernel)程序,主机端程序运行在主机处理器上,主机端程序以命令的方式将内核程序从主机提交到OpenCL设备,
OpenCL 设备在处理单元上执行计算,OpenCL 没有定义主机代码如何工作的细节,只是定义了它通过
命令队列
OpenCL 设备进行交互

对于OpenCL来说,最重要的是上下文命令队列内核三个概念

OpenCL 上下文

主机使用 OpenCL API 创建和管理上下文,内核对此上下文中执行,上下文定义了内核执行的环境,包含了:

  • 设备: OpenCL 平台包含一个或者多个设备
  • 内核对象: OpenCL 设备上运行的 OpenCL 内核函数
  • 程序对象: 实现整个内核程序的源代码和目标二进制代码
  • 存储器对象: 对主机和OpenCL设备可见的对象,内核执行时操作这些对象的实例

OpenCL 提供了两种方式从代码中构建对象,一种是从源代码中构建,另一种是从源代码中已经编译好的代码上构建

OpenCL 支持了很多种平台,不同的平台有不同的存储器体系,为了处理这种情况,OpenCL引入了存储器对象的概念。
存储器对象在主机上明确定义,并在主机和OpenCL设备之间交换数据

OpenCL 命令队列

命令队列由主机或者运行在设备中的内核提交,命令会在命令队列中等待,直到被调度到 OpenCL 设备上运行,OpenCL 命令队列在上下文中关联到一个OpenCL设备
命令队列中命令分为下面三种类型:

  • 内核入队命令
  • 存储器入队命令
  • 同步命令
内核执行

主机发出一个命令,提交一个内核到OpenCL设备上执行,OpenCL执行时会创建一个整数索引空间。
索引空间是OpenCL支持一个N维的网格,称为NDRange,其中的 N 为 1,2,3 三个长度为N的数据确定了NDRange的下面特征:

  • 每个维度索引空间的范围
  • 一个偏移指数 F 表示每个维度的初始索引值
  • 一个工作组(局部大小) 每个维度大小

内核关联内核参数的参数值定义索引空间的参数,这三个定义了一个内核实例,对应这个索引空间的各个点将分别指向内核的一个实例
我们将指向内核的各个实例称为一个工作项(work-item),工作项将由它在索引空间的坐标来识别,这个坐标就是工作组的全局ID
值从 F 到 F 加上该维度的元素个数减 1,每个工作组使用内核定义的同样的指令序列,尽管指令序列是相同的,但是由于代码中通过全局 ID 选择的数据不同。
因此每个工作项的行为也不同,工作项提供了对索引空间细粒度的分解
多个工作项组织为工作组(work-group),工作组中的工作项的数量由内核入队的参数决定,工作组横跨了整个全局索引空间,提供了对索引空间粗粒度的分解。
同样,每个工作组被指定了一个唯一的ID,值从0开始,到该维度中工作组个数减1

对于分配到一个工作组内的每个工作项,除了有一个全局ID,也赋予了一个局部ID来表示它在所属工作组中的位置,这个局部ID的值从0开始,到工作组内该维度元素个数减 1
通过结合工作组ID和工作组中的局部ID可以唯一地定义一个工作项

例如: 下面定义了一个二维索引空间
NDRange

阴影方块的全局ID(6,5),工作组ID(1,1),工作项局部ID(2,1)

编程模型

定义了并行模型如何映射到实际的物理硬件

存储器模型

Memory_Model

  • 主机内存(Host Memory): 主机直接可用的内存,OpenCL 并未定义主机内存的具体行为,通过 OpenCL API 或者共享虚拟存储器接口,实际存储器对象可以在主机和设备之间传输

  • 全局存储器(global Memory): 这个存储器区域允许上下文设备中的所有工作组的所有工作项的读写,工作项可以读写存储器对象中的任何元素,全局存储器的读写可能被缓存,这个取决于设备能力

  • 常量存储器(constant Memory): 全局存储器的一块区域,在内核实例执行期间其保存的数据保持不变,对于工作项而言这个存储器对象是只读的,主机负责对该存储器对象的分配和初始化

  • 局部存储器(local Memory): 这存储器区域对工作组是局部可见的,它可以用来分配由该工作组的所有工作项共享的变量

  • 私有存储器(private Memory): 这个存储器区域是一个工作项的私有区域,一个工作项的私有存储器定义的变量对其他工作项是不可见的

全局存储器和常量存储器可以在一个上下文内的一个或者多个设备间共享,一个OpenCL设备关联局部存储器和私有存储器

存储器对象

全局存储器中的数据内容可以通过存储器对象来表示,一个存储器对象就是对全局存储器区域的一个引用,在OpenCL 中,存储器对象分为三种不同的类型:

  • 缓冲(buffer): 内核可用的一个连续的存储器区域,内核通过指针来访问缓冲区

  • 图像(image): 图像对象用于存储基于标准格式的图像

  • 管道(pipe): 管道存储器是数据项的有序的队列

共享虚拟存储器

通过映射,可以将设备全局存储器映射到主机可以访问的地址空间,除了这种方式,在 OpenCL 2.0 通过共享虚拟存储器(Shader Virtual Memory,SVM)机制扩展了全局存储器区域到主机内存区域的方式

相关文章:

  • PGMP-03战略一致性
  • 解决docker一直出现“=> ERROR [internal] load metadata for docker.io/library/xxx“的问题
  • 【Kubernetes】常见面试题汇总(四十)
  • 大联大友尚集团推出基于炬芯科技产品的蓝牙音箱方案
  • Linux-基础篇文件权限和组的管理-练习实践(附答案)
  • 算法打卡:第十一章 图论part11
  • RabbitMQ的高级特性-事务
  • 深度学习之贝叶斯分类器
  • NASA数据集:ATLAS/ICESat-2 L3B 每日和每月网格化海冰自由面高度,第 4 版
  • 多个excel表数据比对操作
  • 叉车防撞系统方案,引领安全作业新时代
  • docker-compose 快速部署clickhouse集群
  • 清华大学、腾讯联合推全开源多模态架构Oryx 支持超长视频输入
  • 系统实施方案(word2024原件参考模板)
  • 【网络安全】绕过 Etplorer 管理面板实现RCE
  • ComponentOne 2017 V2版本正式发布
  • Cookie 在前端中的实践
  • co模块的前端实现
  • ECMAScript入门(七)--Module语法
  • go语言学习初探(一)
  • HashMap ConcurrentHashMap
  • JavaScript的使用你知道几种?(上)
  • JS专题之继承
  • Map集合、散列表、红黑树介绍
  • SQLServer之创建显式事务
  • vue-router的history模式发布配置
  • 测试开发系类之接口自动化测试
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 使用docker-compose进行多节点部署
  • 智能网联汽车信息安全
  • 最简单的无缝轮播
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #### golang中【堆】的使用及底层 ####
  • #pragma预处理命令
  • #stm32驱动外设模块总结w5500模块
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)逆序输出字符串
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (MATLAB)第五章-矩阵运算
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (三)mysql_MYSQL(三)
  • (算法)前K大的和
  • (新)网络工程师考点串讲与真题详解
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)setTimeout 和 setInterval 的区别
  • (转)为C# Windows服务添加安装程序
  • (转载)虚函数剖析
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET的微型Web框架 Nancy