OpenCL 学习(1)---- OpenCL 基本概念
目录
- Overview
- 异构并行计算
- OpenCL 架构
- 平台模型
- 执行模型
- OpenCL 上下文
- OpenCL 命令队列
- 内核执行
- 编程模型
- 存储器模型
- 存储器对象
- 共享虚拟存储器
Overview
OpenCL(Open Computing Language,开放计算语言) 最早由苹果公司提交草案,并于 AMD, IBM ,intel 和 nvdia 逐渐完善
- 2008年 OpenCL 1.0 技术规范发布
- 2010年 OpenCL 1.1 发布
- 2011年 OpenCL 1.2 发布
- 2013年 OpenCL 2.0 发布
- 2020年 OpenCL 3.0 发布

异构并行计算
过去利用 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是一个为异构并行计算平台编写程序的工业标准,此异构计算平台可映射到CPU、GPU、DSP和FPGA等计算设备
OpenCL提供了底层硬件结构的抽象模型,旨在提供一个通用的开放API,既减轻开发人员的编程难度,又让开发人员能够写出高效可移植代码
OpenCL 架构
为了描述OpenCL设计的核心,khronos Group将 OpenCL异构计算架构划分为平台模型(platform Model),存储器模型(memory Model),执行模型(excution Model)和编程模型(programming Model),这些模型既相互独立,又相互联系,组成了OpenCL的有机整体
平台模型
平台模型是关于opencl 如何看待硬件的一个抽象描述:
OpenCL平台模型由主机及其相连的一个或者多个OpenCL设备组成,通常主机包含x86和ARM处理器的计算平台。
OpenCL 的平台是OpenCL设备和OpenCL框架的组合,不同的OpenCL厂商属于不同的平台
OpenCL 设计可以是 CPU(也可以将主机端的CPU作为设备)、GPU、DSP、或者专门的硬件,OpenCL开发商支持的任何处理器。每个OpenCL设备有一个或者多个计算单元,而每个计算单元又是由
一个或者多个处理单元组成,处理单元是设备上执行数据计算的最小单元
OpenCL通常包含Host和Device两种处理器,如何连接这两种处理器就和在这两种处理器之间传输信息的性能密切相关,比如如果设备是 GPU 显卡,主机与其连接的方式就是PCI-E

执行模型
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可以唯一地定义一个工作项
例如: 下面定义了一个二维索引空间

阴影方块的全局ID(6,5),工作组ID(1,1),工作项局部ID(2,1)
编程模型
定义了并行模型如何映射到实际的物理硬件
存储器模型

