【OpenCL基础 · 一】因源

文章目录

  • 前言
  • 一、单核标量处理器的瓶颈
    • 1.提升时钟频率
    • 2.提升指令级并行能力
  • 二、多核和向量化
    • 1.多核
    • 2.向量化
  • 三、异构并行和OpenCL
    • 1.GPGPU
    • 2.CUDA和OpenCL


前言

随着人工智能的发展以及大部分场景中实时性的要求,人们对于计算机算力要求逐渐增加。为了提高计算速度,计算平台从单核发展为多核,从标量数据发展为向量化运算,进而发展到当下流行的异构并行计算

异构,是指计算硬件平台由不同架构的处理器组成,如CPU+GPU、CPU+FPGA、CPU+DSP,甚至是CPU+GPU+FPGA。异构相当于使用了一个具有多处理器的计算平台,博众家之长,以获得优异的算力,加快任务的处理速度。其中CPU擅长调度,GPU擅长向量运算,DSP擅长数字信号处理,FPGA则利于用户自定义配置。

并行,是发挥异构平台效能所必须采用的运行方式,它包含两个含义:一是不同架构的处理器需要同时计算,避免闲置;二是每个处理器一般都是多核向量处理器,需要使用并行编程以充分发挥处理器的计算能力。

所以,“异构并行”是一个不可分割的词组。

OpenCL(Open Computing Language)就是在异构并行计算发展的道路上,兴起的一种编程语言模型,由于其开源性和高度通用的跨平台设计原则,得到了多家处理器大厂的支持,包括AMD、Intel、Altera等。

本文对异构并行计算的起源、及OpenCL的出现进行介绍,方便大家进一步体会设计师在算力提升道路上的努力。

参考:《OpenCL异构并行计算——原理、机制与优化实践》


一、单核标量处理器的瓶颈

在2005年前,大部分处理器都是单核的,并且大部分的应用程序只使用了单核处理器的标量性能,即在同一时间内只处理一个数据(整数或浮点数),称为SISD(单指令单数据流)。基于CISC、RISC指令集设计的处理器即属于SISD类。

对于单核标量处理器而言,性能提升只能从以下两个方面入手,

  • 提升处理器的时钟频率
  • 提升指令级并行能力

然而,两条路都会遇到发展瓶颈。 摩尔定律称 “单核标量处理器性能每18个月提升一倍”,这条定律在2005年之后就不灵了==

1.提升时钟频率

处理器的时钟频率表示处理器1秒内可以运行多少个基本操作,每个基本操作需要占用一个时钟周期。一些复杂的操作则需要占用几个时钟周期,而一条指令包含了多个基本/复杂操作。当我们提升处理器的时钟频率时,1秒内处理器就可以执行更多的操作,也就能加快指令的执行速度,从而增加了算力。

一般情况下,能显著提高处理器时钟频率的方法是减小芯片制程。

这里解释一下为什么制程影响时钟频率。处理器芯片绝大多数属于数字逻辑芯片,其主要组成是大量的晶体管,芯片制程指晶体管栅极的最小宽度(即常说的7nm、14nm…)。当制程越小时,电流通过栅极的速度越快,晶体管的翻转速度就越快,也就可以支持较大的时钟频率。
我们常说的超频则是指使CPU在超过其额定时钟频率下工作,这可能导致晶体管的状态来不及变化,产生死锁或丢数等故障。

减小芯片制程,在提高时钟频率的同时,还能减小晶体管体积,使得芯片上可以布下更多的晶体管,进一步提升算力。

但更高的时钟频率也带来了更多的功耗(主要是漏电功耗),大致来说处理器的功耗和处理器频率的三次方近似成正比。功耗带来热量,处理器的频率增大的同时,散热也在增多。在处理器的散热达到现实环境、技术能够满足的界限时,无法再增加频率,否则处理器会烧毁。

因此,功耗限制了时钟频率的提升!

2.提升指令级并行能力

处理器在执行指令时可分为五个步骤:取指令、指令解码、执行、访存和写回
为了增大数据吞吐量,处理器会采用流水线的方式执行指令,流水线工作原理可参考:
【计算机组成原理】流水线式指令执行

由于指令中存在分支判断、数据依赖等情况,因此流水线的执行有很大优化空间,尤其需要编译器在编译源码时充分考虑代码运行特点,合理安排流水线,以生成较优的执行文件。

但是要利用好指令级并行能力,对于代码优化人员、编译器作者和处理器设计师都有很高的要求。他们采取的优化方式包括合理重用寄存器、增加硬件流水线层级等。

目前,提升指令级并行能力也达到了一定局限性。

二、多核和向量化

1.多核

前面讲过,在单核上不断提高时钟频率以谋求更高的计算性能,会使得功耗越来越大,芯片难以承受。但换一种思路,为何非要单打独斗呢?

因此多核出场了,在一个芯片上使用多个核心共同计算,可以起到“三个臭皮匠顶个诸葛亮”的效果。
并且,多核支持了多线程并行,每个核都可以运行一个任务,计算机可以同时处理用户的不同请求,提高使用体验。

2.向量化

向量化是指一条指令同时处理多个数据,是一种数据并行技术
主流的向量化技术包括:单指令多数据(SIMD),单指令多线程(SIMT)

由于SIMD依赖于更多的处理器ALU,而SIMT依赖于多核,因此多数CPU采用SIMD技术,多数GPU采用SIMT技术。二者的具体介绍可参考:怎么理解SIMD和SIMT

若把标量运算看作是指令对一个数字进行操作,那么SIMD可以理解为指令对一个向量进行操作。一个向量中包含多个数字,因此一次指令的执行就可以获得多个数字的计算结果,相比于原来只能获得一个计算结果来说,SIMD提高了计算效率。可视化如下图
在这里插入图片描述
多核和向量化能大幅提升代码性能,但是需要程序员对代码进行并行化,需要分析代码中数据和操作的依赖关系,处理任务和数据的划分。

重要的是,若代码无法多核并行化或向量化,那么多核向量处理器的一些算力就会浪费。

三、异构并行和OpenCL

异构并行的概念在前言部分已做过介绍,那么它相对于多核向量化的优势是什么呢?

我认为,异构并行汇聚了各类处理器的优势,可以允许程序员灵活配置代码的运行平台。无法并行的代码就在CPU上运行,而大量数据的并行运算则可以放在GPU上执行,充分发挥综合平台的优势,实现代码运行的最大性能。

异构平台也存在功耗大的问题,此时功耗和性能就是一对需要权衡的特性,设计人员要自我把控。

提到异构平台,不得不提到的就是GPU的发展,它的强大算力成为异构并行设计的重要支撑。

1.GPGPU

GPU(Graphics Processing Unit),顾名思义,是图形处理器,设计之初是专门用来渲染图形界面的。它的每个部件都是为了图形渲染的某一个阶段特殊设计的。渲染一个图形需要顺序地经过所有流水线处理。

在当时,若要使用GPU进行计算,就必须将算法映射成图形的渲染过程,用来进行图形编程的主要接口就是OpenGL。使用OpenGL可以将计算过程映射为图形渲染过程,进而达到计算目的。这样的GPU称为GPGPU。

这无疑对程序员的图形渲染知识要求很高,因此后续出现了更适于计算的GPU。2007年NVIDIA推出GTX8800,采用了统一的渲染架构,这使得通用计算更容易进行。

2.CUDA和OpenCL

CUDA是NVIDIA推出的通用并行计算架构,配套自家的GPU平台使用,开发者使用C语言即可基于该架构进行并行计算,调动多核GPU的强大算力。CUDA仅支持NVIDIA的GPU,通用性不高;开源的OpenCL架构成为处理器厂商青睐的对象,也因此具有较高的通用性。

OpenCL由苹果公司开发,后期交给Khronos Group维护,当前已经更新至OpenCL 3.0版本。它支持包括GPU、CPU在内的多种处理平台,并且主流或新起的处理器厂家也更倾向于选择OpenCL作为自己的并行计算架构。

OpenCL提供主机端API,有自己的硬件架构,提供完整的并行编程框架,对于开发者而言也是比较友好的。


【博客参考】
CPU时钟周期和时钟频率

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ES】笔记-Promise基本使用

笔记-基本使用 一、初始Promise1. 抽象表达:2. 具体表达:为什么要用 Promise?promise的基本流程 二、fs读取文件三、AJAX请求四、Promise封装fs模块五、util.promisify方法六、Promise封装AJAX操作 一、初始Promise 1. 抽象表达: 1. Promise 是一门新的技术(ES6 规范) 2. Pr…

短视频矩阵系统接口部署技术搭建

前言 短视频矩阵系统开发涉及到多个领域的技术,包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此,短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编程能力、熟练掌握多种开发工具和框架,并掌握…

C++(17):异常处理

异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。 异常使得能够将问题的检测与解决过程分离开来:程序的一部分负责检测问题的出现,然后解决该问题的任务传递给程序的另一部分。检测环节无须知道问题处理模块的…

数据结构入门 — 栈

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。 博客主页&am…

【C++】关于using namepace xxx 使用命名空间和冲突

官方定义 namespace是指 标识符的各种可见范围。命名空间用关键字namespace来定义。 命名空间是C的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。 基本使用 编译及执行命令: g test.cpp -o test ./…

汽车制造行业,配电柜如何实施监控?

工业领域的生产过程依赖于高效、稳定的电力供应,而配电柜作为电力分配和控制的关键组件,其监控显得尤为重要。 配电柜监控通过实时监测、数据收集和远程控制,为工业企业提供了一种有效管理电能的手段,从而确保生产的连续性、安全性…

Python程序化交易接口批量获取数据源码

