CN114026571A - 用于并行执行的神经网络操作重新排序 - Google Patents

用于并行执行的神经网络操作重新排序 Download PDF

Info

Publication number
CN114026571A
CN114026571A CN202080045187.0A CN202080045187A CN114026571A CN 114026571 A CN114026571 A CN 114026571A CN 202080045187 A CN202080045187 A CN 202080045187A CN 114026571 A CN114026571 A CN 114026571A
Authority
CN
China
Prior art keywords
operations
engine
execution
runtime
examples
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
CN202080045187.0A
Other languages
English (en)
Inventor
J·T·胡耶恩
D·博尔科维奇
J·泽达
R·R·黄
R·戴尔蒙特
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.)
Amazon Technologies Inc
Original Assignee
Amazon Technologies Inc
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 Amazon Technologies Inc filed Critical Amazon Technologies Inc
Publication of CN114026571A publication Critical patent/CN114026571A/zh
Pending legal-status Critical Current

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/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3856Reordering of instructions, e.g. using queues or age tags
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • 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/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • 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/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N5/00Computing arrangements using knowledge-based models
    • G06N5/01Dynamic search techniques; Heuristics; Dynamic trees; Branch-and-bound

Landscapes

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

Abstract

公开了用于对神经网络的操作重新排序以改善运行时效率的技术。在一些示例中,编译器接收包括多个操作的所述神经网络的描述。所述编译器可确定多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。所述编译器可确定与所述多个操作相关联的执行次序。所述编译器可基于所述执行次序和所述多个操作中的每一者的硬件使用情况而标识运行时低效情况。可对操作重新排序以减少所述运行时低效情况。可基于所述多个操作编译指令,所述多个操作包含重新排序的所述操作。

Description

