什么是OpenCL?

什么是OpenCL?

1.概述

  • OpenCL(Open Computing Language 开放计算语言)是一种开放的、免版税的标准,用于超级计算机、云服务器、个人计算机、移动设备和嵌入式平台中各种加速器的跨平台并行编程。OpenCL是由Khronos Group创建和管理的。OpenCL使应用程序能够使用系统或设备中的并行处理能力,从而使应用程序运行得更快、更流畅。

2.OpenCL是如何工作的?

  • OpenCL是一种编程框架和运行时,它使程序员能够创建称为内核程序(或内核)的小程序,这些程序可以在系统中的任何处理器上并行编译和执行。处理器可以是不同类型的任意组合,包括cpu、gpu、dsp、fpga或张量处理器——这就是为什么OpenCL经常被称为异构并行编程的解决方案。
  • OpenCL框架包含两个api。platform layer API在主机CPU上运行,首先用于使程序能够发现系统中可用的并行处理器或计算设备。通过查询哪些计算设备可用,应用程序可以在不同的系统上便携地运行—适应加速器硬件的不同组合。一旦发现了计算设备,platform layer API就允许应用程序选择并初始化它想要使用的设备。
  • 第二个API是Runtime API,它使应用程序的内核程序能够为它们将要运行的计算设备编译,并行加载到这些处理器上并执行。一旦内核程序完成执行,将使用Runtime API收集结果。

在这里插入图片描述

  • 为了更好使用与不同的处理器,OpenCL抽象出来了四大模型:
    1. 平台模型:描述了OpenCL如何理解拓扑连接系统中的计算资源,对不同硬件及软件实现抽象,方便应用于不同设备
    2. 存储模型:对硬件的各种存储器进行了抽象
    3. 执行模型:程序是如何在硬件上执行的
    4. 编程模型:数据并行和任务并行

3.平台模型

在这里插入图片描述

  • OpenCL中,需要一个主机处理器(Host),一般为CPU。而其他的硬件处理器(多核CPU/GPU/DSP等)被抽象成Compute Device。每个Compute Device 包含多个 Compute Unit,每个Compute Unit 又包含多个Processing Elements(处理单元)
  • 举例说明:计算设备可以是GPU,计算单元对应于GPU内部的流多处理器(streaming multiprocessors(SMs)),处理单元对应于每个SM内部的单个流处理器。处理器通常通过共享指令调度和内存资源,以及增加本地处理器间通信,将处理单元分组为计算单元,以提高实现效率。

4.存储模型

  • OpenCL中定义了不同类型的存储区域

  • Host memory:主机CPU可用,可以通过直接传输/共享内存的方式与设备端进行数据传输;

  • Global/Constant memory:对计算设备上的所有计算单元可用

  • Local memory:对计算单元中所有处理单元可用的

  • Private memory:对单个处理单元可用,在硬件实现上通常映射为寄存器在这里插入图片描述

  • 在 OpenCL 中,全局存储器中的数据内容通过存储对象来表示(Memory Object),在 OpenCL 中较为常用的两个存储对象为:Buffer Objects 和 Image Objects在这里插入图片描述

5.执行模型

  • 主机应用程序使用OpenCL命令队列将内核和数据传输函数发送到设备以执行。通过将命令入队到命令队列中,内核和数据传输函数可以与应用程序主机代码并行异步执行。在这里插入图片描述

重要概念:

  • Context:每个Context支持多个Device,Host端通过Context与Device端进行交互和管理
  • Commend Queue:Host端发送命令到队列中让Device端去执行(顺序乱序执行都行),一个命令队列只能管理一个设备。
  • Kernel Objects:OpenCL核心计算部分,类似C语言的代码。在需要设备执行计算任务时,数据会被推送到Device端,然后Device端的计算单元会并发执行内核程序
  • Program Objects:Kernel Object的集合,OpenCL中可以使用cl_program表示

