首页> 中国专利> 一种深度学习汇编优化中的寄存器冲突避免方法

一种深度学习汇编优化中的寄存器冲突避免方法

摘要

本发明公开了一种深度学习汇编优化中的寄存器冲突避免方法,该寄存器冲突避免方法解决的技术问题在于:提供一种规则简单、能够合理使用不同bank中的寄存器从而提高效率的深度学习汇编优化中的寄存器冲突避免方法;采用的技术方案为:一种深度学习汇编优化中的寄存器冲突避免方法,所述深度学习采用Kepler显卡进行加速,汇编优化时,包括以下步骤:将两条以上的计算指令与一条数据传输指令均匀混合在一起,以隐藏访存时间;进行矩阵乘法计算时,从四个或三个寄存器存储体内进行取数。

著录项

  • 公开/公告号CN106598688A

    专利类型发明专利

  • 公开/公告日2017-04-26

    原文格式PDF

  • 申请/专利权人 曙光信息产业(北京)有限公司;

    申请/专利号CN201611132248.9

  • 发明设计人 许建卫;窦晓光;刘立;

    申请日2016-12-09

  • 分类号G06F9/45;

  • 代理机构北京德恒律治知识产权代理有限公司;

  • 代理人章社杲

  • 地址 100193 北京市海淀区东北旺西路8号院36号楼

  • 入库时间 2023-06-19 01:59:31

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-10-18

    授权

    授权

  • 2017-05-24

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20161209

    实质审查的生效

  • 2017-04-26

    公开

    公开

说明书

技术领域

本发明属于深度学习算法的技术领域,具体涉及一种深度学习汇编优化中的寄存器冲突避免方法。

背景技术

深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。其概念由Hinton等人于2006年提出。基于深度置信网络(DBN)提出非监督贪心逐层训练算法,为解决深层结构相关的优化难题带来希望,随后提出多层自动编码器深层结构。此外Lecun等人提出的卷积神经网络是第一个真正多层结构学习算法,它利用空间相对关系减少参数数目以提高训练性能,图1为卷积神经网络的计算流程示意图。

深度学习的应用越来越广泛,算法也越来越成熟。各种开源软件框架被开发出来,如Caffe、Neon、TensorFlow、Theano、Torch等。各种算法的基本思路都大同小异,关键还在于性能。我们知道,深度学习是一种计算密集型的应用,而且用于训练的数据往往都是海量数据,因此,如果采用普通的CPU串行程序来计算一个实际问题,则往往耗费大量时间,数日甚至数月。因此,采用GPU(图形处理器,Graphics Processing Unit)等众核加速器进行加速,则成为了唯一的选择。现在主流的深度学习开发训练平台一般都用NVIDIA的显卡。为了加快训练速度,一般选择在配备多个GPU的高性能计算机或集群上面进行训练。

对深度学习的GPU程序并行化是一项非常常见的工作,其并行方式分为模型并行和数据并行,目前较多见的是数据并行。GPU上代码要达到较好的加速比,必须进行细致的优化,常用的优化方法有:a、优化GPU各级存储使用方法以及方式,尽量保证访问对齐与合并,减小访存开销;b、尽可发掘并行度,使用较多的线程块和线程,能够隐藏访存,提高计算峰值;c、使用流处理,特别是batch(批处理)模式的卷积神经网络天然就具有这种流式特点。但是即便使用了上述所有优化,一般而言,计算的峰值性能也很难超过百分之五十。这是由于再优化的方法也必须通过编译器去生成指令流,而这显然是开发者难以控制的,从而导致任何CUDA(Compute Unified Device Architecture,由NVIDIA推出的运算平台)层面的优化无法控制指令的实时运行情况。因此,为了进一步提高性能,越来越多的开发者直接从GPU产生的汇编代码层面上去进行优化。例如Nervana Systems开发团队,就针对Maxwell显卡做了汇编级优化,峰值性能从百分之五十左右提高到了百分之九十八。

Maxwell是目前最为前沿的GPU卡,深度学习的GPU加速程序在该卡上得到了极大的加速。但是目前市面上,较为多见的还是Kepler卡,而且硬件的升级可能仍然需要一段时间,但是这种汇编优化的工作在Kepler上却是空白。

发明内容

针对相关技术中存在的不足,本发明所要解决的技术问题在于:提供一种规则简单、能够合理使用不同bank中的寄存器从而提高效率的深度学习汇编优化中的寄存器冲突避免方法。

为解决上述技术问题,本发明采用的技术方案为:一种深度学习汇编优化中的寄存器冲突避免方法,所述深度学习采用Kepler显卡进行加速,汇编优化时,包括以下步骤:将两条以上的计算指令与一条数据传输指令均匀混合在一起,以隐藏访存时间;进行矩阵乘法计算时,从四个或三个寄存器存储体内进行取数。

优选地,所述计算指令为FFMA指令。

优选地,所述数据传输指令为LDS指令。

优选地,所述计算指令的延时为一个时钟周期。

优选地,所述数据传输指令的延时为两个时钟周期。

本发明的有益技术效果在于:本发明中的深度学习采用Kepler显卡进行加速,汇编优化时,先将两条以上的计算指令与一条数据传输指令均匀混合在一起,以隐藏访存时间,然后在进行矩阵乘法计算时,从四个或三个寄存器存储体内进行取数。这种寄存器bank冲突避免方案规则简单,可以交给编译器自动完成,由编译器自动检测,合理使用不同bank中的寄存器,从而提高效率。

