CN116721006A - 特征图处理方法和装置 - Google Patents

特征图处理方法和装置 Download PDF

Info

Publication number
CN116721006A
CN116721006A CN202210190064.7A CN202210190064A CN116721006A CN 116721006 A CN116721006 A CN 116721006A CN 202210190064 A CN202210190064 A CN 202210190064A CN 116721006 A CN116721006 A CN 116721006A
Authority
CN
China
Prior art keywords
output
thread
feature map
input
convolution
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.)
Pending
Application number
CN202210190064.7A
Other languages
English (en)
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.)
Glenfly Tech Co Ltd
Original Assignee
Glenfly Tech Co Ltd
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 Glenfly Tech Co Ltd filed Critical Glenfly Tech Co Ltd
Priority to CN202210190064.7A priority Critical patent/CN116721006A/zh
Publication of CN116721006A publication Critical patent/CN116721006A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Image Analysis (AREA)

Abstract

本申请涉及一种特征图处理方法和装置。所述方法包括:确定用于卷积运算的输入特征图,多个卷积核,以及与输入特征图对应的输出特征图的维度信息;获取用于组成输出特征图的各输出图像块的第一尺寸信息,基于第一尺寸信息以及维度信息,得到多个线程束;获取各个线程束分别对应的用于组成输入特征图的输入图像块,通过各个线程束读取对应的输入图像块,以及通过各个线程束包含的多个线程分别读取对应的多个卷积核;控制各个线程束根据对应的输入图像块,以及包含的多个线程分别对应的卷积核,得到各个线程束多个输出通道的输出图像块;基于多个输出通道的输出图像块,得到多个输出通道的输出特征图。采用本方法能够提高特征图的处理效率。

Description