执行流程:

  1. 查询可用的OpenCL平台和设备
  2. 在平台上为OpenCL设备创建一个context
  3. 在context上为OpenCL设备创建并编译程序
  4. 选择kernel去执行程序
  5. 为内核创建为其操作的内存对象
  6. 在一个OpenCL Device上创建一个命令队列去执行命令
  7. 如果需要,将数据传输命令排队到内存对象中
  8. 将内核排队到命令队列中去执行
  9. 如果需要,将命令入队,以便将数据传输回主机

高效并行计算:

  • 为了提高执行效率,处理器通常会将处理元素分组为计算单元。因此,当使用clEnqueueNDRangeKernel命令时,程序指定了一个工作组大小,该工作组大小表示可以在计算单元上容纳的nrange中的单个工作项组。相同工作组中的工作项能够共享本地内存,使用工作组屏障更容易地同步,并使用工作组函数(如async_work_group_copy)更有效地合作,这些在单独工作组中的工作项之间是不可用的。
    在这里插入图片描述

6.编程模型

OpenCL 定义了两种不同的编程模型:任务并行数据并行

  • 数据并行:划分计算数据,分配给不同的计算单元进行同时计算,适用于数据相互独立的计算任务。
  • 任务并行:计算步骤的每一个步骤有前后依赖,这使得我们无法将计算任务并行执行。于是,我们只能对每一个步骤的数据进行并行,之后将整个流程进行异步/同步串行执行,为了协调整个流程的先后关系,OpenCL 提供了Event 机制用来进行流程同步控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/147964.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

requests库验证错误解决方法

用户在使用requests库进行http请求时,遇到了一个AuthenticationRequired(身份验证必须)的错误。但是,当使用urllib.request.urlopen进行相同的操作时,却能够成功。同时,用户提供了自己的系统信息&#xff0…

记一次线上问题引发的对 Mysql 锁机制分析 | 京东物流技术团队

背景 最近双十一开门红期间组内出现了一次因 Mysql 死锁导致的线上问题,当时从监控可以看到数据库活跃连接数飙升,导致应用层数据库连接池被打满,后续所有请求都因获取不到连接而失败 整体业务代码精简逻辑如下: Transaction p…

requests Python 官方文档中的 py3 请求链接问题及解决方案

作为一位程序员,加班对我来说并不陌生。虽然老板常说加班是对挑战的追求,但我更愿意将其看作是与bug约会的机会。在这篇文章中,我将分享一个我在requests Python 官方文档中遇到的问题,并给出解决方案。问题在于如何获取py3的请求…

锐捷 Smartweb管理系统命令注入漏洞复现 [附POC]

文章目录 锐捷 Smartweb管理系统命令注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 锐捷 Smartweb管理系统命令注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测…

VMware 安装CentOS7

一、软件准备 VMware 虚拟机安装 官网下载链接:VMware pro 17 下载链接 下载 VMware Workstation Pro | CN vm安装教学就不在细说,纯傻瓜式安装 Centos 7镜像文件下载 下载地址: Index of /centos/ | 清华大学开源软件镜像站 | Tsinghua O…

AI+视觉,共话新能源企业数字化转型新可能

​ 近日,“新能源芯机遇2023新能源行业数字化赋能高峰论坛”在江苏常州隆重召开。本次论坛由常州市人民政府、中国能源研究会指导,武进区人民政府、常州市工业和信息化局、英特尔(中国)有限公司、阿里云计算有限公司共同举办&…

Android实验:Activity界面基础

目录 前言实验目的实验内容实验要求代码实现mainActivityResultActivityactivity_mainactivity_result 结果展示 前言 我们都知道,activity是Android中最重要的组件之一,关于activity的具体内容在这里就不多赘述,主打的就是一个主次分明&…

【C++】哈希(模拟实现unordered系列容器)

一、哈希表的改造 1、模板参数列表的改造 K:关键码类型V:不同容器V的类型不同。如果是 unordered_map,V 代表一个键值对;如果是 unordered_set,V 为 K。KeyOfValue:因为 V 的类型不同,通过 valu…

