GPU硬件基础知识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPU硬件基础知识相关的知识,希望对你有一定的参考价值。
参考技术AGPU channel 是GPU与CPU之间的桥接接口,通过CPU向GPU发送GPU指令的唯一通道,GPU channel包含了两类用于存储GPU指令的buffer:
当GPU指令被写入到GPU command buffer时,系统还会向Ring buffer中写入与此指令所对应的packet,packet包含了此指令在GPU command buffer中的偏移位置与长度数据。
在执行指令的时候,GPU不是直接从GPU command buffer中读取数据,而是先经过Ring buffer读取出当前待处理指令的相关信息,再据此读取GPU command(这也是为什么Ring buffer被称之为indirect buffer的原因)。
现代GPU为了加强数据的并行化处理的强度,使用的是SIMT(Single Instruction Multi Thread,SIMD的更高级版本)体系结构,shader program运行的最小单位是thread,多个运行相同shader的threads会被打包到一个组(thread group),这个thread group,在NVIDIA被称之为warp,在AMD中被称之为wavefront。
上面这张图是从标题链接给出的Turing白皮书中截取的GPU架构图,其中包含如下几个关键缩写:
GPU中用于存储数据的结构有多种[4],分别是:
每种存储结构都有着各自的优缺点,因此适用于不同的应用场景,从访问速度来看,这些存储结构按照从高到低排序依次是:
RMEM > SMEM > CMEM > TMEM > LMEM > GMEM
RMEM与SMEM是直接集成在GPU芯片上的,而剩下的几种存储结构则是在GPU之外的芯片上的,此外,LMEM/CMEM/TMEM都有着各自的缓存机制,即在访问数据的时候都会首先从缓存中进行查找判断,再决定是否需要从更低一级速度的存储结构中进行读取。
存储在LMEM中的数据可见性与RMEM一样,都是只对负责对其进行读写的线程可见。LMEM实际上并不是一块物理存储空间,而是对GMEM的一个抽象,因此其访问速度与对GMEM的访问速度是相同的。LMEM中的数据对于一个线程而言是Local的(即只从属于当前thread的空间,对其他线程不可见),通常用于存储一些automatic变量(automatic变量指的是一些大尺寸的数据结构或者数组,因为寄存器不够,因此会塞入LMEM中),编译器在寄存器不足的时候,就会从GMEM中开辟一块空间用作LMEM。
虽然LMEM是从GMEM中分割出来的,但是其使用方式与GMEM还是有着一些区别:
如上图所示(从图中可以看出,L1是位于GPU芯片上的,其中SMEM就存储在其中,RMEM也是在芯片上,而L2及以后的存储空间则都是芯片之外的存储空间了),在对LMEM进行数据读写的时候,会经历这样一个缓存层级流动:L1->L2->LMEM。因为LMEM实际上是临时开辟的一块空间,因此里面的数据实际上是GPU先写入的,在此之前发生的读取就相当于读到了一堆乱码。
那么什么情况下会使用到LMEM呢?一般来说有如下两种情形:
因为LMEM相对于寄存器访问速度的低效性,因此其对性能的影响主要有如下两个方面:
但是因为以下的两点原因,LMEM也不一定会造成性能下降:
对于一些LMEM可能会存在瓶颈的情况,参考文献[3]中给出了一些分析的方法可供排查,同时还给出了对应的优化策略以及实战案例,有兴趣的同学可以前往参考。
存储在RMEM中的数据只对负责对此寄存器进行读写的线程可见,且其生命周期与此线程的生命周期一致。
通常情况下,对寄存器的访问不需要消耗时钟周期,但是在一些特殊情况(比如先进行了一个写操作,之后再进行读取,或者在bank访问冲突的情况下),会有例外。先写后读的延迟大概是24个时钟周期,对于更新的GPU(每个SM包含32个cores的情况),可能需要花费768个线程来隐藏这个延迟。
当需求的寄存器数目超出硬件所能支持的限额时,就会导致寄存器压力,在这种情况下,数据就会使用LMEM来进行存储(所谓的spilled over,即溢出),如下图所示[3]:
存储在SMEM中的数据对处于同一个block所有的线程都是可见的(不负shared之名),因此通常用于多个线程之间的数据互换,为了避免多个线程同时访问相同的数据导致的阻塞,NVIDIA将SMEM划分成32个逻辑单元,每个单元叫做一个bank,在内存中连续的数据,在banks的分布也是连续的:
SMEM是位于L1 Cache中的,其尺寸通常为16/32/48KB,剩余部分用作L1 Cache,对于开普勒架构而言,每个bank每个时钟的带宽是64bits/clock,较早的Fermi架构时钟不太一样,但是带宽差不多是这个数值的一半。
由于一个warp中有32个线程,因此总共需要32个SMEM banks。由于每个bank在每个时钟周期中只支持一次访问请求,因此多个同时访问的请求就会导致bank conflict,这个的处理过程后面会讲。
默认每个bank占用32bits(4bytes),开普勒架构之后,可以通过指令(cudaDeviceSetSharedMemConfig(cudaSharedMemBankSizeEightByte))将每个bank扩充到64bits,以应对双精度数据的访问冲突。
存储在Global Memory中的数据对于当前进程中的所有线程都是可见的,其生命周期与进程一致。
CMEM通常用于存储一些常量数据,当同一个warp中的所有线程都需要使用同一个参数时,可以将数据放在CMEM中,这种做法比将数据放在GMEM中更节省带宽。
TMEM也是一种常量存储结构,当一个warp中的线程所需要读取的数据都是存储位置上相邻的时候,使用这种结构比GMEM具有更优的性能表现(也是出于带宽的原因)
[1]. A HISTORY OF NVIDIA STREAM MULTIPROCESSOR
[2]. Life of a triangle - NVIDIA\'s logical pipeline
[3]. Local Memory and Register Spilling
[4]. GPU Memory Types – Performance Comparison
深度学习FPGA实现基础知识0(FPGA击败GPU和GPP,成为深度学习的未来?)
需求说明:深度学习FPGA实现知识储备
来自:http://power.21ic.com/digi/technical/201603/46230.html
FPGA击败GPU和GPP,成为深度学习的未来?
最近几年,深度学习成为计算机视觉、语音识别、自然语言处理等关键领域中所最常使用的技术,被业界大为关注。然而,深度学习模型需要极为大量的数据和计算能力,只有更好的硬件加速条件,才能满足现有数据和模型规模继续扩大的需求。现有的解决方案使用图形处理单元(GPU)集群作为通用计算图形处理单元(GPGPU),但现场可编程门阵列(FPGA)提供了另一个值得探究的解决方案。日渐流行的FPGA设计工具使其对深度学习领域经常使用的上层软件兼容性更强,使得FPGA更容易为模型搭建和部署者所用。FPGA架构灵活,使得研究者能够在诸如GPU的固定架构之外进行模型优化探究。同时,FPGA在单位能耗下性能更强,这对大规模服务器部署或资源有限的嵌入式应用的研究而言至关重要。本文从硬件加速的视角考察深度学习与FPGA,指出有哪些趋势和创新使得这些技术相互匹配,并激发对FPGA如何帮助深度学习领域发展的探讨。
简介
机器学习对日常生活影响深远。无论是在网站上点击个性化推荐内容、在智能手机上使用语音沟通,或利用面部识别技术来拍照,都用到了某种形式的人工智能技术。这股人工智能的新潮流也伴随着算法设计的理念转变。过去基于数据的机器学习大多是利用具体领域的专业知识来人工地“塑造”所要学习的“特征”,计算机从大量示例数据中习得组合特征提取系统的能力,则使得计算机视觉、语音识别和自然语言处理等关键领域实现了重大的性能突破。对这些数据驱动技术的研究被称为深度学习,如今正受到技术界两个重要群体的关注:一是希望使用并训练这些模型、从而实现极高性能跨任务计算的研究者,二是希望为现实世界中的新应用来部署这些模型的应用科学家。然而,他们都面临着一个限制条件,即硬件加速能力仍需加强,才可能满足扩大现有数据和算法规模的需求。
对于深度学习来说,目前硬件加速主要靠使用图形处理单元(GPU)集群作为通用计算图形处理单元(GPGPU)。相比传统的通用处理器(GPP),GPU的核心计算能力要多出几个数量级,也更容易进行并行计算。尤其是NVIDIA CUDA,作为最主流的GPGPU编写平台,各个主要的深度学习工具均用其来进行GPU加速。最近,开放型并行程序设计标准OpenCL作为异构硬件编程的替代性工具备受关注,而对这些工具的热情也在高涨。虽然在深度学习领域内,OpenCL获得的支持相较CUDA还略逊一筹,但OpenCL有两项独特的性能。首先,OpenCL对开发者开源、免费,不同于CUDA单一供应商的做法。其次,OpenCL支持一系列硬件,包括GPU、GPP、现场可编程门阵列(FPGA)和数字信号处理器(DSP)。
作为GPU在算法加速上强有力的竞争者,FPGA是否立即支持不同硬件,显得尤为重要。FPGA与GPU不同之处在于硬件配置灵活,且FPGA在运行深入学习中关键的子程序(例如对滑动窗口的计算)时,单位能耗下通常能比GPU提供更好的表现。不过,设置FPGA需要具体硬件的知识,许多研究者和应用科学家并不具备,正因如此,FPGA经常被看作一种行家专属的架构。最近,FPGA工具开始采用包括OpenCL在内的软件级编程模型,使其越来越受经主流软件开发训练的用户青睐。
对考察一系列设计工具的研究者而言,其对工具的筛选标准通常与其是否具备用户友好的软件开发工具、是否具有灵活可升级的模型设计方法以及是否能迅速计算、以缩减大模型的训练时间有关。随着FPGA因为高抽象化设计工具的出现而越来越容易编写,其可重构性又使得定制架构成为可能,同时高度的并行计算能力提高了指令执行速度,FPGA将为深度学习的研究者带来好处。
对应用科学家而言,尽管有类似的工具级选择,但硬件挑选的重点在于最大化提高单位能耗的性能,从而为大规模运行降低成本。所以,FPGA凭借单位能耗的强劲性能,加上为特定应用定制架构的能力,就能让深度学习的应用科学家受益。
FPGA能满足两类受众的需求,是一个合乎逻辑的选择。本文考察FPGA上深度学习的现状,以及目前用于填补两者间鸿沟的技术发展。因此,本文有三个重要目的。首先,指出深度学习领域存在探索全新硬件加速平台的机会,而FPGA是一个理想的选择。其次,勾勒出FPGA支持深度学习的现状,指出潜在的限制。最后,对FPGA硬件加速的未来方向提出关键建议,帮助解决今后深度学习所面临的问题。
FPGA
传统来说,在评估硬件平台的加速时,必须考虑到灵活性和性能之间的权衡。一方面,通用处理器(GPP)可提供高度的灵活性和易用性,但性能相对缺乏效率。这些平台往往更易于获取,可以低廉的价格生产,并且适用于多种用途和重复使用。另一方面,专用集成电路(ASIC)可提供高性能,但代价是不够灵活且生产难度更大。这些电路专用于某特定的应用程序,并且生产起来价格昂贵且耗时。
FPGA是这两个极端之间的折中。FPGA属于一类更通用的可编程逻辑设备(PLD),并且简单来说,是一种可重新配置的集成电路。因此,FPGA既能提供集成电路的性能优势,又具备GPP可重新配置的灵活性。FPGA能够简单地通过使用触发器(FF)来实现顺序逻辑,并通过使用查找表(LUT)来实现组合逻辑。现代的FPGA还含有硬化组件以实现一些常用功能,例如全处理器内核、通信内核、运算内核和块内存(BRAM)。另外,目前的FPGA趋势趋向于系统芯片(SoC)设计方法,即ARM协处理器和FPGA通常位于同一芯片中。目前的FPGA市场由Xilinx主导,占据超过85%的市场份额。此外,FPGA正迅速取代ASIC和应用专用标准产品(ASSP)来实现固定功能逻辑。 FPGA市场规模预计在2016年将达到100亿美元。
对于深度学习而言,FPGA提供了优于传统GPP加速能力的显著潜力。GPP在软件层面的执行依赖于传统的冯?诺依曼架构,指令和数据存储于外部存储器中,在需要时再取出。这推动了缓存的出现,大大减轻了昂贵的外部存储器操作。该架构的瓶颈是处理器和存储器之间的通信,这严重削弱了GPP的性能,尤其影响深度学习经常需要获取的存储信息技术。相比较而言,FPGA的可编程逻辑原件可用于实现普通逻辑功能中的数据和控制路径,而不依赖于冯?诺伊曼结构。它们也能够利用分布式片上存储器,以及深度利用流水线并行,这与前馈性深度学习方法自然契合。现代FPGA还支持部分动态重新配置,当FPGA的一部分被重新配置时另一部分仍可使用。这将对大规模深度学习模式产生影响,FPGA的各层可进行重新配置,而不扰乱其他层正在进行的计算。这将可用于无法由单个FPGA容纳的模型,同时还可通过将中间结果保存在本地存储以降低高昂的全球存储读取费用。
最重要的是,相比于GPU,FPGA为硬件加速设计的探索提供了另一个视角。GPU和其它固定架构的设计是遵循软件执行模型,并围绕自主计算单元并行以执行任务搭建结构。由此,为深度学习技术开发GPU的目标就是使算法适应这一模型,让计算并行完成、确保数据相互依赖。与此相反,FPGA架构是为应用程序专门定制的。在开发FPGA的深度学习技术时,较少强调使算法适应某固定计算结构,从而留出更多的自由去探索算法层面的优化。需要很多复杂的下层硬件控制操作的技术很难在上层软件语言中实现,但对FPGA执行却特别具有吸引力。然而,这种灵活性是以大量编译(定位和回路)时间为成本的,对于需要通过设计循环快速迭代的研究人员来说这往往会是个问题。
除了编译时间外,吸引偏好上层编程语言的研究人员和应用科学家来开发FPGA的问题尤为艰难。虽然能流利使用一种软件语言常常意味着可以轻松地学习另一种软件语言,但对于硬件语言翻译技能来说却非如此。针对FPGA最常用的语言是Verilog和VHDL,两者均为硬件描述语言(HDL)。这些语言和传统的软件语言之间的主要区别是,HDL只是单纯描述硬件,而例如C语言等软件语言则描述顺序指令,并无需了解硬件层面的执行细节。有效地描述硬件需要对数字化设计和电路的专业知识,尽管一些下层的实现决定可以留给自动合成工具去实现,但往往无法达到高效的设计。因此,研究人员和应用科学家倾向于选择软件设计,因其已经非常成熟,拥有大量抽象和便利的分类来提高程序员的效率。这些趋势使得FPGA领域目前更加青睐高度抽象化的设计工具。
FPGA深度学习研究里程碑:
1987VHDL成为IEEE标准
1992GANGLION成为首个FPGA神经网络硬件实现项目(Cox et al.)
1994Synopsys推出第一代FPGA行为综合方案
1996VIP成为首个FPGA的CNN实现方案(Cloutier et al.)
2005FPGA市场价值接近20亿美元
2006首次利用BP算法在FPGA上实现5 GOPS的处理能力
2011Altera推出OpenCL,支持FPGA
出现大规模的基于FPGA的CNN算法研究(Farabet et al.)
2016在微软Catapult项目的基础上,出现基于FPGA的数据中心CNN算法加速(Ovtcharov et al.)
未来展望
深度学习的未来不管是就FPGA还是总体而言,主要取决于可扩展性。要让这些技术成功解决未来的问题,必须要拓展到能够支持飞速增长的数据规模和架构。FPGA技术正在适应这一趋势,而硬件正朝着更大内存、更少的特征点数量、更好的互连性发展,来适应FPGA多重配置。英特尔收购了Altera,IBM与Xilinx合作,都昭示着FPGA领域的变革,未来也可能很快看到FPGA与个人应用和数据中心应用的整合。另外,算法设计工具可能朝着进一步抽象化和体验软件化的方向发展,从而吸引更广技术范围的用户。
常用深度学习软件工具
在深度学习最常用的软件工具中,有些工具已经在支持CUDA的同时,认识到支持OpenCL的必要性。这将使得FPGA更容易实现深度学习的目的。虽然据我们所知,目前没有任何深度学习工具明确表示支持FPGA,不过下面的表格列出了哪些工具正朝支持OpenCL方向发展:
Caffe,由伯克利视觉与学习中心开发,其GreenTea项目对OpenCL提供非正式支持。Caffe另有支持OpenCL的AMD版本。
Torch,基于Lua语言的科学计算框架,使用范围广,其项目CLTorch对OpenCL提供非正式支持。
Theano,由蒙特利尔大学开发,其正在研发的gpuarray后端对OpenCL提供非正式支持。
DeepCL,由Hugh Perkins开发的OpenCL库,用于训练卷积神经网络。
对于刚进入此领域、希望选择工具的人来说,我们的建议是从Caffe开始,因为它十分常用,支持性好,用户界面简单。利用Caffe的model zoo库,也很容易用预先训练好的模型进行试验。
增加训练自由度
有人或许以为训练机器学习算法的过程是完全自动的,实际上有一些超参数需要调整。对于深度学习尤为如此,模型在参数量上的复杂程度经常伴随着大量可能的超参数组合。可以调整的超参数包括训练迭代次数、学习速率、批梯度尺寸、隐藏单元数和层数等等。调整这些参数,等于在所有可能的模型中,挑选最适用于某个问题的模型。传统做法中,超参数的设置要么依照经验,要么根据系统网格搜索或更有效的随机搜索来进行。最近研究者转向了适应性的方法,用超参数调整的尝试结果为配置依据。其中,贝叶斯优化是最常用的方法。
不管用何种方法调整超参数,目前利用固定架构的训练流程在某种程度上局限了模型的可能性,也就是说,我们或许只在所有的解决方案中管窥了一部分。固定架构让模型内的超参数设置探究变得很容易(比如,隐藏单元数、层数等),但去探索不同模型间的参数设置变得很难(比如,模型类别的不同),因为如果要就一个并不简单符合某个固定架构的模型来进行训练,就可能要花很长时间。相反,FPGA灵活的架构,可能更适合上述优化类型,因为用FPGA能编写一个完全不同的硬件架构并在运行时加速。
低耗能计算节点集群
深度学习模型最让人着迷的就是其拓展能力。不管是为了从数据中发现复杂的高层特征,还是为数据中心应用提升性能,深度学习技术经常在多节点计算基础架构间进行拓展。目前的解决方案使用具备Infiniband互连技术的GPU集群和MPI,从而实现上层的并行计算能力和节点间数据的快速传输。然而,当大规模应用的负载越来越各不相同,使用FPGA可能会是更优的方法。FPGA的可编程行允许系统根据应用和负载进行重新配置,同时FPGA的能耗比高,有助于下一代数据中心降低成本。
结语
相比GPU和GPP,FPGA在满足深度学习的硬件需求上提供了具有吸引力的替代方案。凭借流水线并行计算的能力和高效的能耗,FPGA将在一般的深度学习应用中展现GPU和GPP所没有的独特优势。同时,算法设计工具日渐成熟,如今将FPGA集成到常用的深度学习框架已成为可能。未来,FPGA将有效地适应深度学习的发展趋势,从架构上确保相关应用和研究能够自由实现。
整理来自:时间的诗
以上是关于GPU硬件基础知识的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL ES基础理论 (一) —— 缓存、帧缓存、上下文与坐标系等
深度学习FPGA实现基础知识0(FPGA击败GPU和GPP,成为深度学习的未来?)