当前位置: 首页 > 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)机制扩展了全局存储器区域到主机内存区域的方式

相关文章:

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.数据结构与算法-线性表的应用(线性表与有序表的合并)

线性表的合并 有序表的合并 顺序表 链表...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...

Linux-进程间的通信

1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...