特征图处理方法和装置
技术领域
本申请涉及人工智能技术领域,特别是涉及一种特征图处理方法和装置。
背景技术
随着人工智能技术的发展,出现了一种利用卷积神经网络实现特征图处理的技术,该模型可以通过引入卷积核对输入的特征图进行卷积运算,从而得到该输入特征图对应的输出特征图。
目前,由于输入卷积图通常为NCHW内存排布,在进行卷积运算时,为了保证读取输入特征图以及存储输出特征图的内存连续性,通常采用线程束中的多个处理线程同时读取输入特征图同一通道的不同图像块,并利用该通道所对应的卷积核进行卷积运算,从而得到各个输入图像块对应的输出图像块。
然而,上述特征图处理方式中,由于输入特征图需要在多个卷积核中共享,因此通常依赖缓存的方式,来避免输入特征图从内存中的重复读取,然而这种读取方式会造成缓存的存储压力,因此,现有的特征图处理效率较低。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提高特征图处理效率的特征图处理方法和装置。
第一方面,本申请提供了一种特征图处理方法,所述方法包括:
确定用于卷积运算的输入特征图,多个卷积核,以及与所述输入特征图对应的输出特征图的维度信息;
获取用于组成所述输出特征图的各输出图像块的第一尺寸信息,基于所述第一尺寸信息以及所述维度信息,得到多个线程束;
获取各个线程束分别对应的用于组成所述输入特征图的输入图像块,通过所述各个线程束读取对应的输入图像块,以及通过所述各个线程束包含的多个线程分别读取对应的多个卷积核;
控制所述各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到所述各个线程束对应的多个输出通道的输出图像块;
基于所述各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。
在其中一个实施例中,所述维度信息,包括:所述输出特征图的宽度信息,以及所述输出特征图的高度信息;所述第一尺寸信息,包括所述各输出图像块的第一宽度信息,以及所述各输出图像块的第一高度信息;所述基于所述第一尺寸信息以及所述维度信息,得到多个线程束,包括:基于所述输出特征图的宽度信息,以及所述第一宽度信息,得到针对于所述输出特征图的行图像块数量;基于所述输出特征图高度信息,以及所述第一高度信息,得到针对于所述输出特征图的列图像块数量;基于所述行图像块数量以及所述列图像块数量,确定针对于所述输出特征图的输出图像块数量,并构造与所述输出图像块数量相适应的多个线程束。
在其中一个实施例中,所述卷积核的卷积核个数大于所述各个线程束包含的多个线程的线程个数;所述构造与所述输出图像块数量相适应的多个线程束,包括:根据所述卷积核个数以及所述线程个数,对多个输出通道进行分组,得到多个输出通道组合;根据各个线程束所对应的输出图像块所处的输出通道组合,得到所述各个线程束的构造顺序;按照所述构造顺序,构造所述各个线程束;其中位于同一输出通道组合的各个线程束的线程束数量与所述输出图像块数量相适应。
在其中一个实施例中,所述获取各个线程束分别对应的用于组成所述输入特征图的输入图像块,包括:获取各个线程束分别对应的输出图像块,确定各个输出图像块所对应的输出特征图位置;根据所述输出图像块的第一尺寸信息,获取各输入图像块的第二尺寸信息;根据所述输出特征图位置以及第二尺寸信息,得到各个输出图像块对应的输入图像块;根据所述各个线程束分别对应的输出图像块,以及所述各个输出图像块对应的输入图像块,得到所述各个线程束分别对应的输入图像块。
在其中一个实施例中,所述根据所述输出图像块的第一尺寸信息,获取各输入图像块的第二尺寸信息,包括:获取所述卷积核的卷积核尺寸信息,以及预先设定的卷积步长信息;基于所述第一尺寸信息、卷积核尺寸信息,以及所述卷积步长信息,得到所述第二尺寸信息。
在其中一个实施例中,所述输入特征图存储于内存中;所述通过所述各个线程束读取对应的输入图像块,包括:确定当前线程束,以及所述当前线程束对应的当前输入图像块;所述当前输入图像块由多个输入像素组成;通过所述当前线程束包含的多个线程,从所述内存中按照输入像素的分布顺序,读取所述当前输入图像块包含的各个输入像素,并将所述各个输入像素按照所述分布顺序存储于第一向量寄存器中。
在其中一个实施例中,所述多个卷积核存储于内存中,各个卷积核携带有多个卷积核像素;所述通过所述各个线程束包含的多个线程分别读取对应的多个卷积核,包括:通过所述当前线程束对应的多个线程,分别从所述内存中读取对应的卷积核中包含的卷积核像素,并将所述卷积核像素存入第二向量寄存器中;其中,位于不同卷积核,并且卷积核位置相同的卷积核像素存储于第二向量寄存器的同一行中。
在其中一个实施例中,所述分别从所述内存中读取对应的卷积核中包含的卷积核像素之前,还包括:将所述卷积核像素在所述内存中以CHWN的内存布局进行存储。
在其中一个实施例中,所述卷积核的卷积核个数大于所述各个线程束包含的多个线程的线程个数;所述将所述卷积核像素在所述内存中以CHWN的内存布局进行存储,包括:根据所述卷积核个数以及所述线程个数,对多个卷积核进行分组,得到多个卷积核组合;获取各个卷积核组合对应的内存存储顺序,并按照所述内存存储顺序,将所述多个卷积核组合存储于所述内存中,以及将处于同一卷积核组合中的卷积核包含的卷积核像素在所述内存中以CHWN的内存布局进行存储。
在其中一个实施例中,所述控制所述各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到所述各个线程束对应的多个输出通道的输出图像块,包括:将存储于所述第一向量寄存器中的输入像素存储于标量寄存器中;从所述标量寄存器中获取当前输入像素,并控制所述当前线程束包含的多个线程,分别从所述第二向量寄存器中读取各个线程对应的卷积核像素;通过所述当前线程束包含的各个线程,对所述当前输入像素,以及所述各个线程对应的卷积核像素进行卷积运算,得到当前输入像素对应的各个输出通道的当前输出像素;根据所述各个输出通道的当前输出像素,得到各个输出通道的输出图像块。
在其中一个实施例中,所述得到各个输出通道的输出图像块之后,还包括:将所述各个输出通道的输出图像块中包含的输出像素,按照各个输出像素在相应输出图像块中的行顺序,存入第三向量寄存器中。
第二方面,本申请还提供了一种特征图处理装置,所述装置包括:
运算输入确定模块,用于确定用于卷积运算的输入特征图,多个卷积核,以及与所述输入特征图对应的输出特征图的维度信息;
线程束获取模块,用于获取用于组成所述输出特征图的各输出图像块的第一尺寸信息,基于所述第一尺寸信息以及所述维度信息,得到多个线程束;
运算输入读取模块,用于获取各个线程束分别对应的用于组成所述输入特征图的输入图像块,通过所述各个线程束读取对应的输入图像块,以及通过所述各个线程束包含的多个线程分别读取对应的多个卷积核;
输出图像块获取模块,用于控制所述各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到所述各个线程束对应的多个输出通道的输出图像块;
特征图输出模块,用于基于所述各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。
上述特征图处理方法和装置,通过确定用于卷积运算的输入特征图,多个卷积核,以及与输入特征图对应的输出特征图的维度信息;获取用于组成输出特征图的各输出图像块的第一尺寸信息,基于第一尺寸信息以及维度信息,得到多个线程束;获取各个线程束分别对应的用于组成输入特征图的输入图像块,通过各个线程束读取对应的输入图像块,以及通过各个线程束包含的多个线程分别读取对应的多个卷积核;控制各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到各个线程束对应的多个输出通道的输出图像块;基于各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。本申请在特征图处理时,可以通过线程束读取输入图像块,并且利用线程束的多个线程分别读取相应的多个卷积核,进行卷积运算,从而实现了输入图像块在多个线程中的共享,相比于现有的特征图处理方法,本申请不需要在多个处理线程中同时读取输入特征图的不同图像块,因此可以提高特征图的处理效率。
附图说明
图1为一个实施例中特征图处理方法的流程示意图;
图2为一个实施例中得到多个线程束的流程示意图;
图3为另一个实施例中得到多个线程束的流程示意图;
图4为一个实施例中获取各个线程束分别对应的输入图像块的流程示意图;
图5为一个实施例中得到各个线程束的输出图像块的流程示意图;
图6为一个应用实例中基于GPU的卷积计算方法的流程示意图;
图7为一个应用实例中卷积任务拆分示意图;
图8为一个应用实例中工作项数设置示意图;
图9为一个应用实例中线程束分布示意图;
图10为一个应用实例中输入特征图读取示意图;
图11为一个应用实例中卷积核读取示意图;
图12为一个应用实例中卷积核内存布局转换示意图;
图13为一个应用实例中卷积向量相乘的示意图;
图14为一个应用实例中输出数据布局示意图;
图15为一个应用实例中重排序后寄存器数据分布示意图;
图16为一个应用实例中输出数据重排序示意图;
图17为一个实施例中特征图处理装置的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,如图1所示,提供了一种特征图处理方法,本实施例可以应用于图像处理单元GPU中。本实施例中,该方法包括以下步骤:
步骤S101,确定用于卷积运算的输入特征图,多个卷积核,以及与输入特征图对应的输出特征图的维度信息。
其中,输入特征图指的是输入至卷积神经网络中,用于卷积计算的原始特征图,而卷积核则指的是用于对输入特征图进行卷积运算的卷积核,而输出特征图则指的是利用卷积核对输入特征图进行卷积运算后得到的特征图,由于卷积核的个数为多个,因此得到的输出特征图也可以包括多个通道,输出特征图的维度信息则指的是用于描述输出特征图的信息,例如,可以包括输出特征图的宽度信息以及高度信息等等。
具体来说,在用户需要对特征图进行处理时,可以通过将用于卷积运算的特征图,以及实现卷积运算的卷积核输入至图像处理单元GPU的内存中,而图像处理单元则可以将用户输入的用于进行卷积运算的特征图作为输入特征图,同时将存储至内存中的卷积核作为进行卷积运算的多个卷积核,图像处理单元GPU在得到输入特征图以及卷积核的相关信息后,则可以根据上述输入特征图以及卷积核的相关信息得到相应的输出特征图的维度信息。
步骤S102,获取用于组成输出特征图的各输出图像块的第一尺寸信息,基于第一尺寸信息以及所述维度信息,得到多个线程束。
输出图像块则指的是组成输出特征图的图像块,输出特征图可以由多个图像块所组成,而上述图像块则可以作为输出图像块,并且每个输出图像块的尺寸相同,该尺寸则可以作为第一尺寸信息,上述第一尺寸信息也可以由用户预先进行设定。而线程束则指的是用于执行卷积运算的执行主体单元,每一个线程束可以包含多个线程,各个线程可以通过单指令多数据的形式并行执行,并且不同的线程束用于输出不同位置的输出图像块。
例如,输出特征图中可以包含输出图像块1、输出图像块2以及输出图像块3,那么图像处理单元GPU则可以分别通过不同的线程束,可以是线程束1、线程束2以及线程束3分别执行针对于输出图像块1、输出图像块2以及输出图像块3的卷积运算。因此,在图像处理单元GPU得到输出特征图的维度信息后,则可以从维度信息中得到输出特征图的尺寸信息,并且可以基于输出特征图的尺寸信息,以及用户预先设定的各个输出图像块的第一尺寸信息,从而确定出组成输出特征图的多个输出图像块,并且按照输出图像块的数量,构建相应数量的线程束,从而得到多个线程束。
步骤S103,获取各个线程束分别对应的用于组成输入特征图的输入图像块,通过各个线程束读取对应的输入图像块,以及通过各个线程束包含的多个线程分别读取对应的多个卷积核;
步骤S104,控制所各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到各个线程束对应的多个输出通道的输出图像块。
输入图像块则指的是用于组成输入特征图的图像块,与输出图像块类似。本实施例中,输入特征图也可以由多个图像块所组成,组成输入特征图的图像块则可以作为输入图像块,并且各个输入图像块可以和输出图像块一一对应。例如,输出图像块可以包括:输出图像块1、输出图像块2以及输出图像块3,而其对应的输入图像块也可以包括:输入图像块1、输入图像块2以及输入图像块3,并且输出图像块1是对输入图像块1进行卷积运算后得到的输出图像块,输出图像块2是对输入图像块2进行卷积运算后得到的输出图像块,而输出图像块3则是对输入图像块3进行卷积运算后得到的输出图像块。通过上述对应方式,以及每一个输出图像块所对应的线程束,则可以得到每一个线程束分别对应的输入图像块。例如线程束1是用于得到输出图像块1的,那么线程束1对应的输入图像块则可以是输入图像块1,而线程束2是用于得到输出图像块2的,那么线程束2对应的输入图像块则可以是输入图像块2,通过上述方式,图像处理单元GPU则可以得到每一个线程束分别对应的输入图像块。
之后,图像处理单元GPU还可以通过相应的线程束,读取对应的输入图像块,使得该线程束中包含的线程可以实现输入图像块的共享,同时,还可以通过线程束中包含的线程读取相应的卷积核,例如线程束1可以由线程A、线程B以及线程C组成,其中线程A用于读取卷积核A的卷积核信息,线程B用于读取卷积核B的卷积核信息,线程C可以用于读取卷积核C的卷积核信息,并且线程束1可以读取输入图像块1的输入图像块信息,并且在其包含的线程中共享,那么线程A则可以同时得到输入图像块1的输入图像块信息,以及卷积核A的卷积核信息,从而得到与卷积核A对应的输出通道的输出图像块,同理,线程B可以同时得到输入图像块1的输入图像块信息,以及卷积核B的卷积核信息,从而得到与卷积核B对应的输出通道的输出图像块,并且线程C可以同时得到输入图像块1的输入图像块信息,以及卷积核C的卷积核信息,从而得到与卷积核C对应的输出通道的输出图像块,通过上述步骤,则可以得到与输入图像块1对应的多个输出通道的输出图像块。
步骤S105,基于各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。
最后,通过步骤S103和步骤S104,则可以得到每一个线程束对应的各个输出通道的输出图像块,因此,还可以进一步将各个输出通道的输出图像块进行拼接,从而得到每一个输出通道的输出特征图。
例如,输出通道可以包含输出通道A、输出通道B以及输出通道C,并且线程束可以包含线程束1、线程束2以及线程束3,通过步骤S103和步骤S104,可以得到与线程束1对应的各个输出通道的输出图像块,分别为输出图像块A1、输出图像块B1、以及输出图像块C1,也可以得到与线程束2对应的各个输出通道的输出图像块,分别为输出图像块A2、输出图像块B2、以及输出图像块C2,还可以得到与线程束3对应的各个输出通道的输出图像块,分别为输出图像块A3、输出图像块B3、以及输出图像块C3,之后还可以对处于同一输出通道的输出图像块进行拼接,来得到各个输出通道的输出特征图,可以将输出图像块A1、输出图像块A2以及输出图像块A3进行拼接,从而得到输出通道A的输出特征图,也可以将输出图像块B1、输出图像块B2以及输出图像块B3进行拼接,从而得到输出通道B的输出特征图,以及将输出图像块C1、输出图像块C2以及输出图像块C3进行拼接,从而得到输出通道C的输出特征图,通过本步骤,则可以得到每一个输出通道的输出特征图。
上述特征图处理方法中,通过确定用于卷积运算的输入特征图,多个卷积核,以及与输入特征图对应的输出特征图的维度信息;获取用于组成输出特征图的各输出图像块的第一尺寸信息,基于第一尺寸信息以及维度信息,得到多个线程束;获取各个线程束分别对应的用于组成输入特征图的输入图像块,通过各个线程束读取对应的输入图像块,以及通过各个线程束包含的多个线程分别读取对应的多个卷积核;控制各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到各个线程束对应的多个输出通道的输出图像块;基于各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。本申请在特征图处理时,可以通过线程束读取输入图像块,并且利用线程束的多个线程分别读取相应的多个卷积核,进行卷积运算,从而实现了输入图像块在多个线程中的共享,相比于现有的特征图处理方法,本申请不需要在多个处理线程中同时读取输入特征图的不同图像块,因此可以提高特征图的处理效率。
在一个实施例中,维度信息,包括:输出特征图的宽度信息,以及输出特征图的高度信息;第一尺寸信息,包括各输出图像块的第一宽度信息,以及各输出图像块的第一高度信息;如图2所示,步骤S102可以进一步包括:
步骤S201,基于输出特征图的宽度信息,以及第一宽度信息,得到针对于输出特征图的行图像块数量;
步骤S202,基于所输出特征图高度信息,以及第一高度信息,得到针对于输出特征图的列图像块数量。
本实施例中,输出特征图的维度信息可以包括输出特征图的宽度信息以及高度信息,其中宽度信息可以表征该输出特征图在宽度方向上包含的像素数量,而高度信息可以表征该输出特征图在高度方向上包含的像素数量。第一尺寸信息则指的是每一个输出图像块的尺寸信息,可以包括每一个输出图像块的宽度信息,即第一宽度信息,以及每一个输出图像块的高度信息,即第一高度信息,并且第一宽度信息以及第一高度信息也可以分别表征每一个输出图像块在宽度方向以及高度方向上包含的像素点数量。因此,图像处理单元GPU则可以通过输出特征图的宽度信息,以及每一个输出图像块的第一宽度信息,确定出在输出特征图宽度方向上包含的输出图像块数量,可以得到输出特征图每一行包含的图像块数量,即行图像块数量,同时还可以通过输出特征图的高度信息,以及每一个输出图像块的第一高度信息,确定出在输出特征图高度方向上包含的输出图像块数量,可以得到输出特征图每一列包含的图像块数量,即列图像块数量。
步骤S203,基于行图像块数量以及列图像块数量,确定针对于输出特征图的输出图像块数量,并构造与输出图像块数量相适应的多个线程束。
而在得到输出特征图中每一行包含的行图像块数量,以及每一列包含的列图像块数量后,则可以计算得到该输出特征图包含的输出图像块数量,从而构造与该数量相适应的多个线程,例如行图像块数量为5,列图像块数量为4,即表明该输出特征图每一行由5个输出图像块组成,同时每一列由4个输出图像块组成,因此该输出特征图包含的输出图像块的数量则为20,因此可以构造20个线程束。
本实施例中,可以基于每一个输出图像块的第一尺寸信息,以及输出特征图的维度信息中表征的宽度信息与长度信息,从而确定得到该输出特征图包含的输出图像块数量,进而确定出构造的线程束的数量,通过上述方式可以得到需要构造的线程束的数量,从而可以构造相适应数量的线程束,进一步提高线程束构造的效率。
进一步地,卷积核的卷积核个数大于各个线程束包含的多个线程的线程个数;如图3所示,步骤S203可以进一步包括:
步骤S301,根据卷积核个数以及线程个数,对多个输出通道进行分组,得到多个输出通道组合。
本实施例中,用于执行卷积运算的卷积核的个数有可能要比一个线程束包含的线程的个数要多,那么在这种情况下,一个线程束无法得到所有输出通道的输出特征图。例如,一个线程束只包含3个线程,而卷积核的个数则可能是6个,那么对于同样的输入图像块,则可能同时需要两个线程束来进行处理,其中第一个线程束用于处理前三个输出通道所组成的输出通道组合对应的输出特征图,而第二个线程则用于处理后三个输出通道所组成的输出通道组合对应的输出特征图,也就是说,通过对输出通道进行分组的形式,可以保证所有卷积核都对应有相应输出通道的输出特征图。
具体来说,在卷积核的个数要大于每一个线程束包含的线程个数时,图像处理单元GPU可以按照每一个线程个数,对每一个卷积核所对应的输出通道进行分组,从而得到多个输出通道组合,而如果分组后剩余的输出通道不足一组,也将其作为一组处理,例如一个线程束包含3个线程,而卷积核的个数则可能是7个,那么此时则可以按照将7个输出通道分成3组,前两组输出通道组合中包含3个输出通道,而最后一组输出通道组合则仅包含一个输出通道。
步骤S302,根据各个线程束所对应的输出图像块所处的输出通道组合,得到各个线程束的构造顺序。
构造顺序则指的是每一个线程束的构造先后顺序,本实施例中,并非所有的线程束都同时构造,而是存在先后顺序,通过这种方式,在卷积核数量较多时,可以避免所有的卷积核都同时进入缓存,有利于提高卷积核读取时间的局部性。例如可以是针对相同输出通道组合的线程束优先构建,通过上述方式,可以使依赖相同卷积核的线程束优先构建。
例如,输出通道组合可以包括输出通道组合A以及输出通道组合B,其中用于得到输出特征图的线程束可以包含线程束1、线程束2、线程束3、线程束4、线程束5以及线程束6,其中线程束1、线程束2以及线程束3用于得到输出通道组合A所对应的输出特征图,而线程束4、线程束5以及线程束6则用于得到输出通道组合B所对应的输出特征图,因此线程束1、线程束2以及线程束3对应于相同的输出通道组合,因此则可以为线程束1、线程束2以及线程束3设置相应的构造顺序A,而线程束4、线程束5以及线程束6对应于相同的输出通道组合,因此则可以为线程束4、线程束5以及线程束6设置相应的构造顺序B。
步骤S303,按照构造顺序,构造各个线程束;其中位于同一输出通道组合的各个线程束的线程束数量与输出图像块数量相适应。
最后,则可以按照上述构造顺序,实现各个线程束的构造,并使得位于同一输出通道组合的线程束的数量,和输出图像块的数量相适应,例如输出图像块的数量为3个,那么在同一输出通道组合中构造的线程束的数量也为3个。
本实施例中,在卷积核个数大于线程束包含线程的线程个数时,可以对输出通道进行分组,并且线程束所对应的输出图像块所在的分组,来得到相应的构造顺序,通过上述方式,可以使依赖相同卷积核的线程束优先构造,避免大量卷积核同时进入缓存,可以使得卷积核的读取时间局部性更好,在缓存命中率更高。
另外,如图4所示,步骤S103可以进一步包括:
步骤S401,获取各个线程束分别对应的输出图像块,确定各个输出图像块所对应的输出特征图位置。
其中输出特征图位置指的是各个输出图像块在输出特征图中的位置,可以是以坐标的形式进行表征,每一个输出图像块都对应有在输出特征图的位置信息,例如某一个输出图像块对应的坐标信息为(1,1),那么各输出图像块则在输出特征图中位于第一行第一列的位置,而另一个输出图像块对应的坐标信息为(2,1),那么各输出图像块则在输出特征图中位于第一行第二列的位置等等。本实施例中,可以得到每一个线程束对应的输出图像块在输出特征图所对应的位置坐标,作为相应的输出特征图位置。
步骤S402,根据输出图像块的第一尺寸信息,获取各输入图像块的第二尺寸信息;
步骤S403,根据所述输出特征图位置以及第二尺寸信息,得到各个输出图像块对应的输入图像块。
第二尺寸信息则指的是每一个输入图像块的尺寸信息,在得到每一个输出图像块的第一尺寸信息后,则可以根据第一尺寸信息,进一步地得到每一个输入图像块相应的尺寸信息,作为第二尺寸信息,同时还可以基于第二尺寸信息,对输入特征图进行切分,从而得到多个输入图像块,并且按照每一个输入图像块在输入特征图中的位置,找到与该位置相匹配的输出图像块,从而得到每一个输出图像块对应的输入图像块。
例如对于输入图像块1,其对应的坐标信息为(1,1),那么则可以将输出特征图位置为(1,1)的输出图像块作为该输入图像块1对应的输出图像块,同理对于输入图像块2,其对应的坐标信息为(1,2),那么则可以将输出特征图位置为(1,2)的输出图像块作为该输入图像块2对应的输出图像块。通过上述方式,则可以找到每一个输出图像块对应的输入图像块。
步骤S404,根据各个线程束分别对应的输出图像块,以及各个输出图像块对应的输入图像块,得到各个线程束分别对应的输入图像块。
最后,则可以根据每一个线程束分别对应的输出图像块,以及各个输出图像块对应的输入图像块,则可以建立线程束与输入图像块的对应关系,从而得到每一个线程束分别对应的输入图像块。
本实施例中,可以基于图像块在特征图中的位置建立输出图像块与输入图像块的对应关系,从而可以构建线程束与输入图像块的对应关系,提高线程束读取输入图像块的准确性。
进一步地,步骤S402可以进一步包括:获取卷积核的卷积核尺寸信息,以及预先设定的卷积步长信息;基于第一尺寸信息、卷积核尺寸信息,以及卷积步长信息,得到第二尺寸信息。
其中,卷积核尺寸信息指的是每一个卷积核的尺寸信息,可以包括卷积核包含的卷积核通道,以及各个卷积核通道中包含的卷积核像素的分布信息,例如可以是针对某一个卷积核通道,每一行包含的卷积核像素的个数,以及每一列包含的卷积核个数,而卷积步长信息则是预先由用户设定的卷积核在输入特征图的滑动步长信息,可以包括每一行的滑动步长以及每一列的滑动步长。
具体来说,在得到第一尺寸信息后,图像处理单元GPU还可以分别得到针对卷积核的卷积核尺寸信息,以及针对卷积步长的卷积步长信息,并且利用第一尺寸信息、卷积核尺寸信息,以及卷积步长信息,来得到每一个输入图像块的第二尺寸信息。
例如,输出图像块的第一尺寸信息为m*n,卷积核尺寸信息为Kh*Kw,卷积步长信息分别为Sh和Sw,那么最终得到的输入图像块的第二尺寸信息则可以是a*b,其中,a=(m-1)*Sh+Kh,而b=(n-1)*Sw+Kw
本实施例中,在得到输出图像块的第一尺寸信息时,还可以进一步利用卷积核的卷积核尺寸信息,以及卷积步长信息来得到输入图像块的第二尺寸信息,从而可以使得输入图像块的尺寸与输出图像块的尺寸相适应,从而可以使每一个线程束准确读取相应的输入图像块,从而进一步提高输出得到的输出特征图的准确性。
在一个实施例中,输入特征图存储于内存中;步骤S103可以进一步包括:确定当前线程束,以及当前线程束对应的当前输入图像块;当前输入图像块由多个输入像素组成;通过当前线程束包含的多个线程,从内存中按照输入像素的分布顺序,读取当前输入图像块包含的各个输入像素,并将各个输入像素按照分布顺序存储于第一向量寄存器中。
其中,当前线程束可以是构造的多个线程束中的任意一个,而当前输入图像块则指的是与当前线程束对应的输入图像块,该输入图像块可以由多个图像像素,即输入像素组成,每一个输入像素可以按照相应的分布顺序,来形成当前输入图像块。而第一向量寄存器则可以是用于在卷积运算过程中存储输入像素的向量寄存器。
具体来说,在用户向图像处理单元GPU录入输入特征图后,输入特征图可以预先存储于图像处理单元GPU的内存中,在进行卷积运算时,每一个线程束则需要从内存中读取相应的输入图像块,并将其存储于第一向量寄存器来执行卷积运算。读取的方式则可以是由每一个当前线程束中包含的多个线程分别按照输入像素的分布顺序,读取内存中存储的当前输入图像块中包含的输入像素,例如可以是按照像素的行分布顺序进行读取,并按照该分布顺序存储入第一向量寄存器中。
例如,当前线程束中包含的线程数量为64,而当前输入图像块的尺寸信息则可以是6*18,表明输入像素在当前输入图像块中的分布顺序可以是该当前输入图像块中每一行包含18个像素,并且总共有6行像素,那么64个线程每次则可以每次读取3行54个像素数据,并且按照像素数据的分布顺序存入第一像素寄存器中,即第一次先读取前3行的像素数据,存入第一像素寄存器中,第二次则读取后3行的像素数据,存入第一像素寄存器中,来使得第一像素寄存器中存储的输入像素的排列顺序与输入像素在当前输入图像块中的分布顺序相适应。
本实施例中,从内存中读取输入图像块的输入像素时,可以按照输入像素在输入图像块中的分布顺序,将其存储于第一向量寄存器,从而可以保证在第一向量寄存器中存储的各输入像素的存储排列顺序与当前输入图像块中的分布顺序相适应,从而可以提高输入特征图数据读取的连续性。
同时,多个卷积核存储于内存中,各个卷积核携带有多个卷积核像素;步骤S402可以进一步包括:通过当前线程束对应的多个线程,分别从内存中读取对应的卷积核中包含的卷积核像素,并将卷积核像素存入第二向量寄存器中;其中,位于不同卷积核,并且卷积核位置相同的卷积核像素存储于第二向量寄存器的同一行中。
本实施例中,与输入特征图类似,卷积核也可以是预先存储于图像处理单元GPU的内存中,而第二向量寄存器则是用于在卷积运算过程中存储卷积核像素的向量寄存器。在进行卷积运算时,每一个线程束中包含的线程则需要从内存中读取相应的卷积核,同时每一个卷积核也可以由多个卷积核像素组成,例如卷积核可以包含卷积核A、卷积核B以及卷积核C,其中卷积核A可以由卷积核像素A1、卷积核像素A2以及卷积核像素A3组成,卷积核B可以由卷积核像素B1、卷积核像素B2以及卷积核像素B3组成,而卷积核C则可以由卷积核像素C1、卷积核像素C2以及卷积核像素C3组成。之后,在通过当前线程束中包含的线程读取相应的卷积核时,则可以同时通过线程A、线程B以及线程C读取相应的卷积核中的像素,并且在存入第二向量寄存器时,由于位于不同卷积核,并且卷积核位置相同的卷积核像素可以被当前线程束的多个线程并行处理,因此为了方便多线程的并行处理,可以将位于不同卷积核,并且卷积核位置相同的卷积核像素存储于第二向量寄存器的同一行中,即可以将卷积核像素A1、卷积核像素B1以及卷积核像素C1存储于第二向量寄存器的同一行中,将卷积核像素A2、卷积核像素B2以及卷积核像素C2存储于第二向量寄存器的同一行中,以及将卷积核像素A3、卷积核像素B3以及卷积核像素C3存储于第二向量寄存器的同一行中。那么在多个线程进行并行卷积运算时,则可以同时对卷积核像素A1、卷积核像素B1以及卷积核像素C1进行并行运算,或者同时对卷积核像素A2、卷积核像素B2以及卷积核像素C2进行并行运算,从而可以提高卷积核读取的连续性。
本实施例中,从内存中读取卷积核的卷积核像素时,可以将位于不同卷积核,并且卷积核位置相同的卷积核像素存储于第二向量寄存器的同一行中,从而可以方便多个线程按照第二向量寄存器中卷积核像素的存储顺序进行并行运算,以提高输入卷积核数据读取的连续性。
另外,在分别从内存中读取对应的卷积核中包含的卷积核像素之前,还可以包括:将卷积核像素在内存中以CHWN的内存布局进行存储。
本实施例中,由于卷积核的读取方式是通过线程束中多个线程分别读取不同卷积核在相同卷积核位置的卷积核像素,因此,如果采取原始的NCHW内存布局,那么每条线程从内存中读取卷积核像素时,内存地址则会有较大的间隔,即内存间隔为C*H*W个像素,为了提高卷积核内存访问的连续性和局部性,本实施例在将卷积核像素存储于内存时,可以以CHWN的内存布局进行存储,此时每条线程从内存中读取卷积核像素时,该卷积核像素的地址则是相邻的内存地址,由此可以提高卷积核内存访问的连续性和局部性。
本实施例中,在内存中存储卷积核像素时,可以以CHWN的内存布局,通过该方式,在从内存中通过多个线程读取不同卷积核在相同卷积核位置的卷积核像素时,可以使卷积核像素的地址处于相邻的内存地址,从而可以提高卷积核内存访问的连续性和局部性。
另外,卷积核的卷积核个数大于各个线程束包含的多个线程的线程个数;将卷积核像素在内存中以CHWN的内存布局进行存储,可以进一步包括:根据卷积核个数以及线程个数,对多个卷积核进行分组,得到多个卷积核组合;获取各个卷积核组合对应的内存存储顺序,并按照内存存储顺序,将多个卷积核组合存储于内存中,以及将处于同一卷积核组合中的卷积核包含的卷积核像素在内存中以CHWN的内存布局进行存储。
而如果用于执行卷积运算的卷积核的个数要比一个线程束包含的线程的个数要多,那么在这种情况下,一个线程束的多个线程无法同时读取所有的卷积核,因此,此时可以通过多个线程束来读取上述多个卷积核,那么此时则可以按照卷积核的个数和线程束中包含的线程个数进行卷积核的分组处理,例如,对于某个线程束用于读取卷积核分组1的卷积核信息,而另外一个线程束则用于读取卷积核分组2的卷积核信息。为了使卷积核信息在同一个线程束中的读取能够更具有连续性,本实施例中,还可以为各个卷积核分组设置相应的在内存中的存储顺序,即内存存储顺序,该内存存储顺序可以是先存储卷积核分组1中所有卷积核的卷积核像素,再存储卷积核分组2中所有卷积核的卷积核像素,并且每一个卷积核分组中的卷积核像素还可以通过CHWN的内存布局进行存储,从而实现多卷积核组合中卷积核像素的存储。
本实施例中,卷积核的个数大于各个线程束包含的多个线程的个数时,还可以对多个卷积核进行分组,并且按照各个分组对应的内存存储顺序,在内存中存储各个卷积核组合,同时对于同一个卷积核组合中的卷积核像素,还可以通过CHWN的内存布局进行存储,从而可以进一步提高同一个线程束中卷积核内存访问的连续性和局部性。
在一个实施例中,如图5所示,步骤S104可以进一步包括:
步骤S501,将存储于第一向量寄存器中的输入像素存储于标量寄存器中。
其中,标量寄存器可以是SRF寄存器,该寄存器可以实现线程束中的数据共享,由于当前线程束中的多个线程需要共享当前输入图像块中的输入像素,因此在将输入像素存入第一向量寄存器后,还可以进一步地将存入第一向量寄存器的输入像素送入标量寄存器中,以使得当前线程束的多个线程可以通过标量寄存器实现输入像素的共享。
步骤S502,从标量寄存器中获取当前输入像素,并控制当前线程束的包含的多个线程,分别从第二向量寄存器中读取各个线程对应的卷积核像素;
步骤S503,通过当前线程束的包含的各个线程,对当前输入像素,以及各个线程对应的卷积核像素进行卷积运算,得到当前输入像素对应的各个输出通道的当前输出像素。
当前输入像素则指的是存储于标量寄存器中的任意一个输入像素,本实施例中,当前线程束可以从标量寄存器中读取其存储的任意一个当前输入图像块的输入像素,作为当前输入像素,并且还可以令当前线程束的包含的多个线程,分别从第二向量寄存器中读取每一个线程对应的卷积核像素。
之后,还可以通过当前线程束包含的多个线程,分别对在当前线程束中共享的当前输入像素,以及该线程读取的卷积核像素进行卷积运算,从而得到该当前输入像素对应的各个输出通道的输出像素,作为个输出通道的当前输出像素。
例如,当前线程束可以包括多个线程,分别为线程A、线程B以及线程C,那么线程A、线程B以及线程C则可以分别从第二向量寄存器中读取各个卷积核包含的卷积核像素,例如可以是线程A读取卷积核A包含的卷积核像素、线程B读取卷积核B包含的卷积核像素,而线程C读取卷积核C包含的卷积核像素,并且利用在当前线程束中共享的当前输入像素,进行相应的卷积运算,从而得到当前输入像素对每一个输出通道对应的输出像素,作为各个输出通道的当前输出像素。例如,线程A可以对卷积核A包含的卷积核像素,以及当前输入像素进行卷积核运算,从而得到针对于输出通道A的当前输出像素,而线程B则可以对卷积核B包含的卷积核像素,以及当前输入像素进行卷积核运算,从而得到针对于输出通道B的当前输出像素,并且线程C则可以对卷积核C包含的卷积核像素,以及当前输入像素进行卷积核运算,从而得到针对于输出通道C的当前输出像素,通过上述方式,则可以得到当前输入像素在各个输出通道中对应的当前输出像素。
步骤S504,根据各个输出通道的当前输出像素,得到各个输出通道的输出图像块。
在对所有的当前输入像素进行卷积运算后,则可以得到每一个输入像素对应的各个输出通道的输出像素,之后,还可以将处于同一输出通道的输出像素按照像素的排布顺序进行排列,从而生成每一个输出通道的输出图像块。
本实施例中,在进行卷积运算时,可以将当前线程束对应的输入像素存储于标量寄存器中,并且通过标量寄存器实现输入像素在当前线程束中各个线程的共享,同时还可以利用各个线程读取相应卷积核的卷积核像素,并且利用卷积核像素以及当前输入像素,则可以得到各个输出通道的当前输出像素,以形成相应的输出图像块,通过上述方式,实现了输出图像块的生成,并且由于输入可以在标量寄存器中实现共享,可以避免相同输入像素的重复读取,进一步提高卷积运算的效率。
另外,步骤S504之后,还可以包括:将各个输出通道的输出图像块中包含的输出像素,按照各个输出像素在相应输出图像块中的行顺序,存入第三向量寄存器中。
其中,第三向量寄存器是用于存储输出图像块的输出像素的向量寄存器,本实施例中,在得到各个输出通道的输出像素后,还可以将输出像素存储于第三向量寄存器中,而存储的方式则采取各个输出像素在相应输出图像块中的行顺序进行存储,即将输出图像块中处于同一行的输出像素存储于同一个第三向量寄存器中。由于本实施例中,各个线程得到的输出像素分别是来自于不同输出通道的输出像素,而同时需要使输出特征图在内存中存储的内存布局,可以与输入特征图NCHW内存布局相同,如果直接将来自于不同输出通道的输出像素存入第三向量寄存器,则可能导致存储时内存地址的不连续,因此为了保证内存地址存储的连续性,本实施例中可以对各个输出像素在第三向量寄存器的存储方式进行变更,即按照输出像素的行顺序进行存储,以使得输出图像块中处于同一行的输出像素,可以在第三向量寄存器中以连续地址的方式进行存储,那么在实现内存的NCHW存储时,则可以使内存存储地址连续,从而提升内存地址存储的连续性。
本实施例中,在得到输出像素后,还可以对输出像素进行重排序,按照各个输出像素在相应输出图像块中的行顺序,存入第三向量寄存器中,从而提升了数据存储时内存地址连续性,降低了内存访问数据量。
在一个应用实例中,还提供了一种基于GPU的卷积计算方法,该方法针对卷积过程内存读写进行针对性优化。为实现高效的数据共享,同时提高内存读写的局部性,采用了如下措施:
(1)优化计算任务拆分与映射,实现基于寄存器的数据快速共享;
(2)通过工作项数NDRange设计控制任务的计算顺序;
(3)基于单指令多数据结构拆分的卷积核内存布局,以及通过片上本地内存共享卷积核数据;
(4)输出数据重排序以实现更高的数据连续性。
该方法的流程可如图6所示,具体可以包括以下步骤:
步骤1,将输入特征图传输至图像处理单元GPU的全局内存。
步骤2,将卷积核传输至图像处理单元GPU的全局内存。
步骤3,计算任务拆分与映射。
具体来说,GPU硬件有若干个执行单元,每个执行单元可以并行执行若干个线程束,各个线程束按照单指令多数据指令的形式执行,以单指令多数据指令的长度为64为例,一个线程束内有64个并行线程同时执行。
为了在不同卷积核间共享输入特征图,避免输入特征图重复读取,按如下步骤对任务进行拆分:
(1)把输出特征图的每个通道按照m*n输出图像块大小进行拆分,不足m*n的也作为一块。
(2)在通道方向按照单指令多数据指令的长度进行分组,即每连续64个通道作为一组,不足64的也作为1组。
(3)把每组内相同位置的64个m*n小块作为一个任务块分给一个线程束计算。
(4)线程束内每条线程负责任务块内一个通道的m*n图像块的计算任务。
以分块大小m=4,n=16为例,拆分方式可如图7所示。其中,m*n大小可以设置为4*16、2*16、1*16或1*32等值,每个线程束计算的输出块越大,内存复用率越高,但是需要的寄存器数量越多,可以根据硬件实际情况选择。
步骤4,工作项数NDRange设置。
工作项数NDRange是OpenCL里描述计算任务工作项的索引空间,指定了全局工作项的维度和每个维度的数量。每个工作项对应线程束中一条线程,一个工作组可以由一个或多个线程束组成。
GPU在拆分任务构造线程束执行时,会按照一定顺序拆分,可以依据拆分顺序设置工作项数各个维度对应的计算任务,从而达到控制计算任务执行顺序的目的。
输出特征图维度为:[Batch,Channel,Height,Width],映射到3维的工作项数NDRange如图8所示,工作组大小确定了组内工作项的数量,工作项的数量对齐至SIMD_SIZE,SIMD_SIZE表示单指令多数据指令的长度,大小设置为[SIMD_SIZE*k,1,1],一个工作组包含k个线程束,包含k*SIMD_SIZE个工作项,k可以选择2、4或者8等。以k=4为例,GPU在拆分工作项数NDRange时步骤为:
(1)拆分第一维度,也就是Width/n*SIMD_SIZE,会生成Width/n个线程束,每k个线程束组成一个工作组,其中Width表示输出特征图的宽。
(2)拆分第二维度Height/m,其中Height表示输出特征图的高。
(3)拆分第三维度Channel/SIMD_SIZE*Batch,其中Channel表示输出特征图的通道数,Batch表示输出特征图的批尺寸。
以分块大小m=4,n=16为例,按照上述步骤构造线程束以及拆分任务后,不同线程束负责计算的任务在输出特征图上分布如图9所示,通过上述方式,会首先构造计算输出特征图第一个通道组的所有计算任务的线程束,然后依次构造后续通道组的所有计算任务的线程束,优点是:依赖相同卷积核数据块的线程束优先构造,避免大量卷积核同时进入缓存,卷积核读取时间局部性更好,在缓存命中率更高。工作组内线程束依赖相同卷积核数据,可以通过片上本地内存共享卷积核数据。
步骤5,读取特征图输入块并共享。
由于特征图采用NCHW内存布局,为了数据读取连续性,线程束在读取特征图时SIMD_SIZE条线程读取特征图单个通道数据块,在卷积计算过程中逐通道循环读取,并与卷积核相乘累加至输出寄存器。
卷积核大小为Kh*Kw,步长为Sh,Sw,每个线程输出m*n的输出图像块计算,需读取输入特征图数据块为:
[(m-1)*Sh+Kh,(n-1)*Sw+Kw]
每条线程在与卷积核卷积过程需要全部的输入块数据参与运算,为了减少数据重复读取,我们采用共享寄存器实现线程束内数据共享,GPU硬件每个线程束内一般有若干共享寄存器,线程束内每个线程均可访问该寄存器,在我们GPU中称为标量寄存器SRF,通过逐个将读取的输入块数据放入SRF寄存器共享出来,所有线程可以访问全部输入块数据,相比于通过本地内存共享的方法更高效。
为节省向量寄存器,每次读取时SIMD_SIZE条线程读取SIMD_SIZE/((n-1)*Sw+Kw)行数据,保存至向量寄存器。
以卷积核为3*3,补偿为1,1,m*n为4*16,SIMD_SIZE=64为例,需读取6*18的输入数据块,64条线程每次读取3行数据,第一次读取前3行数据放入R24中,第二次读取剩余3行数据放入R25中。每次读取每条线程只读取1个数据,如图10所示。
步骤6,读取卷积核并共享。
1、卷积核读取方式与数据共享
根据任务拆分与映射方式,每个线程束内每条线程需要读取的数据分布在不同卷积核上,读取方式如图11所示,每条线程读取不同卷积核相同位置数据,放入向量寄存器中,便于与相同的输入特征图数据相乘。
卷积核采用逐通道循环读取方式,每次读取单通道Kh*Kw个像素,占用Kh*Kw个向量寄存器。
每个工作组内的所有工作项可以通过片上本地内存共享数据,组内所有线程束依赖相同的卷积核块,因此可以将卷积核数据存储至本地内存供其他线程束读取,进一步减少缓存或内存读取操作。每个工作组需要分配的本地内存大小为:SIMD_SIZE*Kh*Kw
2、基于SIMD分组的内存排布。
由卷积核读取方式可知,一个线程束内的SIMD_SIZE条线程分别读取不同卷积核的相同位置像素数据,如果卷积核采用原始NCHW内存布局,每条线程在读取各自卷积核时,内存地址间隔C*H*W像素,为了提高卷积核内存访问连续性和局部性,按如下步骤对卷积核进行布局转换:
(1)在NCHW布局基础上,将N按照SIMD_SIZE大小进行分组,N非SIMD_SIZE对齐需要补0至SIMD_SIZE对齐。
(2)每组进行nCHW(n=SIMD_SIZE)到CHWn的内存布局转换。
转换后卷积核读取连续性、局部性更好,由于卷积核内存布局转换可以离线提前完成,因此不会给带来额外开销。以N=256,SIMD_SIZE=64为例,转换如图12所示。
步骤7,卷积计算向量化。
将读取的特征图输入数据块逐个放入标量寄存器SRF,与存入向量寄存器的卷积核数据相乘,实现卷积计算在输出通道方向的向量化计算。计算步骤如下:
(1)读取单通道Feature Map输入块和卷积核数据。
(2)逐个将Feature Map数据放入标量寄存器SRF。
(3)放入SRF的数据与对应的卷积核相乘结果累加至输出向量寄存器。
(4)该通道计算完毕后,循环执行计算下个通道,直至所有通道计算完毕。
(5)获得输出特征图所有输出块。
以卷积核为3*3,补偿为1,1,m*n为4*16,SIMD_SIZE=64为例,向量相乘示意图如图13所示。
步骤8,输出重排序。
1、输出数据原始布局。
以SIMD_SIZE=64,输出块大小1*16,输出通道为64为例,假设一个线程束计算结果Out0~Out15存储在向量寄存器R0~R15,如图14所示:
由于一个线程束内64条线程计算得到的输出像素位于输出不同的通道上,输出特征图采用与输入特征图相同的NCHW内存布局,在存储时内存地址是不连续的,增大了缓存压力和内存写请求,本应用实例对数据进行重排序实现存储时内存更好的连续性。
2、重排序
数据重排序可以通过片上本地内存或向量寄存器数据交换指令实现,采用向量寄存器数据交换指令实现对数据进行重排序,可以更高效。不同GPU硬件存在不同的数据交换指令,重排序实现过程会有很大不同,然而最终交换结果是确定的,以输出块大小1*16,SIMD_SIZE=64为例,按如下步骤进行交换:
(1)将R0~R15的64条线程分为4组,每组16条线程,第一组线程0~线程15,第二组线程16~线程31。
(2)每组沿对角线折叠位置交换数据至对应的线程位置。
(3)将第一组R0~R15的线程0数据交换至R0的线程0~线程15。
(4)将第二组R0~R15的线程16数据交换至R0线程16~线程31。
(5)后续各组按(2)和(3)将首条线程数据沿对角线折叠位置进行交换。
(6)最终得到的R0如图15所示,每连续16条线程内存地址是连续的,输出至内存。
(7)将R0~R15的每组第二条线程数据重复(2)、(3)、(4)、(5)操作,交换至R1的各个线程,交换位置仍为对角线折叠位置。
(8)重复上述几步,最终将R0~R15的所有线程数据交换后存储至内存。
第一个线程分组中前4条线程数据交换示意图如图16所示。
通过线程束内64线程的数据交换和重排序,根据不同的输出块大小可以实现16或32个像素地址连续,显著提升了数据存储时内存地址连续性,降低了内存访问数据量。
由于输出特征图宽和高可能非输出块大小m*n对齐,因此在存储数据时需要进行边界判断和处理。
通过上述应用实例,实现了通过SRF寄存器在线程束内快速共享输入数据,减少了输入数据重复读取。通过工作项的设计和卷积核内存布局转换,实现依赖相同卷积核的计算任务得到优先构造执行,提高卷积核的时间、空间局部性,同时通过本地内存共享卷积核,进一步减少了相同卷积核重复从内存读取的概率。并且,在存储输出特征图数据时,通过线程束内数据交换指令,实现输出数据地址连续性提升,减少内存写操作次数。
应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的特征图处理方法的特征图处理装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个特征图处理装置实施例中的具体限定可以参见上文中对于特征图处理方法的限定,在此不再赘述。
在一个实施例中,如图17所示,提供了一种特征图处理装置,包括:运算输入确定模块1701、线程束获取模块1702、运算输入读取模块1703、输出图像块获取模块1704和特征图输出模块1705,其中:
运算输入确定模块1701,用于确定用于卷积运算的输入特征图,多个卷积核,以及与输入特征图对应的输出特征图的维度信息;
线程束获取模块1702,用于获取用于组成输出特征图的各输出图像块的第一尺寸信息,基于第一尺寸信息以及维度信息,得到多个线程束;
运算输入读取模块1703,用于获取各个线程束分别对应的用于组成输入特征图的输入图像块,通过各个线程束读取对应的输入图像块,以及通过各个线程束包含的多个线程分别读取对应的多个卷积核;
输出图像块获取模块1704,用于控制各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到各个线程束对应的多个输出通道的输出图像块;
特征图输出模块1705,用于基于各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。
在一个实施例中,维度信息,包括:输出特征图的宽度信息,以及输出特征图的高度信息;第一尺寸信息,包括各输出图像块的第一宽度信息,以及各输出图像块的第一高度信息;线程束获取模块1702,进一步用于基于输出特征图的宽度信息,以及第一宽度信息,得到针对于输出特征图的行图像块数量;基于输出特征图高度信息,以及第一高度信息,得到针对于输出特征图的列图像块数量;基于行图像块数量以及列图像块数量,确定针对于输出特征图的输出图像块数量,并构造与输出图像块数量相适应的多个线程束。
在一个实施例中,卷积核的卷积核个数大于各个线程束包含的多个线程的线程个数;线程束获取模块1702,进一步用于根据卷积核个数以及线程个数,对多个输出通道进行分组,得到多个输出通道组合;根据各个线程束所对应的输出图像块所处的输出通道组合,得到各个线程束的构造顺序;按照构造顺序,构造各个线程束;其中位于同一输出通道组合的各个线程束的线程束数量与输出图像块数量相适应。
在一个实施例中,运算输入读取模块1703,进一步用于获取各个线程束分别对应的输出图像块,确定各个输出图像块所对应的输出特征图位置;根据输出图像块的第一尺寸信息,获取各输入图像块的第二尺寸信息;根据输出特征图位置以及第二尺寸信息,得到各个输出图像块对应的输入图像块;根据各个线程束分别对应的输出图像块,以及各个输出图像块对应的输入图像块,得到各个线程束分别对应的输入图像块。
在一个实施例中,运算输入读取模块1703,进一步用于获取卷积核的卷积核尺寸信息,以及预先设定的卷积步长信息;基于第一尺寸信息、卷积核尺寸信息,以及卷积步长信息,得到第二尺寸信息。
在一个实施例中,输入特征图存储于内存中;运算输入读取模块1703,进一步用于确定当前线程束,以及当前线程束对应的当前输入图像块;当前输入图像块由多个输入像素组成;通过当前线程束包含的多个线程,从内存中按照输入像素的分布顺序,读取当前输入图像块包含的各个输入像素,并将各个输入像素按照分布顺序存储于第一向量寄存器中。
在一个实施例中,多个卷积核存储于内存中,各个卷积核携带有多个卷积核像素;运算输入读取模块1703,进一步用于通过当前线程束对应的多个线程,分别从内存中读取对应的卷积核中包含的卷积核像素,并将卷积核像素存入第二向量寄存器中;其中,位于不同卷积核,并且卷积核位置相同的卷积核像素存储于第二向量寄存器的同一行中。
在一个实施例中,特征图处理装置,还包括:卷积核像素存储模块,用于将卷积核像素在内存中以CHWN的内存布局进行存储。
在一个实施例中,所述卷积核的卷积核个数大于所述各个线程束包含的多个线程的线程个数;卷积核像素存储模块,进一步用于根据卷积核个数以及线程个数,对多个卷积核进行分组,得到多个卷积核组合;获取各个卷积核组合对应的内存存储顺序,并按照内存存储顺序,将多个卷积核组合存储于内存中,以及将处于同一卷积核组合中的卷积核包含的卷积核像素在内存中以CHWN的内存布局进行存储。
在一个实施例中,输出图像块获取模块1704,用于将存储于第一向量寄存器中的输入像素存储于标量寄存器中;从标量寄存器中获取当前输入像素,并控制当前线程束包含的多个线程,分别从第二向量寄存器中读取各个线程对应的卷积核像素;通过当前线程束包含的各个线程,对当前输入像素,以及各个线程对应的卷积核像素进行卷积运算,得到当前输入像素对应的各个输出通道的当前输出像素;根据各个输出通道的当前输出像素,得到各个输出通道的输出图像块。
在一个实施例中,特征图处理装置,还包括:输出像素重排序模块,用于将各个输出通道的输出图像块中包含的输出像素,按照各个输出像素在相应输出图像块中的行顺序,存入第三向量寄存器中。
全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

