CN113835758B - 基于向量指令加速计算的Winograd卷积实现方法 - Google Patents

基于向量指令加速计算的Winograd卷积实现方法 Download PDF

Info

Publication number
CN113835758B
CN113835758B CN202111412784.5A CN202111412784A CN113835758B CN 113835758 B CN113835758 B CN 113835758B CN 202111412784 A CN202111412784 A CN 202111412784A CN 113835758 B CN113835758 B CN 113835758B
Authority
CN
China
Prior art keywords
data
winograd
vector
blocks
register
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202111412784.5A
Other languages
English (en)
Other versions
CN113835758A (zh
Inventor
曾令仿
陈晓锋
陈志广
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhejiang Lab
Original Assignee
Zhejiang Lab
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Zhejiang Lab filed Critical Zhejiang Lab
Priority to CN202111412784.5A priority Critical patent/CN113835758B/zh
Publication of CN113835758A publication Critical patent/CN113835758A/zh
Application granted granted Critical
Publication of CN113835758B publication Critical patent/CN113835758B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30101Special purpose registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/06Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
    • G06N3/063Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Biomedical Technology (AREA)
  • Biophysics (AREA)
  • General Health & Medical Sciences (AREA)
  • Molecular Biology (AREA)
  • Computing Systems (AREA)
  • Evolutionary Computation (AREA)
  • Data Mining & Analysis (AREA)
  • Mathematical Physics (AREA)
  • Computational Linguistics (AREA)
  • Artificial Intelligence (AREA)
  • Neurology (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本发明公开了基于向量指令加速计算的Winograd卷积实现方法,包括如下步骤:S1,构建寄存器分块策略,在CPU上的Winograd卷积实现过程中,原始数据转换到Winograd数据域时,对中间缓冲的数据进行向量分块和寄存器分块;S2,构建内存数据布局策略,将Winograd卷积的原始数据和中间缓冲的数据在内存上进行排列,相对于矩阵乘法的最优性,对中间缓冲的数据布局,将Winograd分块维度安排到更内层的位置;S3,构建cache分块搜索,根据CPU硬件参数和卷积参数确定的小范围内,搜索cache分块的性能最优解,并将其与对应的卷积参数一起保存,后续通过卷积参数直接采用该性能最优解。

Description

基于向量指令加速计算的Winograd卷积实现方法
技术领域
本发明涉及面向深度学习应用的运行支撑***领域,尤其是涉及一种通过向量指令和访存优化改进卷积算法,从而加速深度学习训练及推理的方法。
背景技术
近几年来,人工智能研究日趋火热。深度学习作为人工智能的核心技术,依托深度神经网络模型在学术研究和实际应用中发挥着越来越重要的作用。深度学习包括训练和推理两种任务,训练是将训练数据集在深度神经网络模型上迭代地计算,使神经网络不断更新其内部的模型参数,逐渐获得完成目标任务(如图像分类、图像分割等)的能力;而推理则是使用训练后的深度神经网络模型对数据项执行一轮计算,得出在相应目标任务中该数据项的预测结果。无论是训练任务还是推理任务,都需要大量的计算资源执行神经网络的计算。
然而随着深度学习研究的深入,神经网络的层数不断增加,从AlexNet的8层,到VGG的19层和GooLeNet的22层,甚至ResNet更是深达152层,深度学习面临所需计算资源急剧膨胀的问题。因此高效地利用有限的计算资源,从而尽可能地加速神经网络的计算有着重要的意义。
目前深度学***台上计算开销较大,Winograd卷积通过将一部分乘法运算转换为加法运算从而减少乘法运算的数量,进而实现高性能的卷积计算。Winograd卷积的基本原理来自一个基础的计算复杂性理论——最小滤波算法,在卷积计算中的应用方式具体表现为将输入数据和卷积核数据转换到Winograd数据域,在此数据域中对转换后的输入数据和卷积核数据执行高维矩阵乘法运算,然后再将结果从该数据域转换回原始数据域,得到最终的输出数据,即卷积计算的结果。Winograd卷积包含多个步骤,各个步骤之间需要中间内存缓冲来保存Winograd数据域中的中间数据,这引入了访存的不连续性以及不同步骤之间访存模式的冲突问题,因此尽管Winograd卷积理论上能够提升卷积计算两倍以上的性能,但其实际性能表现却与理论数据存在明显的差距。而在工程实现的优化这一方面,计算加速相关研究主要聚焦于GPU硬件平台,利用GPU的大规模并行线程处理深度学***台具备大容量***内存,可以满足神经网络持续增长的内存需求。
发明内容
为解决现有技术的不足,结合CPU的微架构特征采用多种细粒度技术手段优化卷积计算的性能,实现加速深度神经网络卷积层的计算,提高计算资源的利用率的目的,本发明采用如下的技术方案:
基于向量指令加速计算的Winograd卷积实现方法,包括如下步骤:
S1,构建寄存器分块策略,在CPU上的Winograd卷积实现过程中,原始数据转换到Winograd数据域时,对中间缓冲的数据进行向量分块和寄存器分块,以充分利用CPU的向量寄存器资源,Winograd分块是Winograd卷积的最小单位,将原始数据按Winograd分块大小alpha*alpha通过转换矩阵转换为Winograd数据域的矩阵,多个Winograd分块在Winograd数据域的矩阵堆叠成高维矩阵,构成中间缓冲的数据的矩阵,将中间缓冲中,预设的并行执行的数据维度的数据,根据向量指令宽度,进行向量分块,并安排在中间缓冲的最内层,使向量分块内的数据在内存上是连续的,以便能够用向量加载指令,一次性将整个向量分块的数据,读取到向量寄存器之中,根据CPU中可用寄存器数量,对中间缓冲进行寄存器分块,使成批的向量分块读取到向量寄存器中执行计算,再成批地写回内存;从而使Winograd卷积计算尽可能地使用全部可用寄存器,在寄存器分块在提高数据复用率的同时,还能够通过隐藏指令延迟,加速CPU的计算,指令延迟是指流水线延迟,由于现代CPU采用指令流水线技术,一个指令发起执行后要等待几个周期才能得到其执行结果,因此多个指令依次发起执行,在不同寄存器上执行计算,可以隐藏这一延迟,提高CPU硬件资源的利用率,从而加速CPU的计算;
S2,构建内存数据布局策略,将Winograd卷积的原始数据和中间缓冲的数据在内存上进行排列,数据布局是数据在内存上的排列方式,由于CPU***中内存地址空间是线性的,多维数据保存在内存中需要按照数据布局指定的规则进行排列,Winograd卷积中间缓冲的数据布局,需要兼顾转换步骤和矩阵乘法步骤,由于矩阵乘法步骤涉及高维矩阵乘法,存在复杂的数据复用,因此需要针对CPU***的存储层次结构进行细致的设计,合理安排向量分块、寄存器分块、cache分块等数据布局技术以获得较好的访存性能,因此还需要对数据维度进行分块以充分发挥CPU***存储层次结构的作用,优化访存性能,中间缓冲的设计需要解决Winograd卷积各个步骤之间访存模式的冲突问题:转换步骤的访存局部性与矩阵乘法步骤的计算过程有天然的矛盾性,无法同时满足其内存读写的连续性需求,中间缓冲的数据布局,将数据维度切分成多种分块,以协调程序的局部性与CPU***的存储层次结构之间的关系,用X表示数据维度,对于中间缓冲的分块数据,包括向量分块XsimdBlock、寄存器分块XregBlock以及cache分块Xblock,XnbBlock表示cache分块的块数,各分块按照cache分块的块数、cache分块、寄存器分块和向量分块,从外层到内层排布,由于Winograd卷积的矩阵乘法步骤涉及复杂的数据复用,因此需要充分利用CPU***的存储层次结构中的高速缓存cache以优化计算性能,cache分块将矩阵乘法步骤所使用的数据划分成多个基本块,每个基本块的数据暂时驻留于cache中,使矩阵乘法步骤能够利用访存的局部性降低访存延迟,达到加速程序性能的目的,中间缓冲的数据维度X先除以向量分块XsimdBlock,得到向量分块的块数,再将向量分块的块数除以寄存器分块XregBlock,得到寄存器分块数,再将寄存器分块数除以cache分块Xblock,得到最后的cache分块的块数;相对于矩阵乘法的最优性,对中间缓冲的数据布局,将Winograd分块维度安排到更内层的位置;由于矩阵乘法步骤中,Winograd分块维度作为多线程并行的维度,需要安排在外层,才能使性能最优,而在转换步骤中,Winograd分块维度处于运算的内层,更有利于转换步骤写中间缓冲的内存布局设计,因此,以矩阵乘法步骤的一些性能损耗作为代价,换取Winograd卷积更优的总体性能;
S3,构建cache分块搜索,采用小范围参数空间搜索的方法,作为cache分块的策略,根据CPU硬件参数和卷积参数确定的小范围内,搜索cache分块的性能最优解,并将其与对应的卷积参数一起保存,后续遇到相同的卷积参数,直接采用该性能最优解作为cache分块大小。
进一步地,所述S1中原始数据包括输入数据、卷积核数据、输出数据,将原始数据转换到Winograd数据域,得到输入矩阵、卷积核矩阵和输出矩阵,并暂存在中间缓冲。
进一步地,所述S1中,将输入数据向量化K维度,K表示输入通道,向量分块为KsimdBlock,alpha*alpha表示Winograd分块,N表示Winograd分块的总块数;S2中,对输入矩阵的排布进行优化,考虑到转换步骤和矩阵乘法步骤之间访存模式冲突问题的权衡,将alpha*alpha维度排布在cache分块Kblock与Nblock中间。由外层至内层依次为:cache分块的块数NnbBlock*KnbBlock、cache分块Kblock*Nblock、寄存器分块NregBlock和向量分块KsimdBlock。
进一步地,在寄存器分块中,采用分而治之寄存器分块策略,将中间缓冲根据数据维度N,即Winograd总分块数,分成主体部分和附加部分,对于附加部分的排布,在原有排布层次中去除Nblock。
进一步地,所述S1,将采取寄存器分块优化策略的数据维度分成主体部分和附加部分,主体部分为固定的可用向量寄存器数量的整数倍,附加部分是数据维度减去主体部分剩余的部分,以往的整除式寄存器分块策略常常不能充分利用起CPU全部的向量寄存器,整除式策略,先寻找能整除寄存器分块数据维度的最大整数(该整数不超过可用寄存器数量),再用最大整数,设定寄存器分块大小;然而实际中寄存器分块数据维度往往不能够整除像可用向量寄存器数量这样的大整数,造成CPU向量寄存器资源使用率低下的问题,而分而治之策略可以用可用寄存器数目,直接整除寄存器分块数据维度,让余数部分作为附加部分(计算上可忽略),主体部分就能够最大化利用CPU全部的向量寄存器包括如下步骤:
S11,根据CPU可用的向量寄存器个数NUM_REG,以及向量指令宽度VLEN,设定寄存器分块算法相关参数,分别执行向量分块和寄存器分块;
S12,在向量分块中,将中间缓冲预设的并行执行的数据维度的数据向量化,向量分块大小等于向量指令集宽度VLEN,每VLEN个浮点数作为一个向量分块,排布在中间缓冲数据布局的最内层,使每个向量加载指令都可以读取对齐的数据到向量寄存器中,和/或每个向量保存指令都能将向量寄存器中的数据写到连续的内存空间中;
S13,在寄存器分块中,采用分而治之寄存器分块策略,将中间缓冲根据数据维度N,即Winograd总分块数,分成主体部分和附加部分,将N除以可用向量寄存器数量NUM_REG,得到商S_REG和余数R_REG,S_REG是主体部分总的寄存器分块的块数,R_REG是附加部分RemainNregBlock,S_REG乘以NUM_REG是主体部分MainNregBlock;附加部分的寄存器分块大小便是R_REG,主体部分的寄存器分块大小则是NUM_REG。由于附加部分只占据程序计算的很小一部分,其寄存器分块大小无所谓,而占据程序计算绝大部分的主体部分则能够充分利用硬件平台全部的寄存器资源。
进一步地,所述S2中的cache分块,Nblock部分即为一个基本块,在矩阵乘法步骤执行过程中,卷积核矩阵驻留于cache之中,与输入矩阵的一个基本块做高维矩阵乘法,将结果写入输出矩阵相应基本块的位置中,每个基本块的数据暂时驻留于cache中,使矩阵乘法步骤能够利用访存的局部性降低访存延迟,CPU高速缓存的作用就是利用计算过程中的时间局部性和空间局部性优化访存,一个基本块的数据放在cache中,短时间内的计算会频繁地访问这些数据,而不用去访问高延迟的内存,从而降低访存的延迟(访问内存的延迟显著高于访问cache的延迟)。
进一步地,所述S2中Winograd卷积原始数据的布局围绕转换步骤设计,由于转换步骤以Winograd分块为基本单位逐块进行,很少有数据复用的情况,因此无需针对CPU***的存储层次结构进行复杂的设计,仅需要考虑向量分块,原始数据的数据布局,是将原始数据,在输入通道IC和输出通道OC维度采取向量分块,以向量指令宽度VLEN为向量分块大小,连续地排布在内存缓冲中的最里层,然后是输入高度IH/输入宽度IW、卷积核高度KH/卷积核宽度KW和输出高度OH/输出宽度OW这些维度,其他外层维度在这些维度的基础上,堆叠形成Winograd卷积原始数据的布局。
进一步地,所述S3包括如下步骤:
S31,根据cache的大小所能容纳的最大cache分块数的倍数,确定搜索范围MAX_BLOCK;
S32,对N维度,即Winograd总分块数的cache分块Nblock进行搜索,计算从1到MAX_BLOCK之间的分块大小所能得到的Winograd卷积计算性能,保存性能最佳的分块大小与卷积参数;虽然cache分块影响的主要是矩阵乘法步骤的性能,但由于分块大小也决定了中间缓冲的数据排布,对转换步骤的访存也有所影响,因此将cache分块搜索算法的目标定为整个Winograd卷积的性能,而不仅仅是矩阵乘法步骤的性能;
S33,卷积参数与对应的性能最优的cache分块参数被记录在数据库中,在后续的Winograd卷积计算中,每次执行cache分块搜索算法之前,查找是否已保存该卷积的参数,如果存在则直接采用对应的最优cache分块,从而避免cache分块搜索算法的开销。
不同于以往的根据经验值手工设定Winograd卷积算法中cache分块的做法,本发明采用的小范围参数空间搜索方法,避免了经验值设定在多种不同的微架构平台上通常只是次优解的局限性。
进一步地,所述S31中,最大cache分块数的倍数为两到三倍。
进一步地,所述S3中,由于CPU中L2 cache是核心私有高速缓存的最低一层,且在现代CPU中与L3 cache之间通常是非包含关系,因此只对直接决定基本块大小的L2 cache分块进行参数空间搜索,至于其他cache分块,都是L1 cache分块,对程序性能影响较小,为了降低初次搜索的性能开销,不采取搜索方式确定分块大小。
本发明的优势和有益效果在于:
(1)提升寄存器资源利用率
本发明使用分治的寄存器分块策略,将Winograd卷积寄存器分块维度分成主体部分和附加部分,使占据大部分数据的主体部分能够尽可能多地使用CPU的向量寄存器,占据极小部分数据的附加部分对总体性能的影响则微乎其微。这种策略能够提升CPU寄存器资源的利用率,改进Winograd卷积的计算性能。
(2)改进访存的性能
本发明采用权衡Winograd卷积各步骤访存性能的数据布局,以及小范围参数空间搜索的cache分块策略,前者权衡并行维度和Winograd分块在矩阵乘法步骤和转换步骤在访存上的矛盾,折中确定中间缓冲的数据布局,后者通过对L2 cache分块参数在限定范围内搜索最优解,避免经验值确定cache分块的次优性和跨硬件架构的不稳定性。二者结合充分利用程序局部性提升Winograd卷积访存性能,从而提升Winograd卷积的计算性能。
附图说明
图1为本发明的方法流程图。
图2为本发明中Winograd卷积的四个步骤。
图3为本发明中寄存器分块策略示意图。
图4为本发明中数据布局简图(原始数据)。
图5为本发明中数据布局简图(中间缓冲)。
图6为本发明中矩阵乘法步骤示意图。
具体实施方式
以下结合附图对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。
本发明提出一种CPU平台上的Winograd卷积实现方法。通过深入研究发现CPU上现有的Winograd卷积实现存在的诸多缺陷,本发明基于CPU的微体系结构特征,包括向量寄存器和向量运算单元、多核心并行、多级cache等,对Winograd卷积进行细粒度的优化。本发明提出的方法,既能作为一种服务器利用现有CPU(而不用购买昂贵的GPU)加速深度学习计算任务的技术手段,又能更进一步在基于GPU的深度学习***中将经常性空闲的CPU利用起来,构建高效的异构深度学习***。
如图1所示,首先输入卷积层的参数和CPU硬件资源参数,其中卷积层参数(以经典神经网络AlexNet的第三个卷积层为例,简称AlexNetConv3)包括输入数据的大小(MB*IC*IH*IW,例如512*384*13*13)、输出的大小(MB*OC*OH*OW,例如512*384*13*13)和卷积核的大小(OC*IC*KH*KW,例如384*384*13*13),CPU硬件参数(以Intel CPU Cold6230N为例)包括可用向量寄存器个数(NUM_REG=30,总共32个向量寄存器,预留2个为临时寄存器)、向量指令宽度(VLEN=16,512比特可容纳16个32位浮点数)和各级cache大小(L1 cache 32K字节,L2 cache 1024K字节)等,根据这些参数配置Winograd卷积实现(具体过程为对表1的变量进行赋值);然后依次执行寄存器分块算法、内存缓冲的数据布局构建以及cache分块搜索算法;最终实现完整的Winograd卷积功能,Winograd卷积实现就可以读取输入数据和卷积核数据、执行优化后的卷积计算,然后得到卷积层输出数据。该方案既可以直接作为构建神经网络模型的基础组件,也可以作为深度学习框架底层算子的加速实现。
本发明的实施关键在于Winograd卷积中间缓冲的三个关键优化手段,对应两组算法的实现和一组内存数据布局的构建,下面分别阐述这三个优化手段的实施方式。
(1)寄存器分块算法
Winograd卷积降低乘法操作数量的过程涉及将原始数据转换到Winograd数据域中,因此在具体实现中除了核心的矩阵乘法步骤还有输入转换、卷积核转换和输出转换三个步骤。Winograd卷积的四个步骤流程,如图2所示:
在Winograd卷积的四个步骤中,每两个步骤之间都存在中间缓冲,用于暂存Winograd数据域中的数据。驻留于内存的中间缓冲与各个步骤的访存性能密切相关,对总体性能起到很重要的作用,因此是整个Winograd卷积实现中最重要的设计。其中最主要的关注点是如何将硬件平台的特性融入中间缓冲的设计当中,使各步骤的访存性能最大化从而优化程序的计算性能。现代CPU***的存储层次结构包括寄存器、多层级cache和内存等,Winograd卷积中间缓冲的设计需要尽可能地利用好这些硬件资源,在实际中通过多种优化手段,缓解中间缓冲潜在的访存问题,从而加速Winograd卷积计算。
在寄存器层面,本发明针对Winograd卷积设计了分而治之的寄存器分块策略。现代x86服务器CPU通常含有32个512比特位的向量寄存器,通过CPU提供的向量指令集比如AVX512,可以用一条指令同时完成16个32位浮点数的FMA(Fuse-Multiply-Add,即乘法和加法融合)操作。为充分利用CPU的向量寄存器资源,中间缓冲的设计采用了向量分块与寄存器分块的技术手段。将中间缓冲中,预设的数据并行执行的数据维度,根据向量指令宽度,进行向量分块,并安排在中间缓冲的最内层,使向量分块内的数据在内存上是连续的,以便能够用向量加载指令,一次性将整个向量分块的数据,读取到向量寄存器之中;然后再根据CPU中可用寄存器数量,对中间缓冲进行寄存器分块,使得成批的向量分块读取到向量寄存器中执行计算,之后成批地写回内存。寄存器分块在提高数据复用率的同时,还能够通过隐藏指令延迟,加速CPU的计算,指令延迟是指流水线延迟,由于现代CPU采用指令流水线技术,一个指令发起执行后要等待几个周期才能得到其执行结果,因此多个指令依次发起执行,在不同寄存器上执行计算,可以隐藏这一延迟,提高CPU硬件资源的利用率,从而加速CPU的计算。
本发明所提出的分而治之的寄存器分块策略的主要目的,是使Winograd卷积计算尽可能地使用全部可用寄存器,核心方法是将采取寄存器分块优化策略的数据维度分成两部分,分别称之为主体部分和附加部分,其中主体部分为固定的可用向量寄存器数量的整数倍,而附加部分则是数据维度减去主体部分剩余的一部分。寄存器分块策略示意如图3所示。
本发明之所以采取新的分而治之的寄存器分块策略,是因为以往的整除式寄存器分块策略常常不能充分利用起CPU全部的向量寄存器。整除式策略,先寻找能整除寄存器分块数据维度的最大整数(该整数不超过可用寄存器数量),再最大整数,设定寄存器分块大小;然而实际中寄存器分块数据维度往往不能够整除像可用向量寄存器数量这样的大整数,造成CPU向量寄存器资源使用率低下的问题。而分而治之策略可以用可用寄存器数目,直接整除寄存器分块数据维度,让余数部分作为附加部分(计算上可忽略),主体部分就能够最大化利用CPU全部的向量寄存器。
本发明提出的Winograd卷积实现采用分而治之的寄存器分块策略,详细的寄存器分块算法的过程如下:
根据CPU可用的向量寄存器个数NUM_REG(其大小一般为预留两个临时寄存器之外的其余全部向量寄存器的个数,如NUM_REG=32-2=30个向量寄存器),以及向量指令宽度VLEN(在AVX512指令集、单精度浮点数的情况下为16),设定寄存器分块算法相关参数,分别执行向量分块和寄存器分块。
在向量分块中,将中间缓冲预设的并行计算维度向量化;本实施例中向量化M和K维度,向量分块分别为MsimdBlock和KsimdBlock,向量分块大小等于向量指令集宽度VLEN,例如AlexNetConv3,其M=OC=384,K=IC=384,由于VLEN=16,向量分块MsimdBlock=KsimdBlock=16,M和K维度的其它各个分块见表1;每VLEN个浮点数作为一个向量分块,排布在中间缓冲数据布局的最内层,使每个向量加载指令都可以读取对齐的数据到向量寄存器中,或者每个向量保存指令都能将向量寄存器中的数据写到连续的内存空间中。
寄存器分块采用本发明提出的分而治之寄存器分块策略,如图3所示,将中间缓冲根据数据维度N分成两部分,对N分块的过程为:将N除以可用向量寄存器数量NUM_REG,得到商S_REG和余数R_REG;S_REG是主体部分总的寄存器分块的块数,R_REG是此寄存器分块策略中附加部分RemainNregBlock,S_REG乘以NUM_REG则是主体部分MainNregBlock;附加部分的寄存器分块大小便是R_REG,主体部分的寄存器分块大小则是NUM_REG。由于附加部分只占据程序计算的很小一部分,其寄存器分块大小无所谓,而占据程序计算绝大部分的主体部分则能够充分利用硬件平台全部的寄存器资源。
(2)内存数据布局构建
本发明采用的Winograd卷积内存缓冲的数据布局如图4、5所示,其中图4是Winograd卷积原始的输入数据、卷积核数据和输出数据的布局,图5则是中间缓冲的数据布局。
Winograd卷积原始数据的布局围绕转换步骤设计,由于转换步骤以Winograd分块为基本单位逐块进行,很少有数据复用的情况,因此无需针对CPU***的存储层次结构进行复杂的设计,仅需要考虑向量分块。如图4所示,Winograd卷积输入数据、卷积核数据和输出数据对IC和OC维度采取向量分块,数据以VLEN为向量分块大小连续地排布在内存缓冲中的最里层,然后是IH/IW、KH/KW和OH/OW这些维度。其他外层维度在这些维度的基础上堆叠形成Winograd卷积原始数据的布局。数据布局是指数据在内存上的排列方式;由于CPU***中内存地址空间是线性的,多维数据保存在内存中需要按照数据布局指定的规则进行排列;以表1中的输入数据为例,其数据布局为MB*[K/VLEN]*IH*IW*VLEN,从里到外依次是VLEN、IW、IH、K/VLEN和MB,数据存放从最内层/最里层VLEN开始,到最外层MB结束,先按VLEN的大小存放到线性的内存上,放满VLEN个数据后切换到IW维度,再存放IW*VLEN个数据,如此反复进行,直到全部MB*[K/VLEN]*IH*IW*VLEN个数据存放到内存中。
Winograd卷积中间缓冲的数据布局,则需要兼顾转换步骤和矩阵乘法步骤,由于矩阵乘法步骤涉及高维矩阵乘法,存在复杂的数据复用,因此需要针对CPU***的存储层次结构进行细致的设计,合理安排向量分块、寄存器分块、cache分块等数据布局技术以获得较好的访存性能。
在Winograd卷积实现的中间缓冲设计中,除了采用寄存器分块策略以利用寄存器资源外,还需要对数据维度进行分块以充分发挥CPU***存储层次结构的作用,优化访存性能。中间缓冲的设计需要解决Winograd卷积各个步骤之间访存模式的冲突问题:转换步骤的访存局部性与矩阵乘法步骤的计算过程有天然的矛盾性,无法同时满足其内存读写的连续性需求。不同于其它优先考虑矩阵乘法步骤的做法,本发明Winograd卷积中间缓冲的设计在围绕矩阵乘法步骤进行的同时兼顾其他三个转换步骤。
本发明设计的Winograd卷积内存缓冲的数据布局如下:
表1:Winograd卷积数据布局
Figure 824795DEST_PATH_IMAGE001
表1中所用标号的含义如表2所示,分别为:
表2:标号含义
Figure 804252DEST_PATH_IMAGE002
Winograd卷积的最小单位是Winograd分块,将输入数据alpha*alpha大小的块通过输入转换矩阵转换为Winograd数据域的一个矩阵,多个Winograd分块堆叠成高维矩阵,组成中间缓冲的输入矩阵。在输入转换步骤中alpha*alpha维度处于运算的内层,有利于输入转换步骤写中间缓冲的内存布局设计,因此使alpha*alpha在内存数据布局中处于内层;然而在矩阵乘法步骤中alpha*alpha作为多线程并行的维度,需要安排在外层,这形成中间缓冲内存数据布局设计上的矛盾点。矩阵乘法步骤的并行维度为MnbBlock、alpha*alpha、NnbBlock,运算的多层循环从外到内分别是KnbBlock、Nblock、Mblock、Kblock、KsimdBlock、MregBlock和NregBlock;中间缓冲输入矩阵的数据布局设计若以矩阵乘法步骤的最优性能为目标,则需要设计为NnbBlock*alpha*alpha*KnbBlock*Nblock*Kblock*NregBlock*KsimdBlock,然而这与输入转换步骤中alpha*alpha维度处于运算的内层相矛盾。本发明对此做出权衡,在设计中间缓冲输入矩阵的数据布局时将alpha*alpha维度安排到相对更靠内的位置,设计为NnbBlock*KnbBlock*Kblock*alpha*alpha*Nblock*NregBlock*KsimdBlock,以矩阵乘法步骤的一些性能损耗作为代价,换取Winograd卷积更优的总体性能。
中间缓冲数据布局设计的共同目标是将数据维度切分成多种分块,以协调程序的局部性与CPU***的存储层次结构之间的关系。用X表示数据维度,数据布局中的分块包括向量分块XsimdBlock、寄存器分块XregBlock以及cache分块Xblock,XnbBlock则表示cache分块的块数;各分块的排布规则大致为按照分块数、cache分块、寄存器分块和向量分块从外层到内层排布。维度先除以向量分块,得到向量分块的块数,然后这个数字再除以寄存器分块,得到寄存器分块数,然后再除以cache分块得到最后的cache分块的块数。
对于输入矩阵,在对K维度的划分中,KregBlock不是必要的,通常默认KregBlock等于KsimdBlock。
如表1和图5所示,M、K和N三个数据维度被分为多种分块,根据Winograd矩阵乘法步骤和转换步骤进行合理的排布。其中输入矩阵和输出矩阵由于本发明所采用的分而治之的寄存器分块方法,被分成两部分,占据绝大部分数据的主体部分和几乎可忽略的附加部分。这两部分遵循统一的分块排布逻辑,最内层是向量分块,输入矩阵的KsimdBlock和输出矩阵的MsimdBlock;然后是寄存器分块和cache分块,输入矩阵的NregBlock、Nblock、Kblock和输出矩阵的NregBlock、Nblock、MregBlock、Nblock;最后是alpha*alpha和分块数两个并行计算维度,注意输入矩阵中作为转换步骤和矩阵乘法步骤之间访存模式冲突问题的权衡,将alpha*alpha维度排布在cache分块Kblock和Nblock中间。卷积核矩阵的数据布局排布方式也大致相同。主体部分和附加部分的排布逻辑相统一,是指其数据布局的差异只在于后者没有Nblock这一分块,其余分块的排列都是一样的,如图6所示,以中间缓冲输入矩阵为例,主体部分的数据布局为NnbBlock*KnbBlock*Kblock*alpha*alpha*Nblock*NregBlock*KsimdBlock,而附加部分的数据布局则为NnbBlock*KnbBlock*Kblock*alpha*alpha*remainNregBlock*KsimdBlock。
(3)cache分块搜索算法
Winograd卷积的矩阵乘法步骤涉及复杂的数据复用,因此需要充分利用CPU***的存储层次结构中的高速缓存cache以优化计算性能。中间缓冲的cache分块将矩阵乘法步骤所使用的数据划分成多个基本块,每个基本块的数据暂时驻留于cache中,使矩阵乘法步骤能够利用访存的局部性降低访存延迟,达到加速程序性能的目的。因此cache分块对Winograd卷积的性能起着关键作用。
cache分块将中间缓冲划分成多个基本块,作为Winograd卷积矩阵乘法步骤的基本单元;如图6所示(为了易于观察隐去了维度alpha*alpha),在本实施例中Nblock部分即为一个基本块,在矩阵乘法步骤执行过程中,卷积核矩阵驻留于cache之中,与输入矩阵的一个基本块做高维矩阵乘法,然后将结果写入输出矩阵相应的基本块的位置中。每个基本块的数据暂时驻留于cache中,使矩阵乘法步骤能够利用访存的局部性降低访存延迟,CPU高速缓存的作用就是利用计算过程中的时间局部性和空间局部性优化访存,一个基本块的数据放在cache中,短时间内的计算会频繁地访问这些数据,而不用去访问高延迟的内存,从而降低访存的延迟(访问内存的延迟显著高于访问cache的延迟)。
本发明采用小范围参数空间搜索的方法作为cache分块策略。通常cache分块需要考虑cache的大小以及程序计算本身的特点,同时CPU多达三个层次的cache引入了额外的复杂性;由于CPU中L2 cache是核心私有高速缓存的最低一层,且在现代CPU中与L3 cache之间通常是非包含关系,本发明只对直接决定基本块大小的L2 cache分块进行参数空间搜索。在根据硬件参数和卷积参数确定的小范围内搜索L2 cache分块的性能最优解,并将其与对应的卷积参数一起保存到一个本地数据库中,后续遇到相同的卷积参数就可以直接采用该性能最优解作为L2 cache分块大小。
在本发明采用的中间缓冲的数据布局设计中,cache搜索在Nblock这个分块大小上执行;至于其他cache分块,都是L1 cache分块,对程序性能影响较小,为了降低初次搜索的性能开销,不采取搜索方式确定分块大小。不同于以往的根据经验值手工设定Winograd卷积算法中cache分块的做法,本发明采用的小范围参数空间搜索方法,避免了经验值设定在多种不同的微架构平台上通常只是次优解的局限性。
本发明提出的Winograd卷积采用小范围参数空间搜索的cache分块策略,围绕L2cache优化程序访存。由于cache分块与Winograd卷积矩阵乘法步骤的性能密切相关,任何微小的cache分块上的调整都可能带来较大的性能抖动,因此传统的根据CPU平台cache大小等参数结合经验值确定cache分块大小的做法在性能上是不稳定的。本发明对决定基本块的大小的L2 cache分块采用小范围参数空间搜索的cache分块策略。
分块搜索算法的具体过程为:根据L2 cache的大小所能容纳的最大L2 cache分块数的两到三倍确定搜索范围MAX_BLOCK,然后对N维度的cache分块Nblock进行搜索,计算得到从1到MAX_BLOCK之间的分块大小所能得到的Winograd卷积计算性能,将其中性能最佳的分块大小与卷积参数一起记录下来。虽然cache分块影响的主要是矩阵乘法步骤的性能,但由于分块大小也决定了中间缓冲的数据排布,对转换步骤的访存也有所影响,因此将cache分块搜索算法的目标定为整个Winograd卷积的性能,而不仅仅是矩阵乘法步骤的性能。
卷积参数与对应的性能最优的cache分块参数被记录在数据库中,在后续的Winograd卷积计算中每次执行cache分块搜索算法之前可以先查找该卷积的参数是否在数据库中,如果存在则可以直接采用对应的最优cache分块,从而避免cache分块搜索算法的开销。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的范围。

Claims (10)

1.基于向量指令加速计算的Winograd卷积实现方法,其特征在于包括如下步骤:
S1,构建寄存器分块策略,在CPU上的Winograd卷积实现过程中,原始数据转换到Winograd数据域时,对中间缓冲的数据进行向量分块和寄存器分块,Winograd分块是Winograd卷积的最小单位,将原始数据按Winograd分块大小通过转换矩阵转换为Winograd数据域的矩阵,多个Winograd分块在Winograd数据域的矩阵堆叠成高维矩阵,构成中间缓冲的数据,将中间缓冲中,预设的并行执行的数据维度的数据,根据向量指令宽度,进行向量分块,并安排在中间缓冲的最内层,使向量分块内的数据在内存上是连续的,根据CPU中可用寄存器数量,对中间缓冲进行寄存器分块,使成批的向量分块读取到向量寄存器中执行计算,再成批地写回内存;
S2,构建内存数据布局策略,将Winograd卷积的原始数据和中间缓冲的数据在内存上进行排列,对于中间缓冲的分块数据,按照cache分块的块数、cache分块、寄存器分块和向量分块,从外层到内层排布,cache分块将矩阵乘法步骤所使用的数据划分成多个基本块,每个基本块的数据暂时驻留于cache中,中间缓冲的数据除以向量分块,得到向量分块的块数,将向量分块的块数除以寄存器分块,得到寄存器分块数,将寄存器分块数除以cache分块,得到cache分块的块数;相对于矩阵乘法的最优性,对中间缓冲的数据布局,将Winograd分块维度安排到更内层的位置;
S3,构建cache分块搜索,采用小范围参数空间搜索的方法,作为cache分块的策略,根据CPU硬件参数和卷积参数确定的小范围内,搜索cache分块的性能最优解,并将其与对应的卷积参数一起保存,后续遇到相同的卷积参数,直接采用该性能最优解作为cache分块大小。
2.根据权利要求1所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S1中原始数据包括输入数据、卷积核数据、输出数据,将原始数据转换到Winograd数据域,得到输入矩阵、卷积核矩阵和输出矩阵,并暂存在中间缓冲。
3.根据权利要求2所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S1中,将输入数据向量化K维度,K表示输入通道,向量分块为KsimdBlock,通过alpha*alpha表示Winograd分块大小,N表示Winograd分块的总块数;S2中,对输入矩阵的排布进行优化,将alpha*alpha维度大小的Winograd分块排布在Kblock与Nblock的cache分块中间。
4.根据权利要求3所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于在寄存器分块中,采用分而治之寄存器分块策略,将中间缓冲根据数据维度N,即Winograd总分块数,分成主体部分和附加部分,对于附加部分的排布,在原有排布层次中去除Nblock。
5.根据权利要求1所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S1,将采取寄存器分块优化策略的数据维度分成主体部分和附加部分,主体部分为可用向量寄存器数量的整数倍,附加部分是中间缓冲的数据减去主体部分剩余的部分,包括如下步骤:
S11,根据CPU可用的向量寄存器个数NUM_REG,以及向量指令宽度VLEN,设定寄存器分块算法参数,执行向量分块和寄存器分块;
S12,在向量分块中,将中间缓冲预设的并行执行的数据维度的数据向量化,向量分块大小等于向量指令集宽度VLEN,向量分块排布在中间缓冲数据布局的最内层,使每个向量加载指令都可以读取对齐的数据到向量寄存器中,和/或每个向量保存指令都能将向量寄存器中的数据写到连续的内存空间中;
S13,在寄存器分块中,采用分而治之寄存器分块策略,将中间缓冲根据数据维度N,即Winograd总分块数,分成主体部分和附加部分,将N除以可用向量寄存器数量NUM_REG,得到商S_REG和余数R_REG,S_REG是主体部分总的寄存器分块的块数,R_REG是附加部分RemainNregBlock,S_REG乘以NUM_REG是主体部分MainNregBlock;附加部分的寄存器分块大小便是R_REG,主体部分的寄存器分块大小则是NUM_REG。
6.根据权利要求5所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S2中的cache分块,在矩阵乘法步骤执行过程中,卷积核矩阵驻留于cache之中,与输入矩阵的一个基本块做高维矩阵乘法,将结果写入输出矩阵相应基本块的位置中,每个基本块的数据暂时驻留于cache中。
7.根据权利要求2所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S2中原始数据的数据布局,是将原始数据,在输入通道IC和输出通道OC维度采取向量分块,以向量指令宽度VLEN为向量分块大小,连续地排布在内存缓冲中的最里层,然后是输入高度IH/输入宽度IW、卷积核高度KH/卷积核宽度KW和输出高度OH/输出宽度OW这些维度,其他外层维度在这些维度的基础上,堆叠形成Winograd卷积原始数据的布局。
8.根据权利要求1所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S3包括如下步骤:
S31,根据cache的大小所能容纳的最大cache分块数的倍数,确定搜索范围MAX_BLOCK;
S32,对N维度,即Winograd总分块数的cache分块进行搜索,计算从1到MAX_BLOCK之间的分块大小所能得到的Winograd卷积计算性能,保存性能最佳的分块大小与卷积参数;
S33,在后续的Winograd卷积计算中,每次执行cache分块搜索算法之前,查找是否已保存该卷积的参数,如果存在则直接采用对应的最优cache分块。
9.根据权利要求1所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S31中,最大cache分块数的倍数为两到三倍。
10.根据权利要求1、8、9之一所述的基于向量指令加速计算的Winograd卷积实现方法,其特征在于所述S3中,只对直接决定基本块大小的L2 cache分块进行参数空间搜索。
CN202111412784.5A 2021-11-25 2021-11-25 基于向量指令加速计算的Winograd卷积实现方法 Active CN113835758B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111412784.5A CN113835758B (zh) 2021-11-25 2021-11-25 基于向量指令加速计算的Winograd卷积实现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111412784.5A CN113835758B (zh) 2021-11-25 2021-11-25 基于向量指令加速计算的Winograd卷积实现方法

Publications (2)

Publication Number Publication Date
CN113835758A CN113835758A (zh) 2021-12-24
CN113835758B true CN113835758B (zh) 2022-04-15

Family

ID=78971428

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111412784.5A Active CN113835758B (zh) 2021-11-25 2021-11-25 基于向量指令加速计算的Winograd卷积实现方法

Country Status (1)

Country Link
CN (1) CN113835758B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114281554B (zh) * 2022-03-08 2022-06-17 之江实验室 用于3d图像处理的3d-cnn加速方法及装置、电子设备
CN115617396B (zh) * 2022-10-09 2023-08-29 上海燧原科技有限公司 应用于新型人工智能处理器的寄存器分配方法及装置
CN116401502B (zh) * 2023-06-09 2023-11-03 之江实验室 一种基于NUMA***特性优化Winograd卷积的方法及装置
CN117992578B (zh) * 2024-04-02 2024-07-02 淘宝(中国)软件有限公司 基于大语言模型处理数据的方法、大语言模型及电子设备

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107993186B (zh) * 2017-12-14 2021-05-25 中国人民解放军国防科技大学 一种基于Winograd算法的3D CNN加速方法及***
CN109359730B (zh) * 2018-09-26 2020-12-29 中国科学院计算技术研究所 面向固定输出范式Winograd卷积的神经网络处理器
CN109325591B (zh) * 2018-09-26 2020-12-29 中国科学院计算技术研究所 面向Winograd卷积的神经网络处理器
CN110807513A (zh) * 2019-10-23 2020-02-18 中国人民解放军国防科技大学 一种基于Winograd稀疏算法的卷积神经网络加速器
CN111178519B (zh) * 2019-12-27 2022-08-02 华中科技大学 卷积神经网络加速引擎、卷积神经网络加速***及方法
CN112434786B (zh) * 2020-10-22 2023-09-19 西安交通大学 一种基于winograd动态卷积块的图像处理方法

Also Published As

Publication number Publication date
CN113835758A (zh) 2021-12-24

Similar Documents

Publication Publication Date Title
CN113835758B (zh) 基于向量指令加速计算的Winograd卷积实现方法
CN107657581B (zh) 一种卷积神经网络cnn硬件加速器及加速方法
US11907827B2 (en) Schedule-aware tensor distribution module
US10140123B2 (en) SIMD processing lanes storing input pixel operand data in local register file for thread execution of image processing operations
EP3526665B1 (en) Sorting for data-parallel computing devices
CN103336758A (zh) 一种稀疏矩阵的存储方法CSRL及基于该方法的SpMV实现方法
CN116401502B (zh) 一种基于NUMA***特性优化Winograd卷积的方法及装置
Beaumont et al. Optimal GPU-CPU offloading strategies for deep neural network training
CN106484532B (zh) 面向sph流体模拟的gpgpu并行计算方法
CN114911619A (zh) 一种用于仿真***的基于gpu的中小型稠密矩阵的批量并行lu分解方法
CN116881618B (zh) 通用矩阵乘计算优化方法、装置及处理器
CN113987414A (zh) 基于ARMv8多核处理器的小型和不规则矩阵乘优化方法
CN117828252A (zh) 一种基于矩阵核心的高性能矩阵向量乘方法
Shang et al. LACS: A high-computational-efficiency accelerator for CNNs
CN116680073A (zh) 一种面向GPU和DCU架构的Flash Sort算法优化方法
CN112631610B (zh) 一种针对粗粒度可重构结构的数据重用消除访存冲突方法
Li et al. Optimizing Data Layout for Training Deep Neural Networks
CN115238879A (zh) 深度神经网络的架构搜索方法及硬件加速器
US10824370B2 (en) Systems and methods for implementing random access memory in a flow-based machine perception and dense algorithm integrated circuit based on computing and coalescing of indices
CN115827211A (zh) 近内存计算加速器、双列直插式内存模块以及计算设备
Smith Theory and practice of classical matrix-matrix multiplication for hierarchical memory architectures
JP5206385B2 (ja) バウンダリ実行制御システム、バウンダリ実行制御方法、及びバウンダリ実行制御プログラム
Elango Convolutional neural network acceleration on GPU by exploiting data reuse
US20230077616A1 (en) Hardware acceleration of affine transformations
JP7200765B2 (ja) 学習装置および学習方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant