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.数据结构与算法-线性表的应用(线性表与有序表的合并)
线性表的合并 有序表的合并 顺序表 链表...
GAN|对抗| 生成器更新|判别器更新过程
如上图所示,生成对抗网络存在上述内容: 真实数据集;生成器;生成器损失函数;判别器;判别器损失函数;生成器、判别器更新(生成器和判别器就是小偷和警察的关系,他们共用的…...
day01——登录功能
逻辑: 前端将登录信息通过报文的形式,发送给后端。后端进行登陆验证 2.1 根据接受的用户名,查询数据表。 若不存在该用户的记录,返回用户不存在。 若用户存在,判断数据库中的密码和接收的是否一致,不一致则…...
Flutter中使用FFI的方式链接C/C++的so库(harmonyos)
Flutter中使用FFI的方式链接C/C库(harmonyos) FFI plugin创建和so的配置FFI插件对so库的使用 FFI plugin创建和so的配置 首先我们可以根据下面的链接生成FFI plugin插件:开发FFI plugin插件 然后在主项目中pubspec.yaml 添加插件的依赖路径&…...
【C++】二义性
在C中,二义性(ambiguity)通常指的是编译器无法确定使用哪个函数、变量或类成员的情况。这种不确定性通常是由于继承和多态特性导致的。下面是一些常见的产生二义性的场景以及如何解决它们的方法: 1. 多重继承中的二义性 当一个类…...
高并发内存池(五):ThreadCache、CentralCache和PageCache的内存回收机制、阶段性代码展示和释放内存过程的调试
目录 ThreadCache的内存回收机制 补充内容1 补充内容2 补充内容3 补充内容4 ListTooLong函数的实现 CentralCache的内存回收机制 MapObjectToSpan函数的实现 ReleaseListToSpans函数的实现 PageCache的内存回收机制 补充内容1 补充内容2 ReleaseSpanToPageCache函…...
STL之stackqueue篇(上)探索C++ STL中的Queue与Stack——构建数据处理的基础框架
文章目录 前言一、stack1.1 定义与基本概念1.2 底层容器1.3 成员函数1.4 使用示例1.5 注意事项1.6 应用场景 二、queue2.1 定义与基本概念2.2 底层容器2.3 成员函数2.4 使用示例2.5 注意事项2.6 应用场景 前言 本文旨在深入探讨C STL中的queue与stack容器,从它们的…...
代码随想录算法训练营Day13
110.平衡二叉树 力扣题目链接:. - 力扣(LeetCode) 后序迭代 class Solution {public boolean isBalanced(TreeNode root) {return getHeight(root)!-1;}public int getHeight(TreeNode root){if(rootnull){return 0;}int leftheightgetHei…...
基于STM32的智能门禁系统
目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 RFID数据采集与处理门禁控制实现显示与报警功能应用场景结论 1. 引言 智能门禁系统在现代安防中占据重要地位,通常用于控制进入和离开特定区域的权限。通过基于STM32微控制器…...
[EBPF] 实时捕获DM数据库是否存在SQL阻塞
1. 介绍 eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter(BPF),后者是由贝尔实验室开发的一种网…...
秋招内推--招联金融2025
【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…...
惠州营销网站制作/网络宣传推广方法
普罗米修斯:Prometheus是一个开放性的监控解决方案,用户可以非常方便的安装和使用Prometheus并且能够非常方便的对其进行扩展 下面将实现一个SpringBoot应用接入Prometheus的全过程 1.2 安装 Linux 安装 官网指定下载包: https://prometheus.io/down…...
活动手机网站开发/营销型网站特点
今天我们学习几个常用的Dockerfile指令,在 http://docs.docker.com/reference/builder/可以查看Dockerfile中能使用的全部指令的清单。 一、CMD指令 CMD指令用于指定一个容器启动时要运行的命令,这与RUN指令有点类似,但RUN指令是指定镜像被…...
网站多条件筛选 html/营销型企业网站建设的内容
增加或减少数据节点的数量和NoOfReplicas(即副本数,通过管理节点的config.ini配置文件来设置)有关,一般来说NoOfReplicas是2,那么增加或减少的数量也应该是成对的,否则要设置另外的NoOfReplicas。首先必须确…...
没网站可以做百度推广吗/网络推广方式有哪几种
HTML 基础 文章目录HTML 基础一,结构1.1HTML文件基本结构1.2标签层次结构二、HTML常见标签2.1 标题标签2.2注释标签2.3段落标签2.4换行标签2.5格式化标签2.6 图片标签 img ☆2.7超链接标签2.8表格2.9列表标签三、表单标签3.1 input ☆3.2 select3.3 textarea3.3 无语…...
建一个网站需要哪些费用/软文发布平台与板块
文/小伊评科技还是那个结论,我不认为现阶段的鸿蒙OS能够在手机这种载体上真正的挑战Android以及IOS,但是未来就不一定了。作为例子,早些年微软凭借WindowPhone以及对于诺基亚的扶持都没能从IOS和安卓手上抢下市场,反而最后落得一个…...
哪个网站买东西是正品又便宜/百度推广公司怎么代理到的
项目包含的功能脚本:login.php//登录reg.php//注册用户user_add.php//注册校验脚本user_login_check.php//登录校验脚本image.php//验证码图片生成脚本流程:设计数据库:包含用户uid,用户名,密码,昵称&#…...