-
主机内存(
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)机制扩展了全局存储器区域到主机内存区域的方式
相关文章:
OpenCL 学习(1)---- OpenCL 基本概念
目录 Overview异构并行计算OpenCL 架构平台模型执行模型OpenCL 上下文OpenCL 命令队列内核执行编程模型存储器模型存储器对象共享虚拟存储器 Overview OpenCL(Open Computing Language,开放计算语言) 最早由苹果公司提交草案,并于 AMD, IBM ,intel 和 n…...
自定义注解加 AOP 实现服务接口鉴权以及内部认证
注解 何谓注解? 在Java中,注解(Annotation)是一种特殊的语法,用符号开头,是 Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量,提供某些信…...
《软件工程概论》作业一:新冠疫情下软件产品设计(小区电梯实体按钮的软件替代方案)
课程说明:《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论(第6版)》(张海藩等编著,清华大学出版社)作为教材。以《软件设计文档国家标准GBT8567-2006》…...
基于Ernie-Bot打造语音对话功能
大模型场景实战培训,提示词效果调优,大模型应用定制开发,点击咨询 咨询热线:400-920-8999转2 GPT-4的语音对话功能前段时间在网上火了一把,许多人被其强大的自然语言处理能力和流畅的语音交互所吸引。现在,…...
动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络
3.1 线性回归 线性回归是对n维输入的加权,外加偏差 线性回归可以看作是单层神经网络 回归问题中最常用的损失函数是平方误差函数。 平方误差可以定义为以下公式: 常数1/2不会带来本质的差别,但这样在形式上稍微简单一些 (因为当…...
ROS理论与实践学习笔记——2 ROS通信机制之服务通信
服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A,用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输…...
技术成神之路:设计模式(十八)适配器模式
介绍 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类可以协同工作,通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。 1.定义 适配…...
图神经网络:处理复杂关系结构与图分类任务的强大工具
创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力! 图神经网络(Graph Neural Network, GNN)是针对图数据的一类神经网络模型。图数据具有节点(节点代表实体)和边(边代表节点之间的…...
LeetCode: 1971. 寻找图中是否存在路径
寻找图中是否存在路径 原题 有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点…...
mysql 查询表所有数据,分页的语句
在 MySQL 中,若要从表中查询所有数据并实现分页,你可以使用 SELECT 语句结合 LIMIT 和 OFFSET 子句。LIMIT 用于指定返回的记录数,而 OFFSET 则用于指定从哪一条记录开始返回(即跳过的记录数)。 以下是一个基本的分页…...
TI DSP TMS320F280025 Note13:CPUtimer定时器原理分析与使用
TMS320F280025 CPUtimer定时器原理分析与使用 ` 文章目录 TMS320F280025 CPUtimer定时器原理分析与使用框图分析定时器中断定时器使用CPUtimers.cCPUtimers.h框图分析 定时器框图如图所示 定时器有一个预分频模块和一个定时/计数模块, 其中预分频模块包括一个 16 位的定时器分…...
Australis 相機率定軟體說明
概要 課堂中使用Australis這套軟體,順帶記錄操作過程 內容以老師口述及我測試的經過 照片為老師課堂提供之 說明 執行 Step1. 匯入照片 注意!!如果是Mac的作業系統,將資料夾移到Windows上的時候,建議創一個新的資料…...
C++入门(有C语言基础)
string类 string类初始化的方式大概有以下几种: string str1;string str2 "hello str2";string str3("hello str3");string str4(5, B);string str5[3] {"Xiaomi", "BYD", "XPeng"};string str6 str5[2];str…...
第四届高性能计算与通信工程国际学术会议(HPCCE 2024)
目录 大会简介 主办单位,承办单位 征稿主题 会议议程 参会方式 大会官网:www.hpcce.net 大会简介 第四届高性能计算与通信工程国际学术会议(HPCCE 2024)将于2024年11月22-24日在苏州召开。HPCCE 2024将围绕“高性能计算与通信工…...
负载均衡架构解说
负载均衡架构是一种设计模式,用于在多个服务器之间分配网络或应用流量,以提高资源利用率、最大化吞吐量、减少响应时间,并确保高可用性。 负载均衡架构的关键组件和概念: 关键组件 1.负载均衡器(Load Balancer&…...
【异常数据检测】孤立森林算法异常数据检测算法(数据可视化 Matlab语言)
摘要 本文研究了基于孤立森林算法的异常数据检测方法,并在MATLAB中实现了该算法的可视化。孤立森林是一种无监督的异常检测算法,主要通过构建决策树来区分正常数据和异常数据。本文使用真实数据集,通过二维可视化展示了检测结果。实验结果表…...
MKV转MP4丨FFmpeg的简单命令使用——视频格式转换
MKV是一种视频封装格式,很好用,也是OBS的默认推荐录制格式,因为不会突然断电关机而导致整个视频录制文件丢失。 但是MKV无法直接导入PR中剪辑,最直接的方法是将MKV转换为MP4格式,最方便且安全无损的转换方法便是用FFmp…...
git使用“保姆级”教程4——版本回退及分支讲解
一、版本回退 1、历史回退(版本回退)——命令行git reset --hard 版本编号 注意:当前命令会让工作区的内容发生改变,可以理解成历史区(master分支)直接回到工作区比如:从版本4回到版本3,则工作区只会显示版本3的代码内容 1.1、指…...
spring cache,Spring data redis
本项目使用Redis存储缓存数据,如何通过Java去访问Redis? 常用的有Jedis和Lettuce两个访问redis的客户端类库 ,Jedis和Lettuce都是redis提供的。其中Lettuce的性能和并发性要好一些,Spring Boot 默认使用的是 Lettuce 作为 Redis …...
10.数据结构与算法-线性表的应用(线性表与有序表的合并)
线性表的合并 有序表的合并 顺序表 链表...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