附图说明

图1是卷积神经网络的计算流程示意图;

图2是在一个线程块中申请的共享内存示意图;

图3是根据本发明实施例的深度学习汇编优化中的寄存器冲突避免方法的流程图;

图4为Kepler显卡的寄存器的bank分布示意图;

图5为使用本发明的深度学习汇编优化中的寄存器冲突避免方法时寄存器使用情况的示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例;基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本案主要针对于Kepler显卡。虽然都是比较新的显卡,架构方面也大同小异,但是对于汇编级的优化而言,即便是很小的变化,也意味着优化工作的千差万别。在经过一段时间的汇编优化工作后,我们发现,性能虽然有所提升,但是仍然徘徊在百分之六十左右。经过研究,我们发现,这是由于寄存器在使用上存在bank(寄存器中的存储体)冲突导致的。

为了说明本案中的方法,首先介绍GPU中bank冲突的概念:GPU(图形处理器,Graphics Processing Unit)共享内存是基于存储体切换的架构(bank-switched-architecture)。在Femi、Kepler、Maxwell等架构的设备上有32个存储体(也就是常说的共享内存分成32个bank),而在G200与G80的硬件上只有16个存储体。如图2所示,在一个线程块中申请如下的共享内存:__shared__float sData[32][32]。

每个存储体(bank)每个周期只能指向一次操作(一个32bit的整数或者一个单精度的浮点型数据),一次读或者一次写,也就是说每个存储体(bank)的带宽为每周期32bit。即在图2所示的32×32的二维数组共享内存中,每一列对应同一个bank,那么:

a、同常量内存一样,当一个warp中的所有线程访问同一地址的共享内存时,会触发一个广播(broadcast)机制到warp中所有线程,这是最高效的。

b、如果同一个warp中的线程访问同一个bank中的不同地址时将发生bank冲突。

c、每个bank除了能广播(broadcast)还可以多播(mutilcast)(计算能力>=2.0),也就是说,如果一warp中的多个线程访问同一个bank的同一个地址时(其他线程也没有访问同一bank的不同地址)不会发生bank冲突。

d、即使同一个warp中的线程随机的访问不同的bank,只要没有访问同一个bank的不同地址就不会发生bank冲突。

上述是我们在普通CUDA优化中必须考虑的宏观层面上的针对共享内存的bank冲突。而实际上,从汇编层来看,代码使用的都是寄存器,而寄存器也同样存在bank冲突。

本案中,如图3所示,一种深度学习汇编优化中的寄存器冲突避免方法,所述深度学习采用Kepler显卡进行加速,汇编优化时,包括以下步骤:

S10,将两条以上的计算指令与一条数据传输指令均匀混合在一起,以隐藏访存时间。

S20,进行矩阵乘法计算时,从四个或三个寄存器存储体内进行取数。

具体地,所述计算指令为FFMA指令。

具体地,所述数据传输指令为LDS指令。

具体地,所述计算指令的延时为一个时钟周期。

具体地,所述数据传输指令的延时为两个时钟周期。

经过实际性能测试,Kepler的寄存器落在四个bank里面,图4所示的是128个寄存器的bank分布情况,在计算中,为了提高指令吞吐率,将6条计算指令与一条数据传输指令均匀混合在一起,从而隐藏访存时间。假设计算指令的延时为一个时钟周期,例如FFMA,而LDS的延时则为两个时钟周期,那么,实际的指令排布为:

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

LDS RS RX

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

FFMA RS RX RX RX

LDS RS RX

通过测试发现,第一条FFMA是不能双发射的,2、3条,4、5条则是可以双发射的;那么,很显然LDS指令最终是和2、3条指令一起执行的,这也是要重点避免bank冲突的地方。

由于一条FFMA指令的源寄存器有三个,LDS有一个,而寄存器则总共有四个bank,因此,看起来必然有冲突。然而,在矩阵乘法计算中,经过特意的算法设计,第1条指令的三个寄存器,其中的2个或者3个,仍然可以得到重用,因此只需从4个或者3个寄存器bank内去取数,再加上LDS的一个寄存器bank,也就是说,最理想的情况是完全没有寄存器冲突,最差的情况也就是存在一个bank冲突。如图5所示,三个寄存器51和两个寄存器52被重用,前两行表示两条FFMA指令的源寄存器,第三行表示LDS指令的源寄存器,左图中因为有三个寄存器51重用,因此两条FFMA加上一条LDS指令,并没有寄存器bank冲突,而右图中,由于只有两个寄存器52重用,因此存在一个寄存器bank冲突。

本发明从“寄存器在使用上存在bank冲突”这个理论出发,在实践中总结出一套避免bank冲突的规律,而且由于规律简单易操作,可以将这种算法最终嵌入到编译器,让编译器去做寄存器的自动分配,完成最后一步的优化。实践证明,这样的考虑对于性能的影响非常大。本发明中的寄存器冲突避免方案规则简单,可以交给编译器自动完成,由编译器自动检测,合理使用不同bank中的寄存器,从而提高效率。通过性能优化,可以提高峰值性能百分之三十以上,算法流程化,规则非常简单,可以嵌入编译器,自动化完成相应的优化工作。因此,本发明具有突出的实质性特点和显著的进步。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号