用于并行执行的神经网络操作重新排序
背景技术
人工智能是试图构建可以与人类相同的方式作出决策的智能机器的研究和工程化领域。人工神经网络(这在本文中将被称作神经网络)属于称作机器学习的人工智能的子领域。机器学习是一种研究领域,其研究赋予计算机在未明确编程的情况下进行学习的能力。实施机器学习算法的程序能够学习执行任务,而所述程序不需要包含考虑到每一种可能性的代码和描述所有可能行为的代码。
神经网络的架构可包含多个操作。所述操作可形成不同层,包含输入层、输出层和数个通常被称作隐藏层的中间层。每个层对前一层的输出执行计算,其中最后一层(输出层)提供最终结果。通过更多层,神经网络理论上可执行更复杂的任务,例如语言翻译和对图像的内容进行标识(或分类)。具有多于三个隐藏层的神经网络有时被称作深度神经网络。深度神经网络可具有许多隐藏层,例如五个层到多于一千个层。
神经网络可使用中央处理单元(CPU)实施以执行计算。然而,CPU倾向于针对顺序计算而非并行计算进行优化,因此可能响应时间表现不佳。图形处理单元(GPU)会针对并行计算进行优化,但未必针对待直接提供到另一计算单元的一个计算单元的结果进行优化。通常,所述结果必须首先写入到存储器,然后读回。尽管GPU可具有比CPU更好的响应时间,但仍需要改进神经网络的执行时间。
附图说明
将参考各图描述根据本公开的各种实施例,图中:
图1示出用于神经网络的视觉模型的示例。
图2包含示出上面可运行编译器的主机系统的示例的框图。
图3包含示出加速引擎的示例的框图。
图4包含示出加速器的示例的框图。
图5示出跨多个执行引擎的低效管线的示例。
图6A和6B示出操作重新排序以改善运行时效率的示例。
图7示出跨多个执行引擎的高效管线的示例。
图8示出各种操作和其相关联存储器使用情况的示例。
图9A和9B示出对操作块重新排序以改善存储器使用情况的示例。
图10A和10B示出因重新排序操作而产生的改善的存储器使用情况的示例。
图11示出将神经网络的操作重新排序的示例方法。
具体实施方式
尽管通常使用一般“现成的”处理器来执行神经网络,但可设计专用集成电路装置来以比这些处理器显著更高的效率执行神经网络。此类装置(其可被称为神经网络处理器)可具有允许无缝地——通常与神经网络的其它操作并行地——执行最常遇到的神经网络操作的独特硬件特征。例如,神经网络处理器可包含可在高效率下执行卷积的一个执行引擎和可在高效率下执行相加的另一执行引擎。可按某一方式利用不同的执行引擎,使得不同的数据集可被管线传输通过引擎而无任一引擎闲置。
不管神经网络处理器实现的效率如何,神经网络操作的排序方式通常使处理器无法实现其全部潜力。例如,神经网络可能按某一方式限定而使得操作未均匀地馈送到处理器的不同执行引擎,从而使某些执行引擎负担过重而其它执行引擎闲置。因为操作次序通常较重要,所以可能迫使一个执行引擎等待,而另一执行引擎首先处理由这两个执行引擎操作的一组数据。优选的是,一个引擎完成一个操作的执行并将结果传递到下一引擎,同时继续处理下一操作。
本文所描述的示例克服了上述由次优操作排序引起的神经网络处理器的低效情况。一些示例在编译进程期间提供操作重新排序。编译器接收神经网络的描述,并且基于神经网络操作的当前排序和神经网络处理器的架构标识运行时低效情况。运行时低效情况可以是其中两个操作由同一执行引擎在即将由不同执行引擎执行操作之前和之后执行的操作序列。另一运行时低效情况可能是以比需要的消耗更多内存的次序执行的操作的两个不同分支。不同类型的运行时低效情况可存储在主机系统中并且可由编译器检索。
在标识运行时低效情况后,编译器可对所述操作中的一者或多者进行重新排序。例如,神经网络的编程代码可提供后跟着第二操作的第一操作。在一些情境中,第一操作与第二操作之间可存在一个或多个居间操作。编译器可通过移动第一操作以使得第一操作在第二操作和任何居间操作(若存在)之后执行而对操作重新排序。作为另一示例,编译器可通过移动第二操作以使得第二操作在第一操作和任何居间操作(若存在)之前执行而对操作重新排序。编译器可对单个操作或操作块(每个块具有单个或多个操作)重新排序。例如,操作块可被重新排序以通过标识写入到相同量的内存的操作群组而改善神经网络处理器中的存储器重复使用。
在一些示例中,编译器可在对两个操作重新排序之前首先确定这两个操作是否可重新排序。在一些情况下,所述两个操作(以及它们之间的操作)可执行可交换的数学运算(例如,相加)。在一些示例中,可在所述操作被重新排序时修改所述操作中的一者或两者以补上每个操作的新位置。例如,添加四个输入的操作可基于操作的新位置而被修改为仅添加三个输入。
在一些示例中,编译器可组合彼此邻近且由同一执行引擎执行的两个操作(一者基于另一者的输出数据而操作)。编译器可首先通过确定所述操作是否类似和/或这两个操作是否执行可交换的数学运算来确定所述两个操作是否可组合。可在重新排序之前或之后组合操作。例如,由于重新排序,可组合两个邻近操作以使得其可在与单独任一操作相同的数目的周期中执行。
本文所描述的示例可特别有利于具有特定架构——例如读取/写入到至少两个存储器装置的至少三个执行引擎——的神经网络处理器。具体地说,一个示例神经网络处理器架构可包含处理引擎阵列,所述处理引擎阵列可执行到存储器子系统的高带宽读取和到结果缓冲器的高带宽写入。另外,激活引擎和池化引擎可对存储器子系统或结果缓冲器执行读取或写入。此类架构减少时延,同时受益于操作重新排序。
在以下描述中,将描述各种实施例。出于解释的目的,阐述具体配置和细节以便提供对实施例的透彻理解。然而,对于所属领域的技术人员来说还将显而易见的是,可在没有所述具体细节的情况下实践实施例。此外,可能省略或简化众所周知的特征,以免使描述的实施例模糊不清。
图1示出用于神经网络的计算流模型100的示例。神经网络从人脑的操作机制获得灵感。根据各种大脑模型,大脑的主要计算元素是神经元。神经元与许多元素连接在一起,其中进入神经元的元素被称为树突,而离开神经元的元素被称为轴突。神经元通过树突接受信号,对信号执行计算,并在轴突上输出信号。输入信号和输出信号被称作激活。一个神经元的轴突可分支并连接到多个神经元的树突。轴突的分支与树突之间的连接被称作突触。
突触可缩放穿过突触的信号。缩放因子被称作权重,并且被认为是大脑能够学习的方式:对输入的不同反应产生不同的权重。学习可改变权重,但神经元和突触的组织不需要改变以获得学习内容。大脑的静态结构因此可用作程序的模型,并且权重可反映所述程序已学会执行的任务。
神经网络基于以下概念而操作:神经元的计算涉及输入值的加权和。这些加权和对应于由突触执行的值缩放和神经元中的那些值的组合。在神经元中对组合的输入执行函数运算。在大脑模型中,所述运算呈现为非线性函数,其使得神经元仅在输入超过某一阈值时生成输出。因此,以此类推,神经网络的节点可将非线性函数应用于输入到节点中的值的加权和。
在示出的示例中,模型100包含输入层104、常被称作隐藏层106的中间层和输出层108。每个层包含一定数目的节点102。在此示例中,输入层104的节点102连接到隐藏层106的每个节点102。将被称作大脑模型中的突触的连接被称作权重110。同样在此示例中,隐藏层106的每个节点102与输出层的每个节点102具有连接或权重110。输入层104可接收输入并且可将输入传播到隐藏层106。神经网络实施方案可包含多个隐藏层。由隐藏层106(或多个隐藏层)计算的加权和被传播到输出层108,所述输出层可将最终输出呈现给用户。根据大脑模型,节点102的输出可被称作激活。
可在示例模型100中的每个层处发生的计算的示例如下:
Figure BDA0003420873270000041
其中Wij为权重,xi为输入激活,yj为输出激活,f()为非线性函数,并且b为偏置项。各种非线性函数可用于达成不同目的。
模型100可被称作有向加权图。在有向图中,到节点或来自节点的每个连接指示(例如,进入节点或远离节点的)方向。在加权图中,每个连接可具有权重。为易于理解和调试,用于开发神经网络的工具可将神经网络显现为有向加权图。在一些情况下,这些工具还可用于训练神经网络并输出经过训练的权重值。接着,执行神经网络就是个使用权重对输入数据进行计算的问题。
与较浅层的网络相比,具有许多层的神经网络能够学习更复杂且更抽象的高层级特征。举例来说,可教神经网络辨识图像。在此示例中,可将图像的像素馈入神经网络的输入层中,并且第一层的输出可指示图像中例如线和边的低层级特征的存在。在后续层处,这些特征可组合以测量更高层级特征的可能存在:线可组合成形状,形状可进一步组合成形状集合。给定所有此类信息,神经网络可输出高层级特征表示特定对象或场景的概率。例如,神经网络可输出图像是含有猫还是不含有猫。
神经网络的学习阶段被称作训练神经网络。在训练期间,教神经网络执行任务。在学习任务时,确定用于权重(以及可能还有偏置)的值。用于神经网络的底层程序(例如,节点到层中的组织,每个层的节点之间的连接,以及由每个节点执行的计算)不需要在训练期间改变。在经过训练后,神经网络可通过使用在训练期间确定的权重值计算结果来执行任务。例如,神经网络可输出图像含有特定对象的概率,可输出音频序列含有特定词语的概率,可生成图像中对象周围的边界框,或可提出应采取的动作,等。运行神经网络的程序被称作推断。
存在可训练权重的多个方式。一个方法被称作有监督学习。在有监督学习中,标记所有训练样本,使得将每个训练样本输入到神经网络中会产生已知结果。另一方法被称作无监督学习,其中不标记训练样本并且训练在于在数据中找出结构或在数据中找到集群。半监督学习介于有监督学习与无监督学习之间。在半监督学习中,标记训练数据的子集。未标记数据可用于限定集群边界,并且标记的数据可用于标记集群。
神经网络已用于各种应用,包含例如用于图像和视频、语音和语言、医药、游戏以及机器人技术的领域中。在图像和视频中,神经网络已用于图像分类、对象定位和检测、图像分段以及动作辨识。在语音和语言中,神经网络已用于语音辨识、机器翻译、自然语言处理和音频生成。在医学领域中,神经网络已用于基因组学和医学成像。在游戏中,神经网络已用于玩视频游戏和桌面游戏,包含具有大量的可能移动的游戏,例如围棋或星际争霸。在机器人技术中,神经网络已用于机器人的运动规划、视觉导航、控制稳定化,以及自主车辆的驾驶策略。
图2包含示出上面可运行例如本文所描述的编译器230的主机系统200的示例的框图。所示主机系统200是计算装置的示例,并且包含处理器202、处理器存储器204、至少一个存储装置206、各种输入/输出(I/O)装置208和至少一个网络接口210。在图2的示例中,主机系统200还包含加速引擎212,所述加速引擎是可加速主机系统200执行的某些操作或计算的集成电路装置。在各种示例中,主机系统200可实施为数据中心中的服务器、台式计算机、膝上型计算机、平板电脑或智能电话,以及其它示例。在一些示例中,下文所论述的在主机系统200中执行或包含的操作或组件可其它计算机装置中执行或包含。例如,编译器230可在主机系统200上执行,而加速引擎212位于不同主机系统处。
处理器202是可执行呈指令形式的程序代码的集成电路装置。程序代码可用于各种软件应用程序或工具,例如操作系统220或编译器230。当处理器202执行程序时,用于所述程序的指令可存储在处理器存储器204中。指令还可存储在其它地方,例如存储装置206上,并且可在处理器202需要时加载到处理器存储器204中。处理器202还可将处理器存储器204用于临时存储处理器202操作的其它数据。在各种示例中,处理器存储器204是易失性存储器类型,例如随机存取存储器的类型,但替代地或另外,非易失性存储器类型可用于处理器存储器204。
存储装置206是可包含非易失性存储器的装置的示例。例如,存储装置206可以是磁盘驱动器、固态驱动器或光学驱动器,以及其它示例。存储装置206还可以是非暂时性的,使得当存储装置206未通电时,存储在存储装置206上的程序代码和其它数据仍然存在。
存储装置206是外围装置的一个示例,外围装置是可耦合到主机系统200以将功能添加到主机系统200的组件。外围装置的其它示例包含输入/输出装置208和网络接口210。输入/输出装置208可包含用户输入和输出装置,例如键盘、鼠标、触摸屏、麦克风、显示屏、扬声器、打印机和扫描仪,以及其它示例。可使用网络接口卡实施的网络接口210可提供对一个或多个网络的接入。网络接口210可包含例如物理端口以用于连接网络缆线和/或无线天线以与WiFi和/或蜂窝网络通信。网络接口210还可被描述为I/O装置。
加速引擎212也是另一类型的外围装置或I/O装置。加速引擎212是被专门构建以执行可由处理器202执行但可由加速引擎212更快地执行的某些操作的装置。例如,加速引擎212可以是神经网络加速器,并且因此比起由处理器202执行计算的情况,能够更高效地执行神经网络的大规模并行计算。作为另一示例,加速引擎212可以是图形处理单元(GPU),并且可被优化以执行图形渲染所需的计算。可由加速引擎212实施的装置的其它示例包含密码加速器、压缩和解压缩加速器、3D加速器、正则表达式加速器、安全加速器等。
在各种示例中,加速引擎212可执行程序代码以执行某些操作。例如,当加速引擎212是神经网络加速器时,加速引擎212可被编程以执行特定神经网络,例如执行图像辨识的神经网络或执行机器翻译的神经网络。作为另一示例,为了支持神经网络的执行,加速引擎212可被编程以执行操作,例如将用于神经网络的数据从(例如)处理器存储器204复制到加速引擎212中、将用于神经网络的输入数据从处理器存储器204复制到加速引擎212中,和/或将结果从加速引擎212复制到处理器存储器204中,以及其它示例。
为生成用于加速引擎212的程序代码,在各种示例中,主机系统200可执行编译器230。通常,编译器是将以人可读语言编写的程序代码转译为可由集成电路装置读取和处理的格式(例如,机器指令)的软件程序。在图2的示例中,加速引擎212是神经网络加速器,并且编译器230用于将神经网络描述编译为待在加速引擎212上执行的指令。当加速引擎212实施不同类型的加速器时,可使用另一编译器。
可例如在操作系统220从输入/输出装置208接收键盘、鼠标、触摸屏、语音命令或其它输入时激活编译器230。输入还可包含用于编译器230的参数,例如用以编译和配置编译进程的选项的输入代码242。在激活编译器230后,处理器202可将用于编译器230的指令加载到处理器存储器204中,并且可执行所述指令。
在图2的示例中,编译器230包含各自执行不同操作以产生编译代码244的第一级232、第二级236和第三级240。在其它示例中,编译器230可将第一级232、第二级236和/或第三级240的操作组合到较少级中,或可将各级中的一者的操作划分到多个级中。
第一级232可接收并处理输入代码242。输入代码242可以例如Java、C++或Tensorflow以及许多其它示例等高级编程语言描述程序。输入代码242可描述例如执行图像辨识、语音辨识、机器翻译或其它操作的步骤。可例如从存储装置206获得输入代码242。或者,尽管此处未示出,但输入代码242可位于处理器存储器204中或可使用网络接口210从网络位置获得。输入代码242的处理可包含将输入代码242中描述的操作排序为层,其中一个层的输出将输入提供到下一层。处理还可包含标识待由处理器202执行而非由加速引擎212执行的步骤。例如,通过驱动器222的执行,处理器202可能需要执行例如配置直接存储器存取(DMA)描述符以用于将数据移动到加速引擎212中或从加速引擎中移出数据以及其它示例等步骤。
第一级232的输出234可例如在层、节点和神经网络节点之间的连接中组织。第二级236可对此输出234执行中间处理。例如,在任何一个层中或在层中的任何一个节点处执行的操作可能对于加速引擎212来说过多而无法同时执行。加速引擎212可能例如具有有限量的本地存储空间以用于计算所需的数据,或所述计算可能超过加速引擎212可一次执行的量。在此示例中,第一级232可将层或节点的操作分解成较小操作,所述较小操作可符合加速引擎的本地存储器和/或可符合加速引擎212的计算量。第一级232的输出234的处理可包含其它步骤,例如安排或确定加速引擎212和/或处理器202将执行操作的次序,以及其它示例。
在各种示例中,第二级236的输出238包含待由加速引擎212的组件按执行步骤的次序执行的各种步骤。输出238可例如表示为数据流图,其中图中的节点表示存储器操作、计算和其它操作,并且节点之间的边或连接表示节点之间的依赖关系,例如数据依赖关系、存储器依赖关系或操作依赖关系,以及其它示例。
第三级240可对第二级236的输出238操作,并且在产生待由加速引擎212执行的指令之前执行各种步骤。这些步骤可包含例如移除冗余依赖关系、通过将同步指令插入到代码中而解析或处置节点之间的依赖关系、标识存储器使用情况或存储器带宽使用上的可能优化以及其它操作。
第三级240的输出是编译代码244,其可包含呈二进制格式的机器指令。在一些示例中,编译代码244可存储在处理器存储器204中。替代地或另外,可将编译代码244复制到存储装置206或到网络位置。如上所指出,加速引擎212可位于不同主机系统处,在此情况下,编译代码244可通过网络接口210发送到另一主机系统。
在图2的示例中,主机系统200可执行驱动器222,所述驱动器还可被称作装置驱动器或运行时驱动器,其管理加速引擎212。驱动器222可提供在主机系统200上(或另一主机系统上)执行的应用程序与加速引擎212之间的接口。例如,驱动器222可提供应用程序接口(API),所述API限定用于将输入数据馈送到加速引擎212并限定要对输入数据执行的操作的功能。在此示例和其它示例中,驱动器222可配置加速引擎212以执行所述操作。例如,驱动器222可标识加速引擎212将执行的神经网络,以及用于神经网络的编译代码244在处理器存储器204中或存储装置206上所处的位置。驱动器222还可将编译代码244加载到加速引擎212中或使加速引擎212加载所述编译代码,可加载或使加速引擎212加载神经网络将操作的输入数据,和/或可使加速引擎212开始执行输入数据。在加速引擎212结束后,加速引擎212可通知驱动器222,并且驱动器222可将结果传递回到请求所述结果的应用程序。
图3包含示出加速引擎300的示例的框图。加速引擎300是可包含可类似于图4中示出的加速器的一个或多个加速器302a-302n的集成电路的示例。
在图3的示例中,加速引擎300包含多个加速器302a-302n,其中的每一者可执行一组操作。在各种示例中,加速器302a-302n用于特定类型的操作,使得与由通用处理器执行类似操作相比,加速器302a-302n可快很多地执行操作。在各种示例中,为了执行一组操作,上面待执行操作的输入数据必须首先被移动到加速器302a-302n中。另外,在一些情况下,程序代码也移动到加速器302a-302n中,所述程序代码对加速器302a-302n将对数据执行的操作进行编程。在示出的示例中,加速引擎300包含n个加速器302a-302n。可包含在加速引擎300中的加速器的示例包含图形加速器、浮点加速器、神经网络加速器等。在各种示例中,加速器302a-302n可各自相同(例如,每一者是图形加速器)或可不同(例如,加速器302a-302n包含图形加速器、浮点加速器和神经网络加速器)。
示例加速引擎300还包含用于与外部存储器通信的DRAM控制器342a-342k。在此示例中,使用DRAM 330实施外部存储器。在示出的示例中,加速引擎300包含k个DRAM控制器342a-342k,其中的每一者能够与一组独立的DRAM组通信。在其它示例中,其它类型的RAM技术可用于外部存储器。DRAM控制器342a-342k还可被称作存储器控制器。
在各种示例中,用于加速器302a-302n的输入数据和/或程序代码可存储在DRAM330中。不同程序可使加速器302a-302n执行不同操作。例如,当加速器中的一者是神经网络加速器时,一个程序可配置所述神经网络加速器以执行语音辨识,而另一程序可配置所述神经网络加速器以执行图像辨识。在各种示例中,不同加速器302a-302n可用不同程序编程,使得每个加速器执行不同的一组操作。在各种示例中,处理器348a-348s可管理程序代码从DRAM 330到加速器302a-302n的移动。
示例加速引擎300还包含用于与系统中的I/O装置332通信的I/O控制器344a-344p。加速引擎300可通过例如处理器总线与I/O装置通信。在一些示例中,可使用外围组件互连(PCI)和/或PCI总线协议的变型来实施处理器总线。处理器总线可将加速引擎300连接到例如输入和输出装置等I/O装置、存储器控制器、存储装置和/或网络接口卡,等。在一些示例中,I/O控制器344-344p可使加速引擎300能够充当主机处理器的I/O装置。例如,加速引擎300可以是来自主机处理器的输入数据以及指示将对输入数据执行的操作(例如,特定计算或分析)的命令的接收方。在示出的示例中,加速引擎300包含p个I/O控制器344a-344p,其中的每一者可包含单独的根联合体并且可与单独的一组I/O装置332通信。在其它示例中,其它标准化总线协议,例如超路径互连(UPI),可用于主机总线。在其它示例中,可使用专属总线协议。
加速引擎300中的数据的移动可由一个或多个处理器348a-348s管理,所述处理器还可被称作数据管理处理器。在图3的示例中,加速引擎300包含并入到装置中(例如,在同一硅管芯上)的s个处理器348a-348s。在其它示例中,处理器348a-348s可在加速引擎300的外部(例如,在不同管芯上和/或在不同封装中)。在一些示例中,处理器348a-348s可管理数据从I/O装置332到加速器302a-302n或DRAM 330的移动。例如,输入数据可位于I/O装置332处或处理器存储器中,并且处理器348a-348s可将来自I/O装置332或处理器存储器的输入移动到加速器中或到DRAM 330中。作为另一示例,用于加速器302a-302n的程序代码可位于I/O装置332上或处理器存储器中。
示例加速引擎300还包含DMA引擎346a-346d,其可在加速器302a-302n、DRAM控制器342a-342k和I/O控制器344a-344p之间移动数据。在示出的示例中,加速引擎300包含d个DMA引擎346a-346d。在一些实施方案中,DMA引擎346a-346d可被分配到特定任务,例如将数据从DRAM控制器342a-342d移动到加速器302a-302n,或在I/O控制器344a-344p与加速器302a-302n之间移动数据。这些任务可例如通过将描述符与DMA引擎346a-346d一起排队而分配,其中描述符标识数据块的地址和待执行的操作(例如,读取或写入)。例如,描述符可引导DMA引擎指示DMA控制器从DRAM 330读取数据块。作为另一示例,描述符可指示DMA引擎将DMA控制器读取的数据写入到加速器。其它描述符可用于将数据从加速器移动到DRAM330。
在各种示例中,处理器348a-348s中的每一者可负责管理不同加速器的数据移动。在一些示例中,处理器可管理多于一个加速器的数据移动。类似地,在各种示例中,可将处理器348a-348s中的每一者分配给一个或多个DMA引擎346a-346d。在这些和其它示例中,处理器348a-348s、加速器302a-302n和DMA引擎346a-346d之间的关联通过每个相应处理器正执行的程序代码确定。
在示例加速引擎300中,各种组件可通过芯片互连件320进行通信。芯片互连件320主要包含用于加速引擎300的组件之间路由数据的布线。在一些情况下,芯片互连件320可包含最小量的逻辑,例如用以控制数据方向的多路复用器、用于处置时钟域交叉的触发器和定时逻辑。
图4包含示出加速器402的示例的框图。在各种示例中,对于一组输入数据(例如,输入数据450),加速器402可使用处理引擎阵列410、激活引擎416和/或池化引擎418执行计算。在一些示例中,示例加速器402可以是神经网络处理器等处理器的集成电路组件。处理器可具有其它集成电路组件,包含额外加速器。
在各种实施方案中,存储器子系统404可包含多个存储器组414。在这些实施方案中,每个存储器组414可独立地存取,这意指一个存储器组的读取不依赖于另一存储器组的读取。类似地,写入到一个存储器组不影响或限制写入到不同存储器组。在一些情况下,可同时读取和写入每个存储器组。各种技术可用于具有可独立存取的存储器组414。例如,每个存储器组可以是物理上独立的存储器组件,其具有单独的且独立于每个其它存储器组的地址空间的地址空间。在此示例中,每个存储器组可具有至少一个读取通道并且可具有可同时使用的至少一个单独写入通道。在这些示例中,存储器子系统404可准许同时接入多个存储器组的读取或写入通道。作为另一示例,存储器子系统404可包含仲裁逻辑,使得例如多个存储器组414的输出之间的仲裁可使得多于一个存储器组的输出被使用。在这些和其它示例中,尽管总体由存储器子系统404管理,但每个存储器组可独立于任何其它存储器组来操作。
使存储器组414可独立存取可增大加速器402的效率。例如,值可被同时读取并提供到处理引擎阵列410的每个行,使得整个处理引擎阵列410可在一个时钟周期中使用。作为另一示例,可在由处理引擎阵列410计算的结果被写入到存储器子系统404的同时读取存储器组414。相比之下,单个存储器可能每次仅能够服务一个读取或写入。在单个存储器的情况下,在可开始处理引擎阵列410之前,例如可能需要多个时钟周期来读取处理引擎阵列410的每个行的输入数据。
在各种实施方案中,存储器子系统404可被配置成同时服务多个客户端,所述客户端包含处理引擎阵列410、激活引擎416、池化引擎418以及通过通信结构420接入存储器子系统404的任何外部客户端。在一些实施方案中,能够服务多个客户端可意指存储器子系统404至少具有与客户端一样多的存储器组。在一些情况下,处理引擎阵列410的每个行可算作单独的客户端。在一些情况下,处理引擎阵列410的每个列可输出结果,使得每个列可算作单独的写入客户端。在一些情况下,来自处理引擎阵列410的输出可被写入到存储器组414中,所述存储器组随后可向处理引擎阵列410提供输入数据。作为另一示例,激活引擎416和池化引擎418可包含多个执行通道,每个执行通道可以是单独的存储器客户端。例如,存储器组414可使用静态随机存取存储器(SRAM)实施。
在各种实施方案中,存储器子系统404可包含控制逻辑。例如,控制逻辑可记录存储器组414中的每一者的地址空间,标识要读取或写入的存储器组414,和/或在存储器组414之间移动数据。在一些实施方案中,存储器组414可硬接线到特定客户端。例如,一组存储器组414可被硬接线以将值提供到处理引擎阵列410的各行,其中一个存储器组服务一个行。作为另一示例,一组存储器组可硬接线以从处理引擎阵列410的列接收值,其中一个存储器组接收一个列的数据。
处理引擎阵列410是示例加速器402的计算矩阵。例如,处理引擎阵列410可执行并行积分、卷积、相关和/或矩阵乘法等。处理引擎阵列410包含布置成行和列的多个处理引擎411,使得由一个处理引擎411输出的结果可直接输入到另一处理引擎411中。因此,不在处理引擎阵列410的外部边上的处理引擎411可从其它处理引擎411而非从存储器子系统404接收数据以进行操作。
在各种示例中,处理引擎阵列410使用脉动执行,其中数据从不同方向或相同方向以规律间隔到达每个处理引擎411。在一些示例中,输入数据可从左流入处理引擎阵列410中,并且权重值可在顶部加载。在一些示例中,权重和输入数据可从左流动,而部分和可从顶部流到底部。在这些和其它示例中,乘积累加操作作为对角波阵面(diagonal wavefront)移动通过处理引擎阵列410,其中数据向右和向下移动跨过阵列。控制信号可与数据或权重同时在左边输入,并且可连同计算一起流过并且向下流动。
在各种实施方案中,处理引擎阵列410中的列的数目确定处理引擎阵列410的计算量,并且行的数目确定用于实现处理引擎阵列410的最大利用率所需的存储器带宽。处理引擎阵列410可具有例如64列和64行,或某一其它数目的列和行。
图4中以插图示出处理引擎411的示例。如由此示例所示,处理引擎411可包含乘法器-累加器电路。来自左边的输入可包含例如输入数据i和权重值w,其中所述输入数据是从一组输入数据或一组中间结果取得的值,并且所述权重值来自将神经网络的一个层连接到下一层的一组权重值。例如,一组输入数据可以是提交以用于标识或对象辨识的图像、提供以用于语音辨识的音频片段、用于自然语言处理或机器翻译的文本的字符串,或需要分析以确定下一移动的游戏的当前状态等。在一些示例中,输入数据和权重值输出到右边,以用于输入到下一处理引擎411。
在示出的示例中,来自上方的输入可包含从另一处理引擎411或从处理引擎阵列410进行的前一轮计算提供的部分和p_in。当针对新的一组输入数据开始计算时,处理引擎阵列410的顶部行可接收p_in的固定值,例如零。如由此示例所示,i和w一起相乘,并且结果与p_in进行求和以产生可输入到另一处理引擎411中的新的部分和p_out。处理引擎411的各种其它实施方案是可能的。
来自处理引擎阵列410中的最后一行的输出可暂时存储在结果缓冲器412中。所述结果可以是中间结果,其可被写入到存储器组414以提供给处理引擎阵列410以进行额外计算。或者,所述结果可以是最终结果,其一旦被写入到存储器组414就可通过通信结构420从存储器子系统404读取,以由系统输出。
在一些实施方案中,加速器402包含激活引擎416。在这些实施方案中,激活引擎416可将来自处理引擎阵列410的结果组合成一个或多个输出激活。例如,对于卷积神经网络,来自多个通道的卷积可进行求和以产生用于单个通道的输出激活。在其它示例中,可能需要累加来自处理引擎阵列410中的一个或多个列的结果以产生用于神经网络中的单个节点的输出激活。在一些示例中,可绕过激活引擎416。
在各种示例中,激活引擎416可包含多个单独执行通道。在这些示例中,所述执行通道可对应于处理引擎阵列410的列,并且可对列的输出执行操作,其结果可存储在存储器子系统404中。在这些示例中,激活引擎416能够执行1个与n个之间的并行计算,其中n等于处理引擎阵列410中的列的数目。在一些情况下,可同时执行所述计算中的一者或多者。每个执行通道可执行的计算的示例包含指数、平方、平方根、恒等式、二元阶梯(binarystep)、双极阶梯(bipolar step)、反曲(sigmoidal)和斜坡(ramp),以及其它示例。
在一些实施方案中,加速器402可包含池化引擎418。池化是对处理引擎阵列410的列的输出的组合。组合可包含例如计算最大值、最小值、平均值、中值、总和、乘法或另一逻辑或数学组合。在各种示例中,池化引擎418可包含可对来自处理引擎阵列410的对应列的值进行操作的多个执行通道。在这些示例中,池化引擎418能够执行1个与n个之间的并行计算,其中n等于处理引擎阵列410中的列的数目。在各种示例中,池化引擎418的执行通道可并行和/或同时操作。在一些示例中,可绕过池化引擎418。
本文中,激活引擎416和池化引擎418可共同地被称作执行引擎。处理引擎阵列410是执行引擎的另一示例。执行引擎的另一示例是可位于加速器402外部的直接存储器存取(DMA)引擎。
输入数据450可到达通信结构420。通信结构420可将加速器402连接到处理器的其它组件,例如可从输入/输出(I/O)装置、存储驱动器或网络接口获得输入数据450的DMA引擎。输入数据450可例如是一维数据,例如字符串或数值序列,或可为二维数据,例如用于图像的像素值的阵列或用于音频信号的随时间推移的频率和幅值。在一些示例中,输入数据450可以是三维的,例如对于自动驾驶汽车所使用的情境信息或虚拟现实数据来说可以是这种情况。在一些实施方案中,存储器子系统404可包含用于输入数据450的单独缓冲器。在一些实施方案中,当加速器402接收输入数据450时,输入数据450可存储在存储器组414中。
在一些示例中,加速器402可实施神经网络处理引擎。在这些示例中,对于一组输入数据450,加速器402可运行神经网络以执行任务,而所述神经网络已针对所述任务进行了训练。对一组输入数据执行神经网络可被称作推断或执行推断。
神经网络的权重可连同神经网络将进行操作的输入数据450一起存储在存储器子系统404中。神经网络还可包含指令,所述指令可对处理引擎阵列410进行编程以对权重和输入数据执行各种计算。所述指令还可存储在存储器子系统404中、存储器组414中或单独指令缓冲器中。处理引擎阵列410可输出表示神经网络的个别层的输出的中间结果。在一些情况下,激活引擎416和/或池化引擎418可针对由神经网络的某些层调用的计算而启用。加速器402可将中间结果存储在存储器子系统404中以用于输入到处理引擎阵列410中以计算神经网络的下一层的结果。处理引擎阵列410还可从神经网络的最后一层输出最终结果。最终结果可存储在存储器子系统404中,接着被复制出来到主机处理器存储器或到另一位置。
图5示出跨多个执行引擎的低效管线的示例。三个水平分道中的每一者对应于参考图4所描述的不同执行引擎,例如处理引擎阵列410(“PE阵列”)、激活引擎416(“激活引擎”)和池化引擎418(“池化引擎”)。每个执行引擎执行各种操作550并且将输出数据写入到如由操作550中的每一者上示出的模式所指示的四个组中的一者。组0-3可对应于参考图4所描述的结果缓冲器412的不同组。
在示出的示例中,PE阵列可执行操作550-1并且可将输出数据写入到组0。接下来,PE阵列可执行操作550-5并且将输出数据写入到组1。同时,激活引擎可对来自操作550-1的输出数据执行操作550-2并将输出数据写入到组0。在一些情况下,当将操作550-2的输出数据写入到组0时,PE阵列可能覆写操作550-1的输出数据。因此,仅可在先前操作已完成之后执行对同一存储器组的写入或读取操作。
在示出的示例中,管线低效,因为写入到每个组的操作序列如下:(1)PE阵列、(2)激活引擎、(3)池化引擎和(4)激活引擎。由于激活引擎在每个序列中使用两次,因此不同序列无法以高效方式并排放置,从而导致PE阵列和池化引擎在不同时间闲置。
图6A和6B示出操作重新排序以改善运行时效率的示例。图6A示出可在例如ResNet50等神经网络架构中发现的一组操作650,其中两个分支通过由池化引擎执行的相加操作650-5结合在一起。在操作650-5之前的左边分支上是由PE阵列执行的卷积操作650-3和由激活引擎执行的偏置相加操作650-4。在相加操作650-5之后是同样由激活引擎执行的ReLU操作。
编译器可标识出由操作650-3、650-4、650-5和650-6形成的序列构成运行时低效情况。作为响应,编译器可在操作650-5之后将操作650-4移动到新位置,如虚线所指示。图6B示出操作的所得次序。在操作650-3处由PE阵列执行卷积之后,在操作650-5处由池化引擎基于由操作650-3生成的输出数据以及由操作650-2处执行的偏置相加生成的输出数据来执行相加操作。接下来,在操作650-4处由激活引擎执行偏置相加操作,并且在操作650-6处也由激活引擎执行ReLU操作,从而允许紧接在操作650-5之后仅一次性地访问激活引擎。在一些示例中,操作650-4和650-6组合成单个操作。例如,如果操作650-4和650-6均执行类似操作,例如输入值与存储的常数之间的相加,则可在编译期间将两个存储的常数加在一起,并且可在运行时期间执行具有一个输入值的单个相加。作为另一示例,如果操作650-4和650-6均执行输入值与存储的常数之间的相乘,则可在编译期间将两个存储的常数相乘,并且可在运行时期间执行单个相乘。
图7示出跨多个执行引擎的高效管线的示例。图7中示出的示例可对应于参考图6B所描述的重新排序的操作或对应于不同的一组操作。三个水平分道中的每一者对应于不同执行引擎,如参考图5所描述。
在示出的示例中,PE阵列可执行操作750-1并且可将输出数据写入到组0。接下来,PE阵列可执行操作750-5并且将输出数据写入到组1。同时,激活引擎可对来自操作750-1的输出数据执行操作750-2并将输出数据写入到组0。接下来,PE阵列可执行操作750-9并且将输出数据写入到组2。同时,激活引擎可对来自操作750-5的输出数据执行操作750-6并将输出数据写入到组1。同时,池化引擎可对来自操作750-2的输出数据执行操作750-3并将输出数据写入到组0。
以此方式,管线是高效的,因为写入到每个组的操作序列如下:(1)PE阵列、(2)激活引擎、(3)池化引擎,后跟着(4)PE阵列。这允许以并排配置布置不同操作序列,并且没有执行引擎闲置。在操作750-3完成之后,组0变得可用,并且新的操作序列可在PE阵列处以操作750-4开始。尽管未在图7中示出,但操作750-4、750-8、750-12和750-16中的每一者后面可跟着由激活引擎执行的操作,然后是由池化引擎执行的操作。
图8示出各种操作850和其相关联存储器使用情况的示例。基于单个块的操作之间的类似存储器使用情况,将操作850分组为不同块(即,块A-E)。块A包含将输出数据写入到64个通道的单个操作850-1。块B包含写入到256个通道的操作850-2到850-4。块C包含写入到64个通道的操作850-5到850-8。块D包含写入到64个通道的操作850-9到850-11。块E包含写入到256个通道的操作850-12到850-16。
操作850可由编译器基于所述操作的存储器使用情况而分组成块。在一些示例中,编译器首先确定操作850中的每一者的存储器使用情况。接下来,编译器可将邻近并具有相同存储器使用情况的操作分组在一起。在一些示例中,编译器可使具有不同但类似的存储器使用情况(例如,彼此相差50%以内)的操作成组。在一些示例中,每个块可与所述块内部的每个操作的最大化存储器使用相关联。例如,块B的操作850-2到850-4可各自写入到256个通道,所述操作中仅两个操作可写入到256个通道,或所述操作中仅一个操作可写入到256个通道。
在一些示例中,操作850基于集体存储器使用情况而分组成块。例如,操作850-2可写入到128个通道,而操作850-3可写入到128个不同通道。在一些示例中,基于块中的最后一个操作的存储器使用情况将操作850分组成块。例如,操作850-4可甚至通过操作850-2和850-3写入到较少或较多通道而写入到256个通道。
编译器可通过基于每个块的存储器使用情况对块A-E进行重新排序而对操作850进行重新排序。编译器可标识一组分散分支,例如分散到块B和C中的块A,并且可确定与每个分支相关联的存储器使用情况。在一些示例中,编译器可将在含有较低存储器使用块(例如,块C和D)的分支之前执行含有较高存储器使用块(例如,块B)的分支标识为运行时低效情况。编译器可通过对块进行重新排序以使得含有较高存储器使用块的分支在含有较低存储器使用块的分支之后执行而解决或减少运行时低效情况。
图9A和9B示出对操作块进行重新排序以改善参考图8描述的操作850的存储器使用情况的示例。图9A示出在重新排序之前的执行次序902。如虚线所指示,可将块B移动到块C和D之后,使得块C和D中含有的操作在块B中含有的操作之前执行。图9B示出在重新排序之后的执行次序904。
图10A和10B示出由参考图9A和9B所描述的对操作重新排序而产生的改善的存储器使用情况的示例。图10A示出在不重新排序的情况下执行块A-E的存储器使用情况。在1002处,块A的操作写入到存储器装置的64个通道。在1004处,块B的操作写入到256个通道而不覆写块A的输出,因为块C需要块A的输出可用。在1006处,块C的操作写入到64个通道,覆写块A的输出。在1008处,块D的操作写入到64个通道,覆写块C的输出。在1010处,块E的操作写入到256个通道,覆写块D的输出并且部分覆写块B的输出。
图10B示出在重新排序之后执行块A-E的存储器使用情况。在1012处,块A的操作写入到存储器装置的64个通道。在1014处,块C的操作写入到64个通道而不覆写块A的输出,因为块B需要块A的输出可用。在块B之前执行块C会形成存储器节省1022。在1016处,块D的操作写入到64个通道,覆写块C的输出。在块B之前执行块D会形成存储器节省1024。在1018处,块B的操作写入到256个通道,覆写块A的输出。在1020处,块E的操作写入到256个通道,覆写块D的输出并且部分覆写块B的输出。
图11示出将神经网络的操作重新排序的方法1100。方法1100可应用于若干应用,并且可进一步对具有预定义次序的任何一组操作执行,而不仅对源于神经网络的操作执行。可按不同于示出的示例的次序执行方法1100的一个或多个步骤,并且在方法1100的执行期间可省略方法110的一个或多个步骤。
在步骤1102,编译器接收多个操作。在一些示例中,编译器可接收所述多个操作以作为神经网络的描述的部分。所述多个操作可对应于神经网络的一个或多个节点和/或一个或多个层。编译器可通过存储装置或通过存取处理器存储器中存储有用于所述多个操作的源代码的部分而接收所述多个操作。
在步骤1104,编译器确定多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。所述多个执行引擎可包含例如处理引擎(PE)或PE阵列、激活引擎、池化引擎等。在一些示例中,编译器事先将执行引擎分配给每个操作,并且在步骤1104,读取指示事先分配了哪一执行引擎的数据。在一些示例中,由编译器基于操作类型(例如,卷积、偏置相加、ReLU等)确定执行每个操作的执行引擎。在一些示例中,编译器读取与每个操作相关联的数据以确定哪一执行引擎将执行所述操作。
在步骤1106,编译器确定与所述多个操作中的每一者相关联的存储器使用情况。存储器使用情况可以是由操作的输出占用的内存量。存储器使用情况可以是最大内存量或平均内存量,以及其它可能情况。在一些示例中,编译器基于操作类型(例如,卷积、偏置相加、ReLU等)确定用于操作的存储器使用情况。在一些示例中,编译器读取与每个操作相关联的数据以确定与所述操作相关联的存储器使用情况。在一些示例中,编译器确定与操作的群组(例如,块)相关联的存储器使用情况。
在一些示例中,编译器确定所述多个操作中的每一者的硬件使用情况。在各种示例中,这可包含执行步骤1104、执行步骤1106或执行步骤1104和1106两者。
在步骤1108,编译器确定与所述多个操作相关联的执行次序。所述执行次序可指示将执行操作的(在由方法1100的执行产生的任何重新排序之前的)当前次序。编译器可通过确定在源代码中列出操作的次序、通过解析神经网络架构、通过读取与每个操作相关联的数据以及其它可能方式来确定所述多个操作的执行次序。
在步骤1110处,编译器基于与所述多个操作相关联的执行次序和/或与所述多个操作相关联的硬件使用情况来标识运行时低效情况。例如,运行时低效情况可基于所述多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。在一些示例中,运行时低效情况可基于与所述多个操作中的每一者相关联的存储器使用情况。
在一些示例中,标识运行时低效情况包含标识与所述多个操作和所述多个执行引擎相关联的各种预定模式。例如,标识运行时低效情况可包含标识由第一执行引擎(例如,激活引擎)执行的第一操作(例如,操作550-2),后跟着由第二执行引擎(例如,池化引擎)执行的第二操作(例如,操作550-3),后跟着由第一执行引擎执行的第三操作(例如,操作550-4)。可对第一操作的输出执行第二操作,并且可对第二操作的输出执行第三操作。所述预定模式还可包含由第三执行引擎(例如,PE阵列)执行的第四操作(例如,操作550-1)。第四操作的输出可用作第一操作的输入。此类模式可视为低效的,因为所述模式的多个实例要循序地执行就得使某些执行引擎在不同时间闲置,如图5中所示。
在一些示例中,标识运行时低效情况包含标识与所述多个操作相关联的各种存储器使用模式。例如,编译器可基于单个块的操作当中的类似存储器使用情况将多个操作分组成块。编译器可标识神经网络中一组分散分支。编译器可将在含有较低存储器使用块的分支之前执行含有较高存储器使用块的分支标识为运行时低效情况。
在步骤1112,编译器对所述多个操作中的特定操作重新排序以修改执行次序并解决或减少运行时低效情况。在一些情况下,编译器使用运行时低效情况查询数据库以确定如何解决或减少所述运行时低效情况。基于曾标识的具体运行时低效情况,数据库可提供指令,指示应如何重新排序特定操作(例如,应将所述特定操作前向或向后移动多少操作)。重新排序特定操作可包含修改哪一操作在所述特定操作之前和/或哪一操作在所述特定操作之后。因此,重新排序特定操作会改变所述特定操作的邻近操作中的至少一者。在一些示例中,所述多个操作中的两个操作的位置可调换。在一些示例中,可将操作移动并插入在先前彼此邻近的两个操作之间。
在一些示例中,运行时低效情况涉及在使用另一执行引擎之前将特定执行引擎使用了两次的标识的模式,这种情况下,编译器可通过将所述特定执行引擎执行的两个操作移动成相邻且任选地组合这两个操作来解决或减少所述运行时低效情况。
在一些示例中,运行时低效情况涉及在较低存储器使用块之前执行较高存储器使用块,这种情况下,编译器可通过对所述块进行重新排序以使得在含有较低存储器使用块的分支之后执行含有较高存储器使用块的分支而解决或减少所述运行时低效情况。
在步骤1114,编译器基于包含重新排序的操作的多个操作生成一组编译指令(例如,编译代码244)。所述一组编译指令可随后传送到执行引擎和/或传送到含有所述执行引擎的加速引擎(例如,加速引擎212)。
本文描述的模块可以是软件模块、硬件模块或其合适的组合。如果模块是软件模块,则模块可体现在非暂时性计算机可读介质上,并且由本文描述的任何计算机系统中的处理器处理。应注意,所描述的过程和架构可在任何用户交互之前实时或以异步模式执行。可按前文图中推荐的方式来配置模块,和/或本文所描述的功能可由作为单独模块存在的一个或多个模块提供,和/或本文所描述的模块功能可分散在多个模块上。
因此,应在说明性意义上而非限制性意义上看待说明书和附图。然而,显而易见的是,在不脱离权利要求中所阐述的本公开的更广泛精神和范围的情况下,可对其进行各种修改和改变。
其它变化在本公开的精神内。因此,虽然所公开的技术可接受各种修改和替代构造,但其某些说明的示例已在附图中示出且已在上文详细描述。然而,应理解,无意将本公开限制于所公开的特定形式,相反,意在涵盖落入所附权利要求中限定的本公开的精神和范围内的所有修改、替代构造和等同物。
除非本文另有说明或与上下文明显矛盾,否则在描述所公开示例的上下文中(尤其在所附权利要求书的上下文中)使用词语“一”和“所述”以及类似指示物应理解为涵盖单数以及复数。除非另有说明,否则术语“包括”、“具有”、“包含”和“含有”应理解为开放式术语(即,意指“包含但不限于”)。术语“连接”应理解为部分或全部地包含在内、附接到或接合在一起,即使是在存在中间物的情况下也是如此。除非本文中另有说明,否则本文中对值的范围的引述仅旨在用作个别地提及属于所述范围内的每个单独值的简写方法,并且每个单独值并入本说明书中,如同其在本文中个别地引用一样。除非本文另有说明或与上下文明显矛盾,否则本文所述的所有方法都可以任何合适的次序执行。除非另外声明,否则本文提供的任何和所有示例或示例性语言(例如,“例如”)的使用仅旨在更好地说明本公开的示例,而不对本公开的范围构成限制。本说明书中的任何语言都不应理解为指示任何未请求保护的要素对于实践本公开是必需的。
除非另有具体陈述,否则例如短语“X、Y或Z中的至少一者”等分离性语言既定在所使用的上下文内理解,一般表示项目、项等可以是X、Y或Z或其任何组合(例如X、Y和/或Z)。因此,此类分离性语言一般无意且不应暗示某些示例要求X中的至少一个、Y中的至少一个或Z中的至少一个各自都存在。
本文中描述本公开的各种示例,包含本发明人已知的用于执行本公开的最佳模式。在阅读前面的描述后,这些示例的变型对于所属领域的技术人员而言将变得显而易见。本发明人预期所属领域的技术人员在适当时使用此类变型,并且本发明人预期本公开以与本文具体描述的方式不同的方式来实践。因此,本公开包含适用法律所准许的随附权利要求书中所述的主题的所有修改和等同物。此外,除非本文另外指示或另外明显与上下文相矛盾,否则本公开涵盖上文所描述的要素呈其所有可能变化形式的任何组合。
如下所使用,对一系列示例的任何提及应理解为对那些示例中的每一者的分别提及(例如,“示例1-4”应理解为“示例1、2、3或4”)。
示例1是一种用于编译用于神经网络加速器的指令的计算机实施的方法,所述计算机实施的方法包括:由编译器接收包括多个操作的神经网络的描述;由所述编译器确定所述神经网络加速器中的多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者,所述多个执行引擎包含处理引擎、激活引擎和池化引擎;由所述编译器确定所述多个操作的执行次序;由所述编译器基于所述多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者以及标识所述多个操作的所述执行次序而标识运行时低效情况,其中标识所述运行时低效情况包含标识与所述多个操作和所述多个执行引擎相关的预定模式;由所述编译器对所述多个操作中的操作重新排序以创建修改后的执行次序并解决所述运行时低效情况;以及由所述编译器基于所述多个操作和所述修改后的执行次序而生成一组编译指令。
示例2是示例1的计算机实施的方法,其中标识所述运行时低效情况包含标识:由第一执行引擎执行的标量相加操作;由第二执行引擎执行的合并操作,其中所述合并操作在所述标量相加操作之后执行;以及由所述第一执行引擎执行的激活函数操作,其中所述激活函数操作在所述合并操作之后执行。
示例3是示例1-2的计算机实施的方法,其中对所述操作重新排序包含:将所述标量相加操作重新排序成在所述合并操作之后执行。
示例4是示例1-3的计算机实施的方法,其中对所述合并操作的输出执行重新排序的第一操作。
示例5是示例1-4的计算机实施的方法,其还包括:确定重新排序的标量相加操作是否可与所述激活函数操作组合;以及响应于确定重新排序的标量相加操作可与所述激活函数操作组合,将重新排序的标量相加操作与所述激活函数操作组合为组合操作。
示例6是一种方法,其包括:由编译器接收包括多个操作的神经网络的描述;确定所述多个操作的执行次序;确定所述多个操作中的每一者的硬件使用情况;基于所述执行次序和所述多个操作中的每一者的硬件使用情况来标识运行时低效情况;对所述多个操作中的操作进行重新排序以修改所述执行次序并减少运行时低效情况;以及基于所述多个操作生成一组编译指令,其中所述多个操作包含重新排序的操作。
示例7是示例6的方法,其中确定所述多个操作中的每一者的硬件使用情况包含:确定多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者,其中标识所述运行时低效情况还基于所述多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。
示例8是示例6-7的方法,其中标识运行时低效情况包含标识:由第一执行引擎执行的第一操作;由第二执行引擎执行的第二操作,其中所述第二操作在所述第一操作之后执行;由所述第一执行引擎执行的第三操作,其中所述第三操作在所述第二操作之后执行。
示例9是示例6-8的方法,其中标识运行时低效情况包含标识:由第三执行引擎执行的第四操作,其中所述第四操作在所述第一操作之前执行。
示例10是示例6-9的方法,其中:对所述第一操作的输出执行所述第二操作;对所述第二操作的输出执行所述第三操作。
示例11是示例6-10的方法,其中对操作重新排序包含:将所述第一操作重新排序成在所述第二操作之后执行。
示例12是示例6-11的方法,其中对所述第二操作的输出执行重新排序的第一操作。
示例13是示例6-12的方法,其中确定所述多个操作中的每一者的硬件使用情况包含:确定所述多个操作中的每一者的存储器使用情况,其中标识运行时低效情况还基于所述多个操作中的每一者的存储器使用情况。
示例14是一种包括指令的非暂时性计算机可读介质,所述指令在由处理器执行时使所述处理器执行包括以下各项的操作:由编译器接收包括多个操作的神经网络的描述;确定所述多个操作的执行次序;确定所述多个操作中的每一者的硬件使用情况;基于所述执行次序和所述多个操作中的每一者的所述硬件使用情况而标识运行时低效情况;对所述多个操作中的操作重新排序以修改所述执行次序并减少所述运行时低效情况;以及基于所述多个操作生成一组编译指令,其中所述多个操作包含重新排序的所述操作。
示例15是示例14的非暂时性计算机可读介质,其中确定所述多个操作的硬件使用情况包含:确定多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者,其中标识所述运行时低效情况还基于所述多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。
示例16是示例14-15的非暂时性计算机可读介质,其中标识所述运行时低效情况包含标识:由第一执行引擎执行的第一操作;由第二执行引擎执行的第二操作,其中所述第二操作在所述第一操作之后执行;以及由所述第一执行引擎执行的第三操作,其中所述第三操作在所述第二操作之后执行。
示例17是示例14-16的非暂时性计算机可读介质,其中标识所述运行时低效情况包含标识:由第三执行引擎执行的第四操作,其中所述第四操作在所述第一操作之前执行。
示例18是示例14-17的非暂时性计算机可读介质,其中对操作重新排序包含:将所述第一操作重新排序成在所述第二操作之后执行。
示例19是示例14-18的非暂时性计算机可读介质,其中对所述第二操作的输出执行重新排序的所述第一操作。
示例20是示例14-19的非暂时性计算机可读介质,其中确定所述多个操作的硬件使用情况包含:确定所述多个操作中的每一者的存储器使用情况,其中标识所述运行时低效情况还基于所述多个操作中的每一者的存储器使用情况。
示例21是一种系统,其包括处理器以及计算机可读介质,所述计算机可读介质包括指令,所述指令在由所述处理器执行时使所述处理器执行包括以下各项的操作:由编译器接收包括多个操作的神经网络的描述;确定所述多个操作的执行次序;确定所述多个操作中的每一者的硬件使用情况;基于所述执行次序和所述多个操作中的每一者的所述硬件使用情况而标识运行时低效情况;对所述多个操作中的操作重新排序以修改所述执行次序并减少所述运行时低效情况;以及基于所述多个操作生成一组编译指令,其中所述多个操作包含重新排序的所述操作。
示例22是示例21的系统,其中确定所述多个操作中的每一者的硬件使用情况包含:确定多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者,其中标识所述运行时低效情况还基于所述多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。
示例23是示例21-22的系统,其中标识所述运行时低效情况包含标识:由第一执行引擎执行的第一操作;由第二执行引擎执行的第二操作,其中所述第二操作在所述第一操作之后执行;以及由所述第一执行引擎执行的第三操作,其中所述第三操作在所述第二操作之后执行。
示例24是示例21-23的系统,其中标识所述运行时低效情况包含标识:由第三执行引擎执行的第四操作,其中所述第四操作在所述第一操作之前执行。
示例25是示例21-24的系统,其中对所述第一操作的输出执行所述第二操作;并且对所述第二操作的输出执行所述第三操作。
示例26是示例21-25的系统,其中对操作重新排序包含:将所述第一操作重新排序成在所述第二操作之后执行。
示例27是示例21-26的系统,其中对所述第二操作的输出执行重新排序的所述第一操作。
示例28是示例21-27的系统,其中确定所述多个操作中的每一者的硬件使用情况包含:确定所述多个操作中的每一者的存储器使用情况,其中标识所述运行时低效情况还基于所述多个操作中的每一者的存储器使用情况。