Claims (12)

1.一种特征图处理方法,其特征在于,所述方法包括:
确定用于卷积运算的输入特征图,多个卷积核,以及与所述输入特征图对应的输出特征图的维度信息;
获取用于组成所述输出特征图的各输出图像块的第一尺寸信息,基于所述第一尺寸信息以及所述维度信息,得到多个线程束;
获取各个线程束分别对应的用于组成所述输入特征图的输入图像块,通过所述各个线程束读取对应的输入图像块,以及通过所述各个线程束包含的多个线程分别读取对应的多个卷积核;
控制所述各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到所述各个线程束对应的多个输出通道的输出图像块;
基于所述各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。
2.根据权利要求1所述的方法,其特征在于,所述维度信息,包括:所述输出特征图的宽度信息,以及所述输出特征图的高度信息;所述第一尺寸信息,包括所述各输出图像块的第一宽度信息,以及所述各输出图像块的第一高度信息;
所述基于所述第一尺寸信息以及所述维度信息,得到多个线程束,包括:
基于所述输出特征图的宽度信息,以及所述第一宽度信息,得到针对于所述输出特征图的行图像块数量;
基于所述输出特征图高度信息,以及所述第一高度信息,得到针对于所述输出特征图的列图像块数量;
基于所述行图像块数量以及所述列图像块数量,确定针对于所述输出特征图的输出图像块数量,并构造与所述输出图像块数量相适应的多个线程束。
3.根据权利要求2所述的方法,其特征在于,所述卷积核的卷积核个数大于所述各个线程束包含的多个线程的线程个数;
所述构造与所述输出图像块数量相适应的多个线程束,包括:
根据所述卷积核个数以及所述线程个数,对多个输出通道进行分组,得到多个输出通道组合;
根据各个线程束所对应的输出图像块所处的输出通道组合,得到所述各个线程束的构造顺序;
按照所述构造顺序,构造所述各个线程束;其中位于同一输出通道组合的各个线程束的线程束数量与所述输出图像块数量相适应。
4.根据权利要求2所述的方法,其特征在于,所述获取各个线程束分别对应的用于组成所述输入特征图的输入图像块,包括:
获取各个线程束分别对应的输出图像块,确定各个输出图像块所对应的输出特征图位置;
根据所述输出图像块的第一尺寸信息,获取各输入图像块的第二尺寸信息;
根据所述输出特征图位置以及第二尺寸信息,得到各个输出图像块对应的输入图像块;
根据所述各个线程束分别对应的输出图像块,以及所述各个输出图像块对应的输入图像块,得到所述各个线程束分别对应的输入图像块。
5.根据权利要求4所述的方法,其特征在于,所述根据所述输出图像块的第一尺寸信息,获取各输入图像块的第二尺寸信息,包括:
获取所述卷积核的卷积核尺寸信息,以及预先设定的卷积步长信息;
基于所述第一尺寸信息、卷积核尺寸信息,以及所述卷积步长信息,得到所述第二尺寸信息。
6.根据权利要求1所述的方法,其特征在于,所述输入特征图存储于内存中;所述通过所述各个线程束读取对应的输入图像块,包括:
确定当前线程束,以及所述当前线程束对应的当前输入图像块;所述当前输入图像块由多个输入像素组成;
通过所述当前线程束包含的多个线程,从所述内存中按照输入像素的分布顺序,读取所述当前输入图像块包含的各个输入像素,并将所述各个输入像素按照所述分布顺序存储于第一向量寄存器中。
7.根据权利要求6所述的方法,其特征在于,所述多个卷积核存储于内存中,各个卷积核携带有多个卷积核像素;所述通过所述各个线程束包含的多个线程分别读取对应的多个卷积核,包括:
通过所述当前线程束对应的多个线程,分别从所述内存中读取对应的卷积核中包含的卷积核像素,并将所述卷积核像素存入第二向量寄存器中;其中,位于不同卷积核,并且卷积核位置相同的卷积核像素存储于第二向量寄存器的同一行中。
8.根据权利要求7所述的方法,其特征在于,所述分别从所述内存中读取对应的卷积核中包含的卷积核像素之前,还包括:
将所述卷积核像素在所述内存中以CHWN的内存布局进行存储。
9.根据权利要求8所述的方法,其特征在于,所述卷积核的卷积核个数大于所述各个线程束包含的多个线程的线程个数;
所述将所述卷积核像素在所述内存中以CHWN的内存布局进行存储,包括:
根据所述卷积核个数以及所述线程个数,对多个卷积核进行分组,得到多个卷积核组合;
获取各个卷积核组合对应的内存存储顺序,并按照所述内存存储顺序,将所述多个卷积核组合存储于所述内存中,以及将处于同一卷积核组合中的卷积核包含的卷积核像素在所述内存中以CHWN的内存布局进行存储。
10.根据权利要求7所述的方法,其特征在于,所述控制所述各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到所述各个线程束对应的多个输出通道的输出图像块,包括:
将存储于所述第一向量寄存器中的输入像素存储于标量寄存器中;
从所述标量寄存器中获取当前输入像素,并控制所述当前线程束包含的多个线程,分别从所述第二向量寄存器中读取各个线程对应的卷积核像素;
通过所述当前线程束包含的各个线程,对所述当前输入像素,以及所述各个线程对应的卷积核像素进行卷积运算,得到当前输入像素对应的各个输出通道的当前输出像素;
根据所述各个输出通道的当前输出像素,得到各个输出通道的输出图像块。
11.根据权利要求10所述的方法,其特征在于,所述得到各个输出通道的输出图像块之后,还包括:
将所述各个输出通道的输出图像块中包含的输出像素,按照各个输出像素在相应输出图像块中的行顺序,存入第三向量寄存器中。
12.一种特征图处理装置,其特征在于,所述装置包括:
运算输入确定模块,用于确定用于卷积运算的输入特征图,多个卷积核,以及与所述输入特征图对应的输出特征图的维度信息;
线程束获取模块,用于获取用于组成所述输出特征图的各输出图像块的第一尺寸信息,基于所述第一尺寸信息以及所述维度信息,得到多个线程束;
运算输入读取模块,用于获取各个线程束分别对应的用于组成所述输入特征图的输入图像块,通过所述各个线程束读取对应的输入图像块,以及通过所述各个线程束包含的多个线程分别读取对应的多个卷积核;
输出图像块获取模块,用于控制所述各个线程束根据该线程束对应的输入图像块,以及该线程束包含的多个线程分别对应的卷积核,得到所述各个线程束对应的多个输出通道的输出图像块;
特征图输出模块,用于基于所述各个线程束对应的多个输出通道的输出图像块,得到多个输出通道的输出特征图。
CN202210190064.7A 2022-02-28 2022-02-28 特征图处理方法和装置 Pending CN116721006A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210190064.7A CN116721006A (zh) 2022-02-28 2022-02-28 特征图处理方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210190064.7A CN116721006A (zh) 2022-02-28 2022-02-28 特征图处理方法和装置