小编举例下面是一个简单的示例代码,展示如何使用Python的程序化交易接口批量获取数据,例如开发文档参考:MetaTradeAPI (metatradeapi) - Gitee.com 签名 int Init(); 功能 API 初始化 参数 无 返回值 授权成功的交易账户数量 返回值 &…

实战系列(一)| Dubbo和Spring Cloud的区别,包含代码详解

目录 1. 概述2. 核心功能3. 代码示例4. 适用场景 Dubbo 和 Spring Cloud 都是微服务架构中的重要框架,但它们的定位和关注点不同。Dubbo 是阿里巴巴开源的一个高性能、轻量级的 RPC 框架,主要用于构建微服务之间的服务治理。而 Spring Cloud 是基于 Spri…

学术加油站|基于端到端性能的学习型基数估计器综合测评

编者按 本文系东北大学李俊虎所著,也是「 OceanBase 学术加油站」系列第 11 篇内容。 「李俊虎:东北大学计算机科学与工程学院在读硕士生,课题方向为数据库查询优化,致力于应用 AI 技术改进传统基数估计器,令数据库选…

Kubernetes技术--k8s核心技术持久化存储

有时候需要在集群中进行一些重要的数据进行持久化存储,然后需要的时候再进行挂载,那么下面我们一起来看看如何实现数据的持久化存储操作。 1.nfs网络存储 -1.找一台服务器做nfs的服务端,安装nfs。(这里我们直接在master上实现)。 这里应该找再单独的搭建一个node节点做持…

按钮控件之1---QPushButton 标准按钮/普通按钮控件

1、父类QAbstractButton 2、QPushButton按钮,是Qt常用的控件之一,提供普通的按钮功能。 通过信号槽机制接收触发信号并执行对应动作。3、创建QPushButton 它有三个构造函数: // 空对象 QPushButton(QWidget *parent nullptr); // 指定QPus…

基于Django+node.js+MySQL+杰卡德相似系数智能新闻推荐系统——机器学习算法应用(含Python全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境node.js前端环境MySQL数据库 模块实现1. 数据预处理2. 热度值计算3. 相似度计算1)新闻分词处理2)计算相似度 4. 新闻统计5. API接口开发6. 前端界面实现1)运行逻辑2&#xff0…

文心一言 VS CHATGPT

由于近几天来,我的手机短信不断收到百度公司对于“文心一言”大模型的体验邀请(真是不胜其烦)!!所以我就抱着试试看的态度点开了文心一言的链接:文心一言 目前看来,有以下两点与chatgpt是有比较…

什么是浏览器缓存(browser caching)?如何使用HTTP头来控制缓存?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器缓存和HTTP头控制缓存⭐ HTTP头控制缓存1. Cache-Control2. Expires3. Last-Modified 和 If-Modified-Since4. ETag 和 If-None-Match ⭐ 缓存策略⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击…

新方案unity配表工具

工具下载:网盘链接 工具结构:针对每张表格生成一个表格类,其中默认包含一个list和字典类型参数记录表格数据,初始化项目时将list中的数据转为按id索引的dictionary,用于访问数据。额外包含一个同名Temp后缀的类&#…

5年前我们摸爬滚打进入测试行业,如今的你后悔吗?

记得在求职的时候,面试官经常问我:“为什么要选择软件测试工作?”而我也会经常说一堆自己有的没的优势去应付。 工作这么久了,也不再浮躁,静下心来回忆当初选择软件测试工作的历程,也是对自己职业生涯的一次回顾。 一…

部署java程序的服务器cpu过高如何排查和解决

1.top命令找到占用CPU高的Java进程PID 2.根据进程ID找到占用CPU高的线程 ps -mp pid -o THREAD,tid | sort -r ps -mp 124682 -o THREAD,tid | sort -r 3.将指定的线程ID输出为16进制格式 printf “%x\n” tid printf "%x\n" 6384 18f0 4.jstack pid |…

设计模式-原型模式详解

文章目录 前言理论基础1. 原型模式定义2. 原型模式角色3. 原型模式工作过程4. 原型模式的优缺点 实战应用1. 原型模式适用场景2. 原型模式实现步骤3. 原型模式与单例模式的区别 原型模式的变体1. 带有原型管理器的原型模式2. 懒汉式单例模式的原型模式实现3. 细粒度原型模式 总…

FPGA时序分析与约束(1)——组合电路时序

写在最前面: 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭,似乎只有理解了时序约束才能算是真正入门了FPGA,对于FPGA从业者或者未来想要从事FPGA开发的工程师来说,时序约束可以说是一道躲不过去的坎,所以从这篇…

CSS魔术师Houdini,用浏览器引擎实现高级CSS效果

开门见山,直接上货 🔍 CSS Houdini是什么? “Houdini”一词引用自“Harry Houdini”,他是一位20世纪的著名魔术师,亦被称为史上最伟大的魔术师、逃脱术师及特级表演者。 我们都知道,浏览器在渲染网页显示样…