通用图形处理器(General-purpose computing on graphics processing units,简称GPGPU),利用处理图形任务的图形处理器来计算原本由中央处理器处理的通用计算任务。这些通用计算与图形处理没有关系。

现代图形处理器有强大的并行处理能力和可编程流水线,流处理器可以处理非图形数据。在面对单指令流多数据流(SIMD),且数据处理的运算量远大于数据调度和传输的需要时,通用图形处理器在性能上大大超越了传统的中央处理器应用程序。

7.4.1、主要功能

通用图形处理器是近年来出现的计算机芯片,在航空航天及防务应用中的高性能嵌入式计算中广泛应用。前一个十年里作为高端计算机游戏的图形处理引擎引入,是一种大规模并行处理器。不仅有助于复杂的浮点计算,而且容易编程。

通用图形处理器芯片的主要设计制造商:加利福尼亚州圣克拉拉的NVIDIA公司和加利福亚州桑尼维尔的先进微型器件公司(AMD公司)。

7.4.2、设计优势

通用图形处理器广泛使用,其设计支持:包括“开放性图形库”(Open Graphics Library, OpenGL)语言、NVIDIA公司创造的并行处理编程语言CUDA、最近出现的“开放性计算语言”( Open Computing Language, OpenCL)。硬件平台的支持为软件开发提供了便利。

下图是中国天树之新推出的最新7NM GPGPU。

在OpenGL,CUDA和OpenCL编程技术出现之前,大规模并行处理的编程是一项困难的任务,为数不多的专家采用极其神秘(小众编程)语言才能够完成。新出现的软件编程框架,尤其是OpenCL有助于熟悉C语言和C++语言的程序编制人员接受通用图形处理器技术。

通用图形处理器中,多个处理核规则排列在一起,随着时间的推移,器件中处理核的数量会越来越多,通用图形处理器的软件没有必要随着处理器核数量的增加而重新编写。需要有较好的编程支持。软件框架应该适应硬件设计的改变。

7.4.3、技术原理

富兰克林说,通用图形处理器可以用来解析事物以得到可利用的信息,传递周围环境中的有用材料。通用图形处理器所擅长的是完成两方面的工作,一是表现事物,二是解析事物。

通用图形处理器芯片的应用领域从单一的图形处理装置扩展到了信号处理装置,通用图形处理器的软件编程语言也在向着信号处理和通用处理扩展。类似于“开放性图形库”(OpenGL)那样的图形处理语言就可以用于通用处理。

通用计算技术,让显卡参与原本CPU计算任务的技术,从提出到现在十余年时间,但是发展神速。

十年前,高清视频刚流行时,编码高清视频对于电脑来说,处理非常困难。视频编码过程中,大部分运算都是浮点类型的,CPU不善于做这种运算,GPU对于这种类型的计算相当拿手,计算起来量又大又快,那个年代人们在思索,能否用GPU来编码高清视频。

当时业界的研究重点转向了GPGPU,英伟达凭借着强大的技术实力,在硬件与计算机平台领域。英伟达第一个推出了一套比较完整的解决方案,将原本CPU的运算搬到了GPU之上,视频编码速度比原先快了几倍。

CPU有着通用性的需求,它上面单个核心会设计的非常大而全面,并且由于CPU计算的特性,核心中很大一部分面积用来构建缓存(一个核心中往往有L1和L2两级缓存)和控制单元(解码器与分支预测等前端单元)。CPU功能的强大,代表着CPU本身体量的大,尤其对于缓存的集中。

实际用来运算的单元面积可能仅仅只占整个核心的一半甚至不到(如图)。种种原因使CPU没有办法做非常大的规模,一个核心中能塞入的东西有限,总体的核心数需要控制在一个合理范围中,多了就会发生各种问题。硬件集成是很麻烦的事情,当工艺没有足够进步的时间,集成发展的大门就关闭了。

八核Coffee Lake的核心图,可以看到,四个核心的面积已经接近右边的集成GPU。而GPU的设计理念就简单很多,图形计算是一项简单直接的“粗活”,相对单调直接。复杂度远不如CPU要负责的各种各样不同类型的工作,当年想要提高图形计算速度的一个简单办法就是扩大处理器中含有的单元数量。

GPU对于特定的计算任务,有更大的计算单元,在运算能力上远超CPU,表现出来就是现在的GPU在浮点运算吞吐量上远超CPU。

CPU与GPU在构造上的不同

GPU适合大批量特定计算,尤其是并行计算,几大图形软硬件厂商都推出了自己的GPGPU计算解决方案,下面主题进行介绍。

7.4.4、支持方

7.4.4.1、ATI Stream