Claims (15)

1.一种方法,其包括:
由编译器接收包括多个操作的神经网络的描述;
确定所述多个操作的执行次序;
确定所述多个操作中的每一者的硬件使用情况;
基于所述执行次序和所述多个操作中的每一者的所述硬件使用情况而标识运行时低效情况;
对所述多个操作中的操作重新排序以修改所述执行次序并减少所述运行时低效情况;以及
基于所述多个操作生成一组编译指令,其中所述多个操作包含重新排序的所述操作。
2.根据权利要求1所述的方法,其中确定所述多个操作中的每一者的所述硬件使用情况包含:
确定多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者,其中标识所述运行时低效情况还基于所述多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。
3.根据权利要求1至2中任一项所述的方法,其中标识所述运行时低效情况包含标识:
由第一执行引擎执行的第一操作;
由第二执行引擎执行的第二操作,其中所述第二操作在所述第一操作之后执行;以及
由所述第一执行引擎执行的第三操作,其中所述第三操作在所述第二操作之后执行。
4.根据权利要求1至3中任一项所述的方法,其中标识所述运行时低效情况包含标识:
由第三执行引擎执行的第四操作,其中所述第四操作在所述第一操作之前执行。
5.根据权利要求1至4中任一项所述的方法,其中:
对所述第一操作的输出执行所述第二操作;以及
对所述第二操作的输出执行所述第三操作。
6.根据权利要求1至5中任一项所述的方法,其中对所述操作重新排序包含:
将所述第一操作重新排序成在所述第二操作之后执行。
7.根据权利要求1至6中任一项所述的方法,其中对所述第二操作的输出执行重新排序的所述第一操作。
8.根据权利要求1至7中任一项所述的方法,其中确定所述多个操作中的每一者的所述硬件使用情况包含:
确定所述多个操作中的每一者的存储器使用情况,其中标识所述运行时低效情况还基于所述多个操作中的每一者的所述存储器使用情况。
9.一种包括指令的非暂时性计算机可读介质,所述指令在由处理器执行时使所述处理器执行包括以下各项的操作:
由编译器接收包括多个操作的神经网络的描述;
确定所述多个操作的执行次序;
确定所述多个操作中的每一者的硬件使用情况;
基于所述执行次序和所述多个操作中的每一者的所述硬件使用情况而标识运行时低效情况;
对所述多个操作中的操作重新排序以修改所述执行次序并减少所述运行时低效情况;以及
基于所述多个操作生成一组编译指令,其中所述多个操作包含重新排序的所述操作。
10.根据权利要求9所述的非暂时性计算机可读介质,其中确定所述多个操作的所述硬件使用情况包含:
确定多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者,其中标识所述运行时低效情况还基于所述多个执行引擎中的哪一执行引擎将执行所述多个操作中的每一者。
11.根据权利要求9至10中任一项所述的非暂时性计算机可读介质,其中标识所述运行时低效情况包含标识:
由第一执行引擎执行的第一操作;
由第二执行引擎执行的第二操作,其中所述第二操作在所述第一操作之后执行;以及
由所述第一执行引擎执行的第三操作,其中所述第三操作在所述第二操作之后执行。
12.根据权利要求9至11中任一项所述的非暂时性计算机可读介质,其中标识所述运行时低效情况包含标识:
由第三执行引擎执行的第四操作,其中所述第四操作在所述第一操作之前执行。
13.根据权利要求9至12中任一项所述的非暂时性计算机可读介质,其中对所述操作重新排序包含:
将所述第一操作重新排序成在所述第二操作之后执行。
14.根据权利要求9至13中任一项所述的非暂时性计算机可读介质,其中对所述第二操作的输出执行重新排序的所述第一操作。
15.一种系统,其包括:
处理器;以及
包括指令的计算机可读介质,所述指令在由所述处理器执行时使所述处理器执行包括以下各项的操作:
由编译器接收包括多个操作的神经网络的描述;
确定所述多个操作的执行次序;
确定所述多个操作中的每一者的硬件使用情况;
基于所述执行次序和所述多个操作中的每一者的所述硬件使用情况而标识运行时低效情况;
对所述多个操作中的操作重新排序以修改所述执行次序并减少所述运行时低效情况;以及
基于所述多个操作生成一组编译指令,其中所述多个操作包含重新排序的所述操作。
CN202080045187.0A 2019-06-26 2020-06-11 用于并行执行的神经网络操作重新排序 Pending CN114026571A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/453,478 US11016775B2 (en) 2019-06-26 2019-06-26 Neural network operation reordering for parallel execution
US16/453,478 2019-06-26
PCT/US2020/037317 WO2020263587A1 (en) 2019-06-26 2020-06-11 Neural network operation reordering for parallel execution