京东API商品详情接口丨关键词搜索接口丨优惠券接口丨京东店铺所有商品接口

京东API商品详情接口,关键词搜索接口,优惠券接口,京东店铺所有商品接口如下: item_get-获得JD商品详情 公共参数 请求地址: https://o0b.cn/anzexi 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中&…

相关关系与因果关系

本文来自:https://towardsdatascience.com/a-step-by-step-guide-in-detecting-causal-relationships-using-bayesian-structure-learning-in-python-c20c6b31cee5 作者:Erdogan Taskesen 在机器学任务中,确定变量间的因果关系(c…

BUUCTF 荷兰宽带数据泄露 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 下载附件,解压得到一个.bin文件。 密文: 解题思路: 1、刚开始没什么思路,看了别人的题解,了解到一个新工具RouterPassView。大多数现代路由器都可以让您备…

遍历一个对象,并得出所对应的

var dates {//定义的对象year:now.getFullYear(),month:now.getMonth()1,date:now.getDate(),hour:now.getHours(),minute:now.getMinutes(),second:now.getSeconds() }//开始遍历循环 var val; for (val in dates){console.log(对象名称:val-对象的值:…

PDF文件标题修改方法

目录 一、PDF文件的标题和名称 二、标题修改方法 1.浏览器打开PDF Editor Free网站 2.点击Free Oline 3.选择第三个从本地上传PDF附件 4.将附件上传,两种方法都可以​编辑 5.等待加载,附件大的情况下会有些慢,耐心等待即可 6. 导入文…

MATLAB中uiwait函数用法

目录 语法 说明 示例 等待对警报对话框的响应 等待对模态消息对话框的响应 等待按钮按下 等待超时 uiwait函数功能是阻止程序执行并等待恢复。 语法 uiwait uiwait(f) uiwait(f,timeout) 说明 uiwait 阻止程序执行,直至调用了 uiresume 函数或删除了当前…

Linux_包管理_apt相关命令的使用

以思维导图的形式整理了下apt相关的命令,便于查阅,主要分为软件源、安装卸载升级、查看; 1、软件源 2、安装、卸载、升级 3、查看 参考链接: Using apt Commands in Linux [Ultimate Guide] 6. apt更新软件源 — 快速使用手册—…

2023年10月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年10月国产数据库大事件和重要产品发布消息。 目录 10月国产数据库大事记 TOP1010月国产数据库大事记(时间线)产品/版本发布兼容认证代表厂商大事记厂商活动排行榜新增数据库相关资料 10月国产数据库大事记 TOP10 10月国产…

Masked Relation Learning for DeepFake Detection

一、研究背景 1.现有deepfake检测方法大多关注于局部伪影或面部不协调,较少挖掘局部区域间的关系。 2.现有关系挖掘类的工作往往忽略了关系信息的传播。 3.遮挡建模在减轻信息冗余的同时促进高级语义信息(诱导性偏差较小)的挖掘,有…

小型洗衣机哪个牌子好用又耐用?性价比高的内衣洗衣机测评

大多数的用户对自己的内衣、内裤的卫生非常注重,而往往许多的用户都会选择自己手工清洗,但是单靠手工洗只是表面的污渍,并不能完全去除贴身衣物上的各种细菌。现在通过内衣裤感染到细菌真的是越来越多,所以我们对内衣裤的清洗频次…

LeetCode——OJ题之二叉树【上】

✏️✏️✏️今天给大家分享几道二叉树OJ题! 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手,点点关注点点赞&#xff…

企业设备巡检的痛点和解决方案

在设备巡检过程中,企业常面临多种痛点。首先,信息管理不足是一个关键问题,企业往往缺乏全面、准确的设备信息记录,这导致巡检工作缺乏针对性和效率。其次,巡检流程的非标准化使得巡检结果出现不一致,重要的…