首先提出GPGPU实现的厂商是被AMD收购前的ATI,并专门提供了一套开发工具包(SDK),让程序员用该套工具调用GPU来参与计算的能力。不过由于各种限制和AMD收购ATI后支持不足,当时管理也比较混乱,这套SDK在与Nvidia CUDA的竞争中处于下风,后来AMD官方转向支持        OpenCL,这套SDK最终停止了开发。今天很少有人听到这套并行计算框架

ATI Stream Logo

7.4.4.2、CUDA

CUDA是Nvidia在G80时代推出的一项技术,也是今天最流行的技术。全称Compute Unified Device Architechture,统一计算架构。从G80核心开始,Nvidia率先采用了一种统一设计的架构,将原本管线分工式设计转变为统一化的处理器设计。

CUDA伴随着G80核心的发布一起公之于众,让程序员用C和C++来编写用GPU运行的程序,学习成本比ATI Stream要低一些。今天在并行计算集群领域,CUDA有着广泛的应用。例如TensorFlow和各种音视频引擎平台。

Nvidia CUDA Logo

CUDA是目前应用最为广泛的一种GPGPU实现, Nvidia的强力推广之下,CUDA在许多领域大放异彩,今天拥有最光大的市场。英伟达曾经设计过无数成功的硬件,CUDA可以说是英伟达设计的最成功的并行计算平台。CUDA同时推动了英伟达硬件技术的应用

7.4.4.3、OpenCL

上面两个GPGPU的实现都是有平台针对性的,要想用他们的解决方案你就得用AMD和英伟达的硬件,而OpenCL就不一样了。所谓Open就是一个开放的标准,但是需要各家硬件厂商为OpenCL提供驱动程序。

OpenCL最早由苹果公司开发出的异构计算框架,苹果公司将这套框架的草案提交到Khronos 组织,作为开放标准供业界使用。在2008年末,1.0版本正式公开,目前Intel、AMD与Nvidia的GPU都支持这套框架。这是除了CUDA之后,另一个流行的GPGPU计算框架。

OpenCL不仅限于x86平台上提供的异构计算框架,跨平台和开放标注的特性,还可以使用专门的可编程电路来加速计算。有广泛的支持空间,业界对于它的支持非常广泛,下图是OpenCL联盟成员。

OpenCL联盟

7.4.4.4、DirectCompute

微软是软件行业的老大,在并行计算领域,微软也在进行积极的探索。DirectCompute是微软从DirectX 10开始加入的用于通用计算目的的API集,调用GPU进行加速计算。

从Vista开始,Windows的各种桌面特效就开始采用DirectCompute来加速计算。在DirectX 11中,微软完善了这套API,并且在Windows系统上更多地使用GPU来加速计算系统界面的各种特效。

不仅仅是专业的图形图像、音视频领域,在操作系统领域,对并行计算的要求也很好。当我们在使用微软的VS技术时间,VS技术的一大技术支柱就是并行计算技术。

GPU-Z显示该GPU支持的通用计算特性

7.4.5、媒体编码加速

十年前,H.264等面向高清应用的视频编码刚流行,CPU的性能限制,编码一段H.264的视频是一件相当耗费时间的事情,所以人们想到了用GPU来加速视频的编码。

Nvidia刚推出CUDA的时候,就将加速视频编码作为该技术的一大卖点,免费提供了一个支持CUDA技术来转码的软件BadaBoom。后来,Nvidia在显卡上加入了专门用于视频编解码的硬件电路,开放了名为NVENC的编码API供软件工程师调用,通用计算也就此离开了这个距离我们最近的领域。

BadaBoom加速视频转码

Adobe是图形图像、音视频技术的霸主。很早就在旗下的CS和CC软件中加入了GPGPU的支持,Premiere Pro和After Effect都支持OpenCL来加速视频实时预览和特效。Adode对并行计算技术的应用走在各家公司前列。

7.4.6、视频补帧与画面优化

英伟达、英特尔和AMD三家相继在自己的GPU中加入专用计算电路用以加速编解码视频之后,通用计算就离开了这个领域。不满足于既有的视频品质的人们,又相继开发出了新的可以利用GPGPU的功能:视频补帧。大大改善了视频质量。

视频补帧:是原本低帧数的视频,通过上下帧的计算,渲染出一帧原本不存在的画面补在两帧之间,使其观感更加流畅。

比如将24帧的视频补帧至60帧,视频质量圆润流畅。因为这个过程计算量过于庞大,使用CPU跟不上视频播放的速度,没法做到实时补帧,开发者就将这个功能搬到了GPU上来运行,很多人都曾经使用的SVP4,就是一个利用GPGPU的补帧软件。

SVP4补帧软件界面

科技发展永无止境,视频技术也不例外。视频画面优化领域,强大的视频渲染器MadVR也是利用GPGPU来优化视频画面。

比如视频播放中出现的色带、色环,在压制过程中出现的瑕疵等,可以使用GPGPU在视频播放过程中进行实时的弥补。使视频更加圆润与高清,视频技术的发展永无止境。

