【OpenCL基础 · 一】因源

news2025/1/18 2:07:35

文章目录

  • 前言
  • 一、单核标量处理器的瓶颈
    • 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.coloradmin.cn/o/960236.html

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

相关文章

独家揭秘!短视频商城小程序源码:打造属于你的购物新体验

近年来,随着移动互联网的快速发展,短视频平台逐渐流行起来。借助短视频的视听魅力,人们可以更加轻松地了解产品和服务,这使得短视频平台在商业领域中扮演了重要的角色。而如今,短视频商城小程序源码横空出世&#xff0…

ElasticSearch学习4--复杂查询

1、查询分类 查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query 根据单个字段…

封装动态表单组件

技术栈&#xff1a;vue2 js webpack 需求&#xff1a; 利用数据渲染表单&#xff0c;实现代码的精简化及效率的提升。 效果图&#xff1a; 封装的组件&#xff1a; <div v-if"formConfig"><el-formv-bind"$attrs"ref"formDom":model…

为什么你懂英语但不能说流利 学习

目录 对于提升口语流畅度&#xff1a; 我们应该做到是输入和输出占比为3&#xff1a;7&#xff1b;可实际做到的是7&#xff1a;3 但是这个方法也有一个问题&#xff0c;就是没有错误反馈 最好的就是在一个开始的时候&#xff0c;就学对&#xff0c;第一次的效果很重要 另…

vscode中讨厌的蓝色波浪线的去除小trick和原理

问题描述 不小心“设置同步”时和远程电脑的合并&#xff08;merge&#xff09;了&#xff0c;然后就出现了这个问题&#xff01;烦死了&#xff01;&#xff01;&#xff01; 大概是这个样子&#xff1a; 解决办法 站在了巨人的肩膀上&#xff0c;在下图位置输入这样一行参数&…

【TCP】四次挥手(最强详解!!通俗易懂!!)

目录 想要了解三次握手的话可以参考我的另外一篇博客 首先来了解一下FIN和ACK FIN ACK 接着我们再来具体的了解TCP四次挥手过程 转换为最最通俗理解方法: 想要了解三次握手的话可以参考我的另外一篇博客 【TCP】三次握手&#xff08;最强详解&#xff01;&#xff01;通俗…

DVWA XSS

反射型 low 查看源代码&#xff0c;没有任何过滤 构造 medium 这里是过滤了 high 这里把双写和大小写和JavaScript都过滤了,用事件来绕过<img src0 οnerrοralert(“xss”)> impossible 这里使用htmlspecialchars进行实体转换并且输出的结果还不能使用事件来…

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(一)

一、点击手势&#xff08;TapGesture&#xff09; TapGesture(value?:{count?:number; fingers?:number}) 点击手势支持单次点击和多次点击&#xff0c;拥有两个可选参数&#xff1a; count&#xff1a;非必填参数&#xff0c;声明该点击手势识别的连续点击次数。默认值为…

Python Qt学习(七)Listview

源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_listview.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not…

数据库设计DDL

DDL&#xff1a;数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表&#xff09; DDL&#xff08;数据库操作&#xff09; 查询&#xff1a; 查询所有数据库&#xff1a;show databases; 查询当前数据库&#xff1a;select database(); 使用&#xff1a; 使用…

前端实习第七周周记

前言 第六周没写&#xff0c;是因为第六周的前两天在处理第五周的样本库部分。问题解决一个是嵌套问题&#xff08;因为我用到了递归&#xff09;&#xff0c;还有一个问题在于本机没有问题&#xff0c;打包上线接口404。这个问题我会在这周的总结中说。 第六周第三天才谈好新…

RT-Thread 线程管理(二)

系统线程 系统线程是指由系统创建的线程&#xff0c;用户线程是由用户程序调用线程管理接口创建的线程&#xff0c;在 RT-Thread 内核中的系统线程有空闲线程和主线程。 空闲线程 空闲线程&#xff08;idle&#xff09;是系统创建的最低优先级的线程&#xff0c;线程状态永远…

解决D盘的类型不是基本,而是动态的问题

一、正确的图片 1.1图片 1.2本人遇到的问题 二、将动态磁盘 转为基本盘 2.1 基本概念&#xff0c;动态无法转化为基本&#xff0c;不是双向的&#xff0c;借助软件 网址&#xff1a;转换动态磁盘到普通磁盘_检测到计算机本地磁盘为动态分区_卫水金波的博客-CSDN博客 2.2分区…

每日一题 2240. 买钢笔和铅笔的方案数

难度&#xff1a;中等 枚举就行 class Solution:def waysToBuyPensPencils(self, total: int, cost1: int, cost2: int) -> int:res 0for i in range(total//cost1 1):res (total - i * cost1) // cost2res 1return res

高等数学啃书汇总重难点(四)不定积分

本章主要考察方法性的技巧&#xff0c;对于某些理论性的概念&#xff0c;建议在练习中加强理解&#xff0c;不定积分的要义在于不断练习、不断拓宽眼界 一.不定积分的概念 二.原函数存在定理 三.不定积分的定义 四.基本积分表 五.不定积分的性质 六.一类换元法 七.二类换元法 八…

phpstorm配置链接sqlserver数据库

开启sqlserver的TCP/IP 1433端口

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS DMIPS&#xff08;Dhrystone Million Instructions Per Second&#xff09;&#xff1a; DMIPS用于衡量计算机系统的整体指令执行性能&#xff0c;通常关注整数操作。它基于Dhrystone基准测试来计算&#xff0c;该测试主要包含整数运…

如何利用好 IntelliJ IDEA 的调试功能辅助代码调试

文章目录 调试的重要性配置断点启动调试利用 IntelliJ IDEA 的调试功能观察变量和表达式单步执行和逐级跳转查看调用栈条件断点监视变量远程调试使用断点条件和日志 调试最佳实践总结 &#x1f389;欢迎来到Java学习路线专栏~如何利用好 IntelliJ IDEA 的调试功能辅助代码调试 …

YOLOv8超参数调优教程! 使用Ray Tune进行高效的超参数调优!

原创文章为博主个人所有,未经授权不得转载、摘编、倒卖、洗稿或利用其它方式使用上述作品。违反上述声明者,本站将追求其相关法律责任。 这篇博文带大家玩点新的东西,也是一直以来困扰大家最大的问题—超参数调优! 之前的 YOLOv5 我使用遗传算法做过很多次调优,实验一跑就…

实战项目 在线学院之集成springsecurity

一 操作配置 1.0 工程结构 1.1 在common下创建spring_security模块 1.2 pom文件中依赖的注入 1.3 在service_acl模块服务中引入spring-security权限认证模块 1.3.1 service_acl引入spring-security 1.3.2 在service_acl编写查询数据库信息 定义userDetailServiceImpl 查询用…