Publications (1)

Publication Number Publication Date
CN116721006A true CN116721006A (zh) 2023-09-08

Family

ID=87873914

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210190064.7A Pending CN116721006A (zh) 2022-02-28 2022-02-28 特征图处理方法和装置

Country Status (1)

Country Link
CN (1) CN116721006A (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110163080A (zh) * 2019-04-02 2019-08-23 腾讯科技(深圳)有限公司 人脸关键点检测方法及装置、存储介质和电子设备
US20190340502A1 (en) * 2018-05-04 2019-11-07 Apple Inc. Processing group convolution in neural network processor
CN110555800A (zh) * 2018-05-30 2019-12-10 北京三星通信技术研究有限公司 图像处理装置及方法
CN112668708A (zh) * 2020-12-28 2021-04-16 中国电子科技集团公司第五十二研究所 一种提高数据利用率的卷积运算装置
CN113888390A (zh) * 2020-07-03 2022-01-04 北京迈格威科技有限公司 特征图处理方法、装置、电子设备和计算机可读介质

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20190340502A1 (en) * 2018-05-04 2019-11-07 Apple Inc. Processing group convolution in neural network processor
CN110555800A (zh) * 2018-05-30 2019-12-10 北京三星通信技术研究有限公司 图像处理装置及方法
CN110163080A (zh) * 2019-04-02 2019-08-23 腾讯科技(深圳)有限公司 人脸关键点检测方法及装置、存储介质和电子设备
CN113888390A (zh) * 2020-07-03 2022-01-04 北京迈格威科技有限公司 特征图处理方法、装置、电子设备和计算机可读介质
CN112668708A (zh) * 2020-12-28 2021-04-16 中国电子科技集团公司第五十二研究所 一种提高数据利用率的卷积运算装置

Similar Documents

Publication Publication Date Title
US11403025B2 (en) Matrix transfer accelerator system and method
CN109919311B (zh) 生成指令序列的方法、执行神经网络运算的方法和装置
US20200202198A1 (en) Neural network processor
US10255547B2 (en) Indirectly accessing sample data to perform multi-convolution operations in a parallel processing system
US11436017B2 (en) Data temporary storage apparatus, data temporary storage method and operation method
CN110807170B (zh) 多样本多通道卷积神经网络Same卷积向量化实现方法
US10114795B2 (en) Processor in non-volatile storage memory
CN111831254A (zh) 图像处理加速方法、图像处理模型存储方法及对应装置
EP3985509A1 (en) Neural network segmentation method, prediction method, and related apparatus
CN110516316B (zh) 一种间断伽辽金法求解欧拉方程的gpu加速方法
WO2022206556A1 (zh) 图像数据的矩阵运算方法、装置、设备及存储介质
US11705207B2 (en) Processor in non-volatile storage memory
CN114565501B (zh) 用于卷积运算的数据加载方法及其装置
CN108491924B (zh) 一种面向人工智能计算的神经网络数据串行流水处理装置
US10902087B2 (en) Device and method for accelerating matrix multiply operations as a sum of outer products
CN109800867B (zh) 一种基于fpga片外存储器的数据调用方法
CN116721006A (zh) 特征图处理方法和装置
CN116051345A (zh) 图像数据处理方法、装置、计算机设备及可读存储介质
CN114330687A (zh) 数据处理方法及装置、神经网络处理装置
CN112712457B (zh) 数据处理方法以及人工智能处理器
US11488650B2 (en) Memory processing unit architecture
CN109816093B (zh) 一种单路式卷积实现方法
CN111078589B (zh) 一种应用于深度学习计算的数据读取系统、方法及芯片
CN102622318B (zh) 一种存储器控制电路及其控制的向量数据寻址方法
CN114072778A (zh) 存储器处理单元架构

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