7.4.7、人工智能与深度学习

人工智能与深度学习是近年来非常热门的两个有关联的领域,训练人工智能需要非常大的数据计算量,这时候就可以利用上GPU的强大功能,谷歌的深度学习框架TensorFlow,以及FaceBook的Pytorch就使用CUDA来加速学习。

Nvidia这两年不断展示了它们在机器学习方面的一些结果,在RTX系列上引入的DLSS(深度学习抗锯齿)技术就是利用机器学习来达成的。

英伟达今天在人工智能领域占据着重要的位置,在科技发展过程中,很多公司靠软件驱动技术发展,英伟达靠硬件驱动技术的发展。

DLSS技术

上图是CUDA在科研领域的一些应用,可以看到GPU就在我们的身边。

7.4.8、超级计算机

英伟达在G80开始就推出同架构的高品质计算卡,Tesla品牌之下。诞生了很多用Tesla计算卡来组建的超级计算机。硬件技术的优势,导致英伟达在超算领域领跑全球。

人工智能是英伟达的发展方向,相信近几年,使用英伟达技术的计算机会逐渐增多。会曾经竞争贝尔·戈登奖的六个入围者中,五个使用了NVIDIA GPU提供支持的超级计算机。

英伟达联手ARM,在超级计算机领域中继续发力,预计未来采用GPGPU技术的超级计算机将会越来越多。

近些年,超级计算机硬件领域,英伟达有着强大的技术实力。在云平台上,英伟达超级计算硬件应用较多。

GPGPU相对于PC,是新的概念,十余年的发展已经不仅局限于PC,还走向了其它领域,扎根于我们生活的每个角落。GPGPU已经在许多云计算平台上得到了应用,相信在以后,GPU会更加深入生活的更多方面,尤其与人工智能技术的结合,具有着巨大的应用空间。

7.4.9、示例代码

#include <CL/cl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <fstream>
#include "tool.h"
using namespace std;/** convert the kernel file into a string */
int convertToString(const char *filename, std::string& s)
{size_t size;char*  str;std::fstream f(filename, (std::fstream::in | std::fstream::binary));if(f.is_open()){size_t fileSize;f.seekg(0, std::fstream::end);size = fileSize = (size_t)f.tellg();f.seekg(0, std::fstream::beg);str = new char[size+1];if(!str){f.close();return 0;}f.read(str, fileSize);f.close();str[size] = '\0';s = str;delete[] str;return 0;}cout<<"Error: failed to open file\n:"<<filename<<endl;return -1;
}/**Getting platforms and choose an available one.*/
int getPlatform(cl_platform_id &platform)
{platform = NULL;//the chosen platformcl_uint numPlatforms;//the NO. of platformscl_int    status = clGetPlatformIDs(0, NULL, &numPlatforms);if (status != CL_SUCCESS){cout<<"Error: Getting platforms!"<<endl;return -1;}/**For clarity, choose the first available platform. */if(numPlatforms > 0){cl_platform_id* platforms =(cl_platform_id* )malloc(numPlatforms* sizeof(cl_platform_id));status = clGetPlatformIDs(numPlatforms, platforms, NULL);platform = platforms[0];free(platforms);}elsereturn -1;
}/**Step 2:Query the platform and choose the first GPU device if has one.*/
cl_device_id *getCl_device_id(cl_platform_id &platform)
{cl_uint numDevices = 0;cl_device_id *devices=NULL;cl_int    status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);if (numDevices > 0) //GPU available.{devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);}return devices;
}

7.4.10、总结

GPGPU,带CPU处理能力的GPU。主要是GPU的工作,GPU的能力,可以协助CPU进行运算力,GPGPU(通用图形处理)超出GPU的能力范围,完全具备通用的数据处理。

GPU,用于图形处理的芯片。(GPU也是一种CPU,相对于显卡)早期显卡是没有专门用做图形处理的GPU的,不支持3D。

CPU,用于数据处理的芯片(图形也可以认为是数据)。中央处理器,一种相对的概念。潜移默化被认定是放在主板上,通过向GPU传送指令,控制GPU。

AMD-APU,加速处理器。集成GPU核心的CPU,并且融合。不同于Intel I系(GPU与CPU独立工作)。

美摄SDK,采用CUDA、OpenCL、DirectCompute并行计算技术。基于CPU、GPU、GPGPU硬件平台,优秀的音视频引擎,推动音视频技术发展。