Publications (1)

Publication Number Publication Date
CN114026571A true CN114026571A (zh) 2022-02-08

Family

ID=71409505

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202080045187.0A Pending CN114026571A (zh) 2019-06-26 2020-06-11 用于并行执行的神经网络操作重新排序

Country Status (4)

Country Link
US (2) US11016775B2 (zh)
CN (1) CN114026571A (zh)
DE (1) DE112020003055T5 (zh)
WO (1) WO2020263587A1 (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11016775B2 (en) * 2019-06-26 2021-05-25 Amazon Technologies, Inc. Neural network operation reordering for parallel execution
US11520371B2 (en) * 2020-02-10 2022-12-06 Northwestern University Compute-adaptive clock management for machine learning accelerators
US20240177048A1 (en) * 2022-11-17 2024-05-30 Qualcomm Incorporated Distributed machine learning compiler optimization

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4965724A (en) * 1987-03-05 1990-10-23 Oki Electric Industry Co., Ltd. Compiler system using reordering of microoperations to eliminate interlocked instructions for pipelined processing of assembler source program
US20050108687A1 (en) * 2003-11-18 2005-05-19 Mountain Highland M. Context and content sensitive distributed application acceleration framework
US7506331B2 (en) * 2004-08-30 2009-03-17 International Business Machines Corporation Method and apparatus for determining the profitability of expanding unpipelined instructions
US9019292B2 (en) * 2011-09-12 2015-04-28 Microsoft Technology Licensing Llc Reordering graph execution for processing optimization
US10699186B2 (en) 2015-12-02 2020-06-30 Google Llc Determining orders of execution of a neural network
US20180322386A1 (en) 2017-05-05 2018-11-08 Intel Corporation Fine-grain compute communication execution for deep learning frameworks
JP7074777B2 (ja) 2017-11-20 2022-05-24 シャンハイ カンブリコン インフォメーション テクノロジー カンパニー リミテッド タスク並列処理方法、装置、システム、記憶媒体およびコンピュータ機器
WO2019126793A2 (en) * 2017-12-22 2019-06-27 Alibaba Group Holding Limited A memory apparatus and method for controlling the same
US11016775B2 (en) * 2019-06-26 2021-05-25 Amazon Technologies, Inc. Neural network operation reordering for parallel execution
US11861337B2 (en) * 2020-08-26 2024-01-02 Micron Technology, Inc. Deep neural networks compiler for a trace-based accelerator

Also Published As

Publication number Publication date
US20200409717A1 (en) 2020-12-31
US20210247984A1 (en) 2021-08-12
US11567778B2 (en) 2023-01-31
WO2020263587A1 (en) 2020-12-30
US11016775B2 (en) 2021-05-25
DE112020003055T5 (de) 2022-08-18

Similar Documents

Publication Publication Date Title
US11741345B2 (en) Multi-memory on-chip computational network
Carneiro et al. Performance analysis of google colaboratory as a tool for accelerating deep learning applications
US10846621B2 (en) Fast context switching for computational networks
US20190180183A1 (en) On-chip computational network
CN111465943B (zh) 一种集成电路和用于神经网络处理的方法
US11567778B2 (en) Neural network operation reordering for parallel execution
US11144291B1 (en) Loop-oriented neural network compilation
US11741350B2 (en) Efficient utilization of processing element array
KR102038390B1 (ko) 고효율 병렬 처리를 위한 인공 신경망 모듈 및 이의 스케쥴링 방법
US20200387799A1 (en) Reducing computation in neural networks using self-modifying code
JP2023519565A (ja) 機械学習ジョブ中の改善されたメモリ圧縮転送のためのスパース性に基づく特徴の再順序付け
CN114008635A (zh) 神经网络逐层调试
US11461662B1 (en) Compilation time reduction for memory and compute bound neural networks
KR20220161339A (ko) 기계 학습 작업시 개선된 메모리 압축 전달을 위한 유사도에 기초한 특징 재정렬
CN113469354A (zh) 受存储器限制的神经网络训练
CN118043821A (zh) 混合稀疏压缩
US11782706B1 (en) Reconfigurable neural network processing based on subgraph recognition
US11809981B1 (en) Performing hardware operator fusion
US12008469B1 (en) Acceleration of neural networks with stacks of convolutional layers
US11775299B1 (en) Vector clocks for highly concurrent execution engines
US12008466B1 (en) Processor with control flow
LINH Hardware/software co-design for Neural Network trained by improved Particle Swarm Optimization
DANG Hardware/software co-design for Neural Network t
Alwani Fused Convolutional Neural Network Accelerators

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