显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(4):GPGPU相关推荐

  1. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(1):显示标准

    7.显示标准与视频处理单元 消费级视频智能处理大体有10年左右,有了巨大的发展,展望未来,对应于大厂而言,竞争是标准的竞争.包含显示标准与处理单元,竞争推动了科技的进步,市场的繁荣. 新的显示硬件也不 ...

  2. 音视频开发系列(15):视频与音频同步

    上次分享了将视频与音频同时推流到服务上的代码封装,然后上节分享在测试后会发现音视频不同步,这边说一下原因: 从帧率及采样率,即可知道视频/音频播放速度.声卡和显卡均是以一帧数据来作为播放单位,如果单纯 ...

  3. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(2):VPU

    VPU(Video Processing Unit,视频处理单元)是一种全新的视频处理平台核心引擎,具有硬解码功能以及减少CPU负荷的能力.VPU可以减少服务器负载和网络带宽的消耗. VPU由ATI提 ...

  4. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(3):APU

    APU是"Accelerated Processing Units"的简称,中文名字叫加速处理器,是AMD融聚未来理念的产品,它第一次将处理器和独显核心做在一个晶片上. CPU与A ...

  5. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(5):TPU

    TPU(Tensor Processing Unit)张量处理单元,为机器学习定制的芯片,经过专门深度机器学习方面的训练,它有更高效能(每瓦计算能力). 谷歌,2015年6月,I/O开发者大会上推出的 ...

  6. 【音视频开发系列】一学就会,快速掌握音视频开发的第一个开源项目FFmpeg

    快速掌握音视频开发的第一个开源项目:FFmpeg 1.为什么要学FFmpeg 2.FFmpeg面向对象思想分析 3.FFmpeg各种组件剖析 视频讲解如下,点击观看: [音视频开发系列]一学就会,快速 ...

  7. 【音视频开发系列】盘点音视频直播RTSP/RTMP推流一定会遇到的各种坑,教你快速解决

    聊聊RTSP/RTMP推流那些坑 1.推流架构分析 2.推流缓存队列的设计 3.FFmpeg函数阻塞问题分析 [音视频开发系列]盘点音视频直播一定会遇到的各种坑,教你快速解决 更多精彩内容包括:C/C ...

  8. 【音视频开发系列】srs-webrtc-janus开源流媒体服务器分析

    全球最牛开源流媒体服务器源码分析 1.如何学习流媒体服务器 2.全球最牛流媒体服务器架构分析 3.我们能从全球最牛流媒体服务器得到什么 [音视频开发系列]srs-webrtc-janus流媒体服务器分 ...

  9. 音视频开发之旅(32)-音视频学习资料

    目录 为什么要学习音视频? 如何学习系统性音视频? 音视频相关的资料 学习实践的输出文章分类聚合 收获 最近有朋友问想学习音视频,应该怎么学,有什么资料吗? 这个问题也困扰我很久,几年前就想开始音视频 ...

  10. Android音视频开发基础(七):视频采集-系统API基础

    前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了<Android 音视频从入门到提高 - 任务列表>.本文是Android音视 ...

最新文章

  1. 国家标准油类计算机,食用油新国标正式实施 产品配方将不再是“机密”
  2. Keepalived Nginx 高可用性配置
  3. c语言从键盘输入千米数,第二章 C语言编程基础.ppt
  4. Selenium3自动化测试——1. 新建第一个Selenium自动化测试脚本
  5. linux的虚拟文件系统VFS
  6. 中心对称又是轴对称的图形_解读坐标系中图形变换的规律
  7. PostgreSQL数据库、表空间、角色及用户
  8. python如何确定拐点_如何确认均线拐点的实战技巧和理论(图解)
  9. JavaScript内存那点事
  10. CTF---Web入门第八题 Guess Next Session
  11. PDF转换技巧之如何把文件转换为WPS?
  12. 数据绑定控件Reperter
  13. LeetCode每日一题——两数之和
  14. 计算机登录的qq点赞怎样删除,QQ空间个性点赞怎么设置 怎么取消
  15. matlab之plot函数属性设置
  16. 一种基于蜂窝信令数据的数据驱动型OD矩阵构建的方法:以里昂地区(法国)作为研究...
  17. Educoder -Java面向对象-Java语言之数组(第1关:数组的遍历:给小朋友分糖果)
  18. Nginx 联合创始人已被释放:「这是典型的敲诈,就这么简单」
  19. 微软文字转语音工具(在线版)
  20. 无法将“webpack”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

热门文章

  1. 如何修改VsCode的背景图片
  2. 台式机鼠标失灵打开计算机,台式电脑鼠标没反应是怎么回事
  3. Python 字符串str详解(超详细)
  4. 博世中国的战略与战术,如何应对复杂多变的中国市场需求
  5. Trie树(字典树)
  6. 旅游行业的手机App Top5
  7. 2013 中国15大云平台
  8. 计算机断层扫描法原理,能谱计算机断层扫描成像的概念和基本原理.PDF
  9. 科技圈以 A 取名的时尚潮流
  10. 苹果新园区最新内部效果图流出