CN118227516A - 在处理单元处对值阵列执行运算 - Google Patents

在处理单元处对值阵列执行运算 Download PDF

Info

Publication number
CN118227516A
CN118227516A CN202311759264.0A CN202311759264A CN118227516A CN 118227516 A CN118227516 A CN 118227516A CN 202311759264 A CN202311759264 A CN 202311759264A CN 118227516 A CN118227516 A CN 118227516A
Authority
CN
China
Prior art keywords
values
thread
value
dimensional
memory
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
CN202311759264.0A
Other languages
English (en)
Inventor
S·塞法尔瓦伊
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.)
Imagination Technologies Ltd
Original Assignee
Imagination Technologies 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 Imagination Technologies Ltd filed Critical Imagination Technologies Ltd
Publication of CN118227516A publication Critical patent/CN118227516A/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/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0207Addressing or allocation; Relocation with multidimensional access, e.g. row/column, matrix
    • 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/30105Register structure
    • G06F9/30109Register structure having multiple operands in a single register
    • 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/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3888Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple threads [SIMT] in parallel

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Mathematical Physics (AREA)
  • Image Processing (AREA)
  • Image Input (AREA)

Abstract

本申请涉及在处理单元处对值阵列执行运算。一种在处理单元处对值阵列执行运算的计算机实现的方法,方法包括:为了执行运算的阶段:对于值阵列的一个或多个一维值序列中的每个一维值序列:将一维值序列的相应值区段分配给多个线程中的每个线程;以及多个线程中的第一线程:确定从分配给第一线程的值区段到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的所述阶段的至少一个贡献;以及将至少一个贡献写入到存储器;以及多个线程中的所述第二线程:从存储器中读取所述至少一个贡献;以及根据从存储器中读取的至少一个贡献来完成针对分配给第二线程的相邻值区段的运算的阶段,以便生成处理值区段。

Description

在处理单元处对值阵列执行运算
相关申请的交叉引用
本申请要求2022年12月21日提交的英国专利申请2219374.2的优先权,该英国专利申请以全文引用方式并入本文中。本申请还要求2022年12月21日提交的英国专利申请2219375.9的优先权,该英国专利申请以全文引用方式并入本文中。
技术领域
本公开涉及在处理单元处对值阵列执行运算。
背景技术
图1A示出了示例图形处理单元(GPU)100和全局存储器108。待由GPU执行的工作可以布置成“工作组”、“线程束(warp)”和“线程”。工作组可以包括一个或多个线程束。线程束可以包括多个线程,其中该多个线程可以在GPU 100的单个核102处被并行处理。
GPU 100可以对值阵列执行运算。图2示出了示例运算。在图2中,该运算是一维高斯(Gaussian)滤波运算,其中根据包括待滤波的值204以及在该值204的任一侧上的三个值的值的一维内核202来对值204进行滤波。通过对内核202中的值进行加权求和来确定针对值204的滤波输出。根据以待滤波的值204为中心的高斯函数200来确定针对内核202中的每个值的相应权重。
可分离二维高斯滤波运算可以通过以下运算来实现:执行初始阶段,其中在二维值阵列的每一行上水平地执行一维高斯滤波运算;随后执行后一阶段,其中沿水平滤波的二维值阵列的每一列竖直地执行相同一维高斯滤波运算——或者反之亦然(即,竖直地执行,随后水平地执行)。
在一种简单方法中,可以通过将待滤波的值阵列的每个值分配给线程进行处理来对值阵列执行可分离二维高斯滤波运算的阶段。作为说明性示例,考虑待对包括1024个值的二维值阵列(例如布置为32×32的值阵列)执行的可分离二维高斯滤波运算。在此示例中,为了执行该运算的初始(例如水平)阶段,可以将该1024个值中的每个值分配给1024个线程中的相应线程。为了对每个值进行滤波,每个线程可以从全局存储器108中读取包括在用于对该值进行滤波的一维滤波器内核中的值中的所有值(例如待滤波的值以及在该值的任一侧上的三个值)。每个线程随后可以通过对内核中的值执行加权求和来针对其值生成经滤波的值,并且将该经滤波的值写回到全局存储器108,使得全局存储器108针对二维值阵列的每个值存储经一次滤波(例如水平滤波)的值。为了执行该运算的后一(例如竖直)阶段,可以将该1024个经一次滤波的值中的每个经一次滤波的值分配给1024个线程中的相应线程。为了对每个经一次滤波的值进一步滤波,每个线程可以从全局存储器108中读取包括在用于对该经一次滤波的值进一步滤波的一维滤波器内核中的经一次滤波的值中的所有经一次滤波的值(例如待进一步滤波的经一次滤波的值以及在该值的任一侧上的三个经一次滤波的值)。在后一(例如竖直)阶段中使用的一维滤波器内核垂直于在初始(例如水平)阶段中使用的一维滤波器内核。每个线程随后可以通过对内核中的经一次滤波的值执行加权求和来针对其经一次滤波的值生成经进一步滤波的值,并且将该经进一步滤波的值写回到全局存储器108,使得全局存储器108针对二维值阵列的每个值存储经进一步滤波(例如水平滤波和竖直滤波)的值。
以此方式在图形处理单元100上执行可分离二维高斯滤波运算相对较慢,因为这涉及对全局存储器108执行两组读取和两组写入。此外,在可分离滤波运算的每个阶段中,将每个值从存储器中读取多次(例如在上文给出的示例中读取七次)。这是因为,在每个阶段中,由被分配为对该值进行滤波的线程从存储器(例如全局存储器108)中读取每个值,并且还由被分配为使用包括该值的滤波器内核对其他值进行滤波的线程中的每个线程从存储器(例如在从全局存储器108中读取之后该值被写入的高速缓冲存储器)中读取每个值。
发明内容
提供本发明内容是为了以简化形式介绍下文在具体实施方式中进一步描述的一系列概念。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用以限制所要求保护的主题的范围。
根据本发明的第一方面,提供了一种在处理单元处对值阵列执行运算的计算机实现的方法,所述方法包括:为了执行运算的阶段:对于值阵列的一个或多个一维值序列中的每个一维值序列:将一维值序列的相应值区段分配给多个线程中的每个线程;以及多个线程中的第一线程:确定从分配给第一线程的值区段到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献;以及将至少一个贡献写入到存储器;以及多个线程中的第二线程:从存储器中读取至少一个贡献;以及根据从存储器中读取的至少一个贡献来完成针对分配给第二线程的相邻值区段的运算的阶段,以便生成处理值区段。
多个线程中的第一线程可以对分配给第一线程的值区段的一个或多个值的至少一个集合执行运算的阶段的至少一部分,以便确定从一个或多个值的所述至少一个集合到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献。
多个线程中的第二线程可以:对分配给第二线程的相邻值区段的一个或多个值的至少一个集合执行运算的阶段的至少一部分,以便确定从相邻值区段的一个或多个值的所述至少一个集合到将由第一线程针对分配给第一线程的值区段完成的运算的阶段的至少一个贡献;以及将由第二线程确定的至少一个贡献写入到存储器;并且多个线程中的第一线程可以:从存储器中读取由第二线程确定的至少一个贡献;以及根据从存储器中读取的由第二线程确定的至少一个贡献来完成针对分配给第一线程的值区段的运算的阶段,以便生成处理值区段。
完成针对相邻值区段的运算的阶段可以包括:第二线程对分配给第二线程的相邻值区段的一个或多个值的至少一个集合执行运算的阶段的至少一部分,以便确定从相邻值区段的所述一个或多个值中的每个值到运算的阶段的至少一个贡献;以及将由第二线程针对相邻值区段确定的所述至少一个贡献与由第二线程从存储器中读取的至少一个贡献进行组合。
多个线程中的第一线程可以确定分配给第一线程的值区段的一个或多个值,作为从分配给第一线程的值区段到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献。
多个线程中的第二线程可以:确定分配给第二线程的相邻值区段的一个或多个值,作为从分配给第二线程的相邻值区段到将由第一线程针对分配给第一线程的值区段完成的运算的阶段的至少一个贡献;以及将由第二线程确定的至少一个贡献写入到存储器;并且多个线程中的第一线程可以:从存储器中读取由第二线程确定的至少一个贡献;以及根据从存储器中读取的由第二线程确定的至少一个贡献来完成针对分配给第一线程的值区段的运算的阶段,以便生成处理值区段。
完成针对相邻值区段的运算的阶段可以包括:第二线程使用分配给第二线程的相邻值区段的值以及从存储器中读取的至少一个贡献,对分配给第二线程的相邻值区段的值执行运算的阶段,以便生成处理值区段。
多个线程可以由处理单元的核所包括的处理逻辑来处理,所述处理逻辑可以在芯片上实现,并且存储器在物理上与处理逻辑位于同一芯片上。
多个线程中的每个线程可以从另一存储器中读取分配给所述线程的值区段的值,所述另一存储器并在物理上与核不位于同一芯片上。
值阵列可以是像素值阵列、音频信号的音频样本阵列或传输信号的信号样本阵列。
值阵列可以是二维像素值阵列,并且所述运算可以是可分离滤波运算。
在可分离滤波运算的阶段期间,一维值序列的值可以根据一维滤波器内核来滤波,所述一维滤波器内核包括待滤波的值以及定位在所述值的一侧或两侧上的值序列的一个或多个值。滤波器内核的半径可以小于或等于每个值区段中的值的数量的一半。
可分离滤波运算可以是可分离高斯滤波运算或可分离盒式滤波运算。
值阵列的一维值序列可以是值阵列的一行值;或者值阵列的一维值序列可以是值阵列的一列值。
由多个线程生成的处理值区段可以被写入到存储器,使得处理值被写入到对应于值阵列的每个值的存储器。
运算的所述阶段可以是运算的初始阶段,值阵列可以是二维值阵列,所述运算可以是可分离运算,并且所述方法还可以包括:为了执行运算的后一阶段:对于二维值阵列的一个或多个垂直一维值序列中的每个垂直一维值序列:向多个线程中的每个线程分配来自存储器的相应多个处理值,所述多个处理值对应于二维值阵列的垂直一维值序列的一维值区段;以及多个线程中的第一线程:确定从分配给第一线程的多个处理值到将由多个线程中的第二线程针对多个处理值完成的运算的后一阶段的至少一个贡献,所述多个处理值与二维值阵列的垂直一维值序列的一维值区段对应,所述一维值区段与垂直一维值序列的对应于分配给第一线程的多个处理值的一维值区段相邻;以及将由第一线程确定的至少一个贡献写入到存储器;以及多个线程中的第二线程:从存储器中读取由第一线程确定的至少一个贡献;以及根据由第一线程确定的至少一个贡献来完成针对分配给第二线程的多个处理值的可分离运算的后一阶段,以便生成输出值区段。
多个线程中的第一线程可以对分配给第一线程的多个处理值中的一个或多个值的至少一个集合执行可分离运算的后一阶段的至少一部分,以便确定从一个或多个值的所述至少一个集合到将由多个线程中的第二线程针对多个处理值完成的运算的后一阶段的至少一个贡献,所述多个处理值与二维值阵列的垂直一维值序列的一维值区段对应,所述一维值区段与垂直一维值序列的对应于分配给第一线程的多个处理值的一维值区段相邻。
多个线程中的第一线程可以确定分配给第一线程的多个处理值的一个或多个值,作为从分配给第一线程的多个处理值到将由多个线程中的第二线程针对多个处理值完成的运算的后一阶段的至少一个贡献,所述多个处理值与二维值阵列的垂直一维值序列的一维值区段对应,所述一维值区段与垂直一维值序列的对应于分配给第一线程的多个处理值的一维值区段相邻。
二维值阵列的一维值序列是二维值阵列的一行值,并且二维值阵列的垂直一维值序列是二维值阵列的一列值;或者二维值阵列的一维值序列是二维值阵列的一列值,并且二维值阵列的垂直一维值序列是二维值阵列的一行值。
所述方法还可以包括:接收二维图像;将二维图像划分成多个重叠图块,每个图块包括二维像素值阵列;以及对每个图块的二维像素值阵列执行本文中描述的方法。
所述运算可以由处理单元的不同核对多个重叠图块中的每个图块的二维像素值阵列执行。
根据本发明的第二方面,提供了一种用于对值阵列执行运算的处理单元,所述处理单元包括处理逻辑和存储器,所述处理逻辑被配置成:为了执行运算的阶段:对于值阵列的一个或多个一维值序列中的每个一维值序列:将一维值序列的相应值区段分配给多个线程中的每个线程;以及由多个线程中的第一线程:确定从分配给第一线程的值区段到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献;以及将至少一个贡献写入到存储器;以及由多个线程中的第二线程:从存储器中读取至少一个贡献;以及根据从存储器中读取的至少一个贡献来完成针对分配给第二线程的相邻值区段的运算的阶段,以便生成处理值区段。
处理逻辑可以由处理单元的核构成,所述处理逻辑可以在芯片上实现,并且存储器在物理上与处理逻辑位于同一芯片上。
还可以提供一种在包括存储器的处理单元处对二维值阵列执行可分离运算的计算机实现的方法,所述存储器包括多个存储库,其中在每个写入或读取步骤中,每个存储库可以仅由一个相应线程写入或读取,所述方法包括:将二维值阵列划分成多个二维值子阵列;对于多个子阵列中的每个子阵列:使用多个线程对所述值子阵列执行可分离运算的初始阶段,以便针对所述值子阵列的每个值生成相应处理值;多个线程中的每个线程通过多个写入步骤将相应第一多个处理值写入到存储器,所述第一多个处理值对应于所述值子阵列的一维值序列;所述多个线程中的每个线程通过多个读取步骤从存储器中读取相应第二多个处理值,所述第二多个处理值对应于在值阵列内相对于所述值子阵列的转置位置中的值子阵列的垂直一维值序列;以及使用多个线程针对由多个线程读取的多个处理值执行可分离运算的后一阶段,以便针对转置位置中的值子阵列的每个值生成相应输出值;其中在多个写入步骤中的至少一个写入步骤中,将相应处理值写入到存储器的存储库中的每个存储库,并且在多个读取步骤中的至少一个读取步骤中,从存储器的存储库中的每个存储库中读取相应处理值。
还可以提供一种用于对二维值阵列执行可分离运算的处理单元,所述处理单元包括:存储器,所述存储器包括多个存储库,其中所述存储器被配置成使得在每个写入或读取步骤中,每个存储库可以仅由一个相应线程写入或读取;以及处理逻辑,所述处理逻辑被配置成:将二维值阵列划分成多个二维值子阵列;对于多个子阵列中的每个子阵列:使用多个线程对所述值子阵列执行可分离运算的初始阶段,以便针对所述值子阵列的每个值生成相应处理值;使用多个线程中的每个线程,通过多个写入步骤将相应第一多个处理值写入到存储器,所述第一多个处理值对应于所述值子阵列的一维值序列;使用所述多个线程中的每个线程,通过多个读取步骤从存储器中读取相应第二多个处理值,所述第二多个处理值对应于在值阵列内相对于所述值子阵列的转置位置中的值子阵列的垂直一维值序列;以及使用多个线程针对由多个线程读取的多个处理值执行可分离运算的后一阶段,以便针对转置位置中的值子阵列的每个值生成相应输出值;其中在多个写入步骤中的至少一个写入步骤中,将相应处理值写入到存储器的存储库中的每个存储库,并且在多个读取步骤中的至少一个读取步骤中,从存储器的存储库中的每个存储库中读取相应处理值。
如在本文中的示例中的任何示例中所描述的处理单元可以在集成电路上的硬件中体现。可以提供一种在集成电路制造系统处制造如本文中的示例中的任何示例中所描述的处理单元的方法。可以提供一种集成电路定义数据集,当在集成电路制造系统中被处理时,所述集成电路定义数据集将所述系统配置成制造如本文中的示例中的任何示例中所描述的处理单元。可以提供一种非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质上存储有如本文中的示例中的任何示例中所描述的处理单元的计算机可读描述,当在集成电路制造系统中被处理时,所述计算机可读描述使得集成电路制造系统制造体现处理单元的集成电路。
可以提供一种集成电路制造系统,所述集成电路制造系统包括:非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质上存储有如本文中的示例中的任何示例中所描述的处理单元的计算机可读描述;布局处理系统,所述布局处理系统被配置成处理计算机可读描述以便生成体现处理单元的集成电路的电路布局描述;以及集成电路生成系统,所述集成电路生成系统被配置成根据电路布局描述来制造处理单元。
可以提供用于执行本文中描述的方法中的任何方法的计算机程序代码。可以提供一种非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质上存储有计算机可读指令,所述计算机可读指令在于计算机系统处被执行时使得所述计算机系统执行本文中描述的方法中的任何方法。
如对本领域技术人员将显而易见,上述特征可以适当地组合,并且可与本文所描述的示例的各方面中的任一方面进行组合。
附图说明
现在将参考附图详细描述示例,在附图中:
图1A示出了示例图形处理单元(GPU)和存储器。
图1B示出了可由处理逻辑访问的示例存储器层级。
图2示出了示例运算。
图3示出了划分成多个重叠图块的示例图像。
图4示出了值区段向多个线程的示例分配。
图5示出了一维值序列。
图6示出了覆盖在一维值序列上的示例滤波器内核。
图7a至图7c示出了从值区段的值到将针对相邻值区段完成的运算的阶段的示例贡献。
在示例中,图8示出了在运算的后一阶段中分配的多个处理值所对应的值区段。
图9示出了垂直一维值序列。
图10示出了根据本文中描述的原理在处理单元处对值阵列执行运算的方法。
图11示出了包括多个存储库的示例存储器。
图12A和图12B示出了存储器中的处理值。
图13示出了根据本文中描述的原理在包括存储器的处理单元处对二维值阵列执行可分离运算的方法。
图14示出了划分成多个值子阵列的值阵列。
图15A至图15D示出了存储器中的处理值和填充。
图16示出了在其中实现处理单元的计算机系统;并且
图17示出了用于生成体现处理单元的集成电路的集成电路制造系统。
附图示出了各种示例。技术人员将了解,附图中所示出的元件边界(例如框、框的组,或其他形状)表示边界的一个示例。在一些示例中,情况可能是一个元件可以被设计为多个元件,或者多个元件可以被设计为一个元件。在适当的情况下,贯穿各附图使用共同的附图标记来指示类似的特征。
具体实施方式
借助于示例呈现以下描述,以使得本领域技术人员能够制造和使用本发明。本发明不限于本文所描述的实施方案,并且对所公开的实施方案的各种修改对于本领域技术人员而言将是显而易见的。
现在将仅借助于示例来描述实施方案。
图1A示出了示例图形处理单元(GPU)100和存储器108。图形处理单元100在本文中被描述为能够(例如被配置成执行)并行处理的处理单元的示例。应理解,本文中描述的原理也可以应用于能够(例如被配置成执行)并行处理的任何其他合适类型的处理单元——诸如数字信号处理单元(例如DSP);或者能够并行处理的合适类型的中央处理单元(CPU)。
图形处理单元100可以具有任何合适的架构。图形处理单元100可运算以执行任何种类的图形、图像或视频处理、通用处理以及/或者任何另一类型的数据处理,诸如对通用计算任务(特别是容易并行化的任务)的处理。通用计算任务的示例包括信号处理、音频处理、计算机视觉、物理模拟、统计计算、神经网络和密码学。
图形处理单元通常包括一个或多个处理元件。在图1A中,图形处理单元100被示出为包括三个处理元件——标记为102-1、102-2和102-n。应理解,根据本文中描述的原理配置的处理单元可以包括任何合适数量的处理元件。
每个处理元件102可以是图形处理单元100的不同核。每个处理元件102包括处理逻辑104和存储器106。也就是说,在图1A中:处理元件102-1包括处理逻辑104-1和存储器106-1;处理元件102-2包括处理逻辑104-2和存储器106-2;并且处理元件102-n包括处理逻辑104-n和存储器106-n。每个存储器106可用于由/供包括该存储器的处理元件102的处理逻辑104排他地存储数据。每个存储器106可以在物理上与包括该存储器的处理元件102的处理逻辑104位于同一芯片上(例如位于相同半导体管芯上以及/或者位于相同集成电路封装中)。由此,每个存储器106可以称为“本地存储器”、“片上存储器”或“内部存储器”。每个处理元件102的处理逻辑104可以能够访问其本地存储器106,而不消耗存储器108的存储器带宽。也就是说,相对于存储器108的存储容量,每个本地存储器106可以具有较小存储容量,例如60kB(千字节)。
每个处理元件102的处理逻辑104也可以例如通过系统总线来访问存储器108。图形处理单元100可以在芯片(例如半导体管芯和/或集成电路封装)上实现,并且存储器108可以不在物理上位于与图形处理单元100相同的芯片(例如半导体管芯和/或集成电路封装)上。由此,存储器108可以称为“片外存储器”和/或“外部存储器”。存储器108也可用于存储针对系统的实现图形处理单元的其他处理单元(例如中央处理单元(CPU——图1A中未示出))的数据,并且因此也可以称为“系统存储器”和/或“全局存储器”。存储器108可以是动态随机访问存储器(例如DRAM)。相对于每个本地存储器106的存储容量,全局存储器108可以具有较大存储容量,例如10GB(千兆字节)。也就是说,与和处理逻辑104从其本地存储器106读取/向该本地存储器写入相关联的时延相比,与处理逻辑104从全局存储器108读取/向该全局存储器写入相关联的时延可能更大(例如显著更大)。
如本文中进一步详细地描述,每个处理元件102的处理逻辑104也可以访问其他类型的存储器(例如高速缓存、寄存器或任何另一合适类型的存储器——为了易于说明,在图1A中未示出)。
由能够(例如被配置成执行)并行处理的处理单元执行的工作可以布置成所谓的“工作组”、“线程束”和“线程”。工作组可以包括一个或多个线程束。线程束可以包括多个线程,其中该多个线程可以被并行处理(例如在图形处理单元的单个核处)。在工作组包括多于一个线程束的示例中,那些线程束中的每个线程束可以在图形处理单元的单个核处被串行处理。工作组可以被彼此独立地处理(例如在图形处理单元的不同核处被处理,或者在图形处理单元的单个核处被串行处理)。相同工作组内的线程(例如工作组的相同线程束内的线程,以及相同工作组的不同线程束内的线程)可以能够在它们的处理期间共享对专用于处理那些线程的处理单元的处理元件(例如核)的存储器(例如专用于处理那些线程的处理逻辑104的本地存储器106)的访问。也就是说,相同线程束内的线程可以能够在它们的处理期间共享对专用于处理那些线程的处理单元的处理元件(例如核)的存储器(例如专用于处理那些线程的处理逻辑104的本地存储器106)的访问。此外,相同工作组内的线程束可以能够在它们的处理期间共享对专用于处理那些线程的处理单元的处理元件(例如核)的存储器(例如专用于处理那些线程束的处理逻辑104的本地存储器106)的访问。相比之下,不同工作组可能不能够在它们的处理期间共享对专用于处理单元的某个处理元件(例如核)的存储器的访问。
线程束可以布置为线程阵列(例如一维、二维或三维线程阵列)。线程束所包括的线程数量可能是有限的。对线程束所包括的线程数量的限制可能是由硬件限制造成的(例如对可在可用的处理硬件上并行处理多少线程的限制)。在示例中,线程束可以包括多达128个线程。在此示例中,如果多于128个线程将执行相同运算,则多于一个线程束将与该运算相关联。例如,如果2048个线程将执行相同运算,则十六个线程束可以与该运算相关联。该十六个线程束可以由相同工作组包括,或者可以在多个工作组(例如多达十六个不同工作组)之间进行划分。应理解,本文中使用的“工作组”、“线程束”和“线程”术语并不旨在为限制性的,并且可以使用另一术语来描述相同概念。例如,如本文中描述的“线程”可替代地被称为“调用”或“工作项目”,而如本文中描述的“工作组”可替代地被称为“线程块”或“线程组”。
图1B示出了可由处理元件102的处理逻辑104访问的示例存储器层级。在图1B中,为了易于说明,示出了与处理单元(例如图1A的处理单元100)的单个处理元件102相关联的存储器层级。应理解,处理单元(例如图1A的处理单元100)的每个处理元件102可以与和图1B中所示出的存储器层级等效的存储器层级相关联。
在图1B中,处理逻辑104、本地存储器106和全局存储器108具有与参考图1A描述的处理逻辑104、本地存储器106和全局存储器108相同的特性。图1B中还示出了处理元件102所包括的寄存器库110。寄存器库110包括多个寄存器(例如寄存器存储器)。相对于本地存储器106的存储容量,寄存器库110的每个寄存器具有较小存储容量,例如32位。也就是说,与处理逻辑104从寄存器库110读取/向该寄存器库写入相关联的时延可以小于与处理逻辑104从本地存储器106读取/向该本地存储器写入相关联的时延。寄存器库110可以在物理上与包括该存储器的处理元件102的处理逻辑104位于同一芯片上(例如位于相同半导体管芯上以及/或者位于相同集成电路封装中)。寄存器库110可以在物理上与包括该寄存器库的处理元件102的本地存储器106位于同一芯片上(例如位于相同半导体管芯上以及/或者位于相同集成电路封装中)。
当处理逻辑104处理包括多个线程的线程束时,寄存器库110的相应的一个或多个寄存器可以专用于该线程束的每个线程(例如可由该线程排他地访问)。也就是说,根据(例如“由”)线程处理的值可以存储在该线程可访问的一个或多个寄存器中。相同线程束内的其他线程可能不能够访问该线程可访问的一个或多个寄存器内的那些值。
例如,可以在处理元件102(例如处理单元的核)处处理包括多个线程(例如128个线程)的线程束,以便对值阵列(例如1024个值)执行运算。参考图1B,值阵列最初可以存储在全局存储器108中。线程束的每个线程可以被配置成对值阵列(例如1024个值)的一组值(例如8个值)执行运算。对可由线程处理的值的数量的限制可能是由每个线程可访问(例如专用于该线程)的寄存器库110中的寄存器存储量造成的。为了执行该运算,对于线程束的每个线程,处理逻辑104可以使得待由该线程处理的相应一组值(例如8个值)被从全局存储器108中读取到专用于该线程的一个或多个寄存器中。写入到专用于线程的一个或多个寄存器中的值可以由处理逻辑104根据该线程来处理。此后,通过将来自专用于每个线程的相应的一个或多个寄存器的那些处理值写入到全局存储器108中,可以从处理元件102输出处理值。替代地,如果将在处理元件102处对那些处理值执行进一步处理,则可以将那些值从专用于每个线程的相应的一个或多个寄存器写入到本地存储器106中。线程束内的多个线程可以共享对本地存储器106的访问。也就是说,线程束内的多个线程可以访问写入到本地存储器106中的处理值。由此,对于线程束的每个线程,处理逻辑104可以使得待由该线程进一步处理的相应一组处理值(例如8个处理值)被从本地存储器106中读取到专用于该线程的一个或多个寄存器中。写入到专用于线程的一个或多个寄存器中的处理值可以由处理逻辑104根据该线程来进一步处理。此后,通过将来自专用于每个线程的相应的一个或多个寄存器的那些进一步处理的值写入到全局存储器108中,可以从处理元件102输出进一步处理的值。替代地,可以以相同方式在处理元件102处执行再进一步的处理迭代。
诸如图形处理单元100的处理单元可以对值阵列(例如一维或多维值阵列)执行运算。在示例中,该值阵列的值可以是像素值、音频信号的音频样本、传输信号的信号样本或任何另一合适类型的值。
图2示出了示例运算。在图2中,该运算是一维高斯滤波运算,其中根据包括待滤波的值204以及在该值204的一侧或两侧上的一个或多个值的值的一维内核202来对值204进行滤波。一维高斯滤波运算可以使用包括奇数个值的滤波器内核202,中心值204是待滤波的值。在图2中,滤波器内核202是对称的。在图2中所示出的特定示例中,滤波器内核202包括七个值,包括待滤波的值204以及在该值204的任一侧上的三个值。在此示例中,可以说滤波器内核202具有三个值的半径r。也就是说,对于对称滤波器内核,可以说滤波器内核202的半径r是在待滤波的中心值的任一侧上的值的数量。应理解,在其他示例中,滤波器内核不必是对称的。也就是说,滤波器内核在待滤波的值的一侧上可以比在另一侧上包括更多的值)。
在一维高斯滤波运算中,可以通过执行对内核202中的值的加权求和来确定针对中心值204的滤波输出。可以根据以待滤波的值204为中心的高斯函数200来确定针对内核202中的每个值的相应权重。也就是说,如本领域技术人员将理解,根据高斯函数200,在加权求和中,与距待滤波的值204较近的值相比,距待滤波的值204较远的值将被加权得较低(例如具有较接近0的值)。
可以针对一维值序列的每个值执行图2中所示出的一维高斯滤波运算。也就是说,一维值序列中的每个值可以根据值的一维内核202来滤波,在该一维内核中,该值是待滤波的值。顺便一提,本领域技术人员将会知道用于对值序列的开始和结束处的值进行运算——诸如当待滤波的值是值序列中的第一值时——的许多不同的技术。在一个示例中,此边缘情况可以通过复制值序列中的第一值来解决,使得滤波器内核包括待滤波的值、在待滤波的值的一侧上的来自值序列的多个值,以及待滤波的值的在待滤波的值的另一侧上的多个副本。通常,在滤波期间应用“边缘情况技术”的值序列的开始和结束处的值的数量等于滤波器内核的半径r。本领域技术人员将会知道用于解决诸如这样的边缘情况的各种其他技术,并且因此为了简明起见,本文中将不进一步讨论这些技术。
在待运算的值阵列是一维值阵列(例如音频信号的音频样本序列,或者传输信号的信号样本序列)的示例中,对一维值序列中的每个值的该滤波的输出可以是一维高斯滤波运算的输出。在待运算的值阵列是多维值阵列(例如二维像素值阵列)的其他示例中,对一维值序列中的每个值的该滤波可以是可分离多阶段高斯滤波运算的第一阶段。如本领域技术人员将理解,可分离滤波运算是将多维运算分解成一系列较小维度滤波运算的运算。例如,可分离二维高斯滤波运算可以通过以下运算来实现:执行初始阶段,其中在二维值阵列的每一行上水平地执行(如图2中所示出的)一维高斯滤波运算;随后执行后一阶段,其中沿水平滤波的二维值阵列的每一列竖直地执行相同一维高斯滤波运算——或者反之亦然(即,竖直地执行,随后水平地执行)。可分离滤波运算通常用于处理图像(例如二维像素值阵列)。例如,可分离滤波运算可用于使图像模糊。
高斯滤波运算在本文中被描述为可对值阵列(例如一维或多维值阵列)执行的运算的示例。应理解,本文中描述的原理可以应用于可对一维或多维值阵列执行的其他类型的运算——例如盒式滤波运算、卷积运算、快速积分计算运算或任何另一合适类型的运算。如同一维高斯滤波运算一样,一维盒式滤波运算可以在一个阶段中作为对一维值阵列的一维运算来执行,或者在多个阶段中执行,以便实现对多维值阵列的可分离运算。在一维盒式滤波运算中,可以根据包括待滤波的值以及定位在该值的一侧或两侧上的一个或多个其他值的值的一维内核来对值进行滤波。针对待滤波的值的滤波输出可以通过地内核中的值求平均来确定。技术人员充分理解盒式滤波运算,并且因此为了简明起见,本文中将不进一步讨论盒式滤波运算。在卷积运算中,激活值阵列与系数(例如滤波器权重)阵列进行卷积(例如由该系数阵列进行滤波)——例如以便实现神经网络的所谓“卷积层”。技术人员充分理解卷积运算,并且因此为了简明起见,本文中将不讨论卷积运算。下文将进一步详细地讨论快速积分计算运算。
在一种简单方法中,可以通过将待滤波的值阵列的每个值分配给线程进行处理来对值阵列执行可分离二维高斯滤波运算的阶段。作为说明性示例,考虑待对包括1024个值的二维值阵列执行的可分离二维高斯滤波运算。在此示例中,为了执行该运算的初始(例如水平)阶段,可以将该1024个值中的每个值分配给1024个线程中的相应线程。为了对每个值进行滤波,处理每个线程的处理逻辑104可以将包括在用于对该值进行滤波的一维滤波器内核中的值中的所有值(即待滤波的值以及在该值的一侧或两侧上的一个或多个值)从全局存储器108中读取到该线程可访问的一个或多个寄存器中。处理每个线程的处理逻辑104随后可以通过以上文描述的方式对内核中的值执行加权求和来针对其值生成经滤波的值,并且将该经滤波的值写回到全局存储器108,使得全局存储器108针对二维值阵列的每个值存储经一次滤波(例如水平滤波)的值。为了执行该运算的后一(例如竖直)阶段,可以将该1024个经一次滤波的值中的每个经一次滤波的值分配给1024个线程中的相应线程。为了对每个经一次滤波的值进一步滤波,处理每个线程的处理逻辑104可以将包括在用于对该经一次滤波的值进一步滤波的一维滤波器内核中的经一次滤波的值中的所有经一次滤波的值(即待进一步滤波的经一次滤波的值以及在该值的一侧或两侧上的一个或多个经一次滤波的值)从全局存储器108中读取到该线程可访问的一个或多个寄存器中。在后一(例如竖直)阶段中使用的一维滤波器内核垂直于在初始(例如水平)阶段中使用的一维滤波器内核。处理每个线程的处理逻辑104随后可以通过以上文描述的方式对内核中的值执行加权求和来针对其经一次滤波的值生成经进一步滤波的值,并且将该经进一步滤波的值写回到全局存储器108,使得全局存储器108针对二维值阵列的每个值存储经进一步滤波(例如水平滤波和竖直滤波)的值。以此方式执行可分离二维高斯滤波运算相对较慢,因为这涉及对全局存储器108执行两组读取和两组写入——如上文所描述,该两组读取和两组写入中的每一者具有比从本地存储器106中读取/向该本地存储器写入大的相关时延。此外,每个值被从存储器中读取多次。这是因为,在每个阶段中,由处理被分配为对该值进行滤波的每个线程的处理逻辑104将每个值从存储器(例如全局存储器108)中读取到该线程可访问的一个或多个寄存器中,并且还由处理被分配为使用包括该值的滤波器内核对其他值进行滤波的线程中的每个线程的处理逻辑104将每个值从存储器(例如在从全局存储器108中读取之后该值被写入的高速缓冲存储器)中读取到那些线程中的每个线程可访问的一个或多个寄存器中。另外,此简单方法没有利用相同工作组内的线程在它们的处理期间共享对专用于处理那些线程的处理逻辑104的本地存储器106的访问的能力。
本文中参考图1A中所示出的图形处理单元100和图10中所示出的流程图描述了一种在处理单元100处对值阵列执行运算的计算机实现的方法。该方法可以利用如前一段落中所描述的简单方法来解决一个或多个问题。在下文中,主要参考说明性示例来描述该方法,其中值阵列是二维像素值阵列,并且该运算是可分离二维高斯滤波运算。
在此说明性示例中,针对图10中所示出的方法的输入是二维像素值阵列——诸如二维图像或二维图像的一部分(例如图块或块)。在示例中,该二维图像可以表示:静止图像;视频的一帧;三维场景的计算机生成的二维表示(例如,诸如使用路径或光线跟踪渲染的图像);或任何另一合适类型的图像。像素值可以表示其在图像内的相应像素的一个或多个特性。例如,像素值可以表示以下中的一者或多者:明亮度(luma)、明亮度(luminance)、色度(chroma)、色度(chrominance)、明度、光亮度、色调、饱和度、色度、任何颜色分量(例如红色、绿色或蓝色分量)或其相应像素的任何另一合适的特性。在其他示例中,像素值可以表示与其相应像素相关联的特性,诸如在深度图、法线图或表面纹理图(例如反照率图)或者其相应像素位置处的这些图的任何组合(例如逐元素乘积)中指示的特性。该输入可以存储在全局存储器108中。如本领域技术人员将理解,该输入可以由在实现图形处理单元100的计算机系统(图1A中未示出)处运行的应用程序(例如进程)写入到全局存储器108。
在所接收到的二维图像足够小的一些示例中,线程的一个线程束可以能够针对该二维图像的像素值中的所有像素值执行期望运算。这意味着处理单元100的一个处理元件102可以通过并行处理该线程束的线程来对该二维图像执行期望运算。借助于非限制性示例,线程束可以包括多达128个线程,每个线程能够完成多达八个像素值的期望运算。在此情况下,如果所接收到的二维图像包括1024个或更少的像素值,则该所接收到的二维图像可以被视为足够小。在这些示例中,整个二维图像可以作为二维像素值阵列输入到如图10中所示出的方法。
在其他示例中,可选地,所接收到的二维图像可以划分成多个重叠图块。图3示出了划分成多个重叠图块A至P的示例二维图像300。图块A与图块B之间的重叠被标记为302。图块A与图块E之间的重叠被标记为304。该多个重叠图块A至P中的每个图块包括相应二维像素值阵列。图块可以被大小设定成使得线程的一个线程束能够针对图块所包括的像素值中的所有像素值执行期望运算。这意味着处理单元100的处理元件102可以通过并行处理线程束的线程来对多个重叠图块中的一个重叠图块执行期望运算。借助于非限制性示例,线程束可以包括多达128个线程,每个线程能够完成多达八个像素值的期望运算。在此情况下,所接收到的二维图像可以划分成多个重叠图块,每个图块包括1024个或更少的像素值(例如每个图块具有32×32或更小的像素尺寸)。在这些示例中,每个重叠图块的二维像素值阵列可以输入到图10中所示出的方法。根据图10中所示出的方法,处理单元100的相应处理元件102可以独立地处理每个经适当大小设定的重叠图块的二维像素值阵列。
优选地,但可选地,重叠图块之间的重叠的宽度大于或等于将在对那些重叠图块中的每个重叠图块执行的滤波运算中使用的滤波器内核的半径r的两倍。例如,在图2中,滤波器内核具有三个值的半径r,并且因此待执行图2中所示出的运算的重叠图块之间的重叠的宽度应优选地为六个或更多个值。这是因为,如本文中所描述,在滤波期间应用“边缘情况技术”的值序列的开始和结束处的值的数量等于滤波器内核的半径r。因此,重叠图块之间的重叠的宽度优选地大于或等于滤波器内核的半径r的两倍,使得由该方法输出的经滤波的图像不需要包括已使用解决在图块的边缘处出现的边缘情况的技术进行滤波的图块重叠区域中的任何像素值。也就是说,继续本段落中较早开始的示例,当重叠图块A和B在滤波之后重新组合以形成经滤波的图像时,在滤波期间应用“边缘情况技术”的图块A中的每一行值的结束处的三个值可以由图块B中的每一行值的第四、第五和第六值替换,该第四、第五和第六值在不使用“边缘情况技术”的情况下进行滤波。类似地,在滤波期间应用“边缘情况技术”的图块B中的每一行值的开始处的三个值可以由图块A中的每一行值的倒数第四、第五和第六值替换,该倒数第四、第五和第六值在不使用“边缘情况技术”的情况下进行滤波。
回到图10,值阵列包括一个或多个一维值序列。例如,一维值阵列可以包括单个一维值序列(例如单行值或单列值)。如在说明性示例中,二维值阵列可以包括多个水平值序列(例如行)和多个竖直值序列(例如列)。
在说明性示例中,可分离二维高斯滤波运算的每个阶段涉及执行一维高斯滤波运算。为了执行该运算的阶段,在步骤S1002中,对于值阵列的一个或多个一维值序列中的每个一维值序列,将一维值序列的相应值区段分配给多个线程中的每个线程。该值区段可以为非重叠值区段。可以参考图4和图5——其示出了针对二维值阵列的一个或多个水平值序列(例如行)中的每个水平值序列执行的步骤S1002——来理解此步骤。应理解,可以替代地针对二维值阵列的一个或多个竖直值序列(例如列)中的每个竖直值序列执行步骤S1002。
图4示出了值区段向多个线程的示例分配。在图4中,值阵列400的每个一维值序列是值阵列400的一行值。在图4中,值阵列包括32行值。每一行值包括32个值。在本文中描述的示例中,每个线程可以能够完成多达八个值的期望运算。此限制可能是由每个线程可访问(例如专用于该线程)的寄存器库110中的寄存器存储量造成的——并且应理解,在其他示例中,每个线程可以能够针对不同数量的值(例如在一些示例中,多达100的任何合适数量的值,甚至更多的值)完成期望运算。在此示例中,每一行值划分成四个非重叠值区段,每个值区段包括八个值。该值区段中的每个值区段被分配给线程。在图4中,二维值阵列划分成128个值区段(即32行×每一行4个区段),每个值区段被分配给128个线程中的相应线程——在图4中被标记为T1至T128。如本文中所描述,在示例中,线程束可以包括多达128个线程。由此,在此示例中,处理单元100的一个处理元件102可以并行处理已被分配有值阵列的值的该128个线程。也就是说,待由处理单元100的处理元件102处理的一个线程束可以包括该128个线程(即图4中所示出的T1至T128)。
图5进一步详细地示出了一维值序列500。具体地说,图5示出了值阵列400的第一行值500。该一行值500已划分成四个区段,每个区段包括八个值。那些值区段已分别被分配给线程T1、T9、T17和T25。分配给线程T1的值区段与分配给线程T9的值区段相邻。分配给线程T9的值区段与分配给线程T1的值区段相邻,并且还与分配给线程T17的值区段相邻。分配给线程T17的值区段与分配给线程T9的值区段相邻,并且还与分配给线程T25的值区段相邻。分配给线程T25的值区段与分配给线程T17的值区段相邻。
应理解,可以替代地向每个线程分配多于一个值区段。也就是说,可以向线程分配来自多于一个一维值序列中的每个一维值序列的值区段。例如,线程可以能够完成多达八个值的期望运算,并且可以向该线程分配来自不同一维值序列(例如行)的两个值区段,每个值区段包括四个值。该一维值序列(例如行)在二维值阵列内可以是连续的——但情况不必如此。
在本文中描述的方法中,每个线程将完成针对该线程已被分配的值区段的值中的每个值的运算的阶段。为了实现这一点,首先,每个线程使得分配给该线程的值区段中包括的值中的每个值被从全局存储器108中读取到专用于该线程的寄存器库110中的一个或多个寄存器(例如“该线程的寄存器”)中。也就是说,参考图5,线程T1将其已从全局存储器108分配的区段中的值中的所有八个值读取到该线程的寄存器中,线程T9将其已从全局存储器108分配的区段中的值中的所有八个值读取到其寄存器中,线程T17将其已从全局存储器108分配的区段中的值中的所有八个值读取到其寄存器中,并且线程T25将其已从全局存储器108分配的区段中的值中的所有八个值读取到其寄存器中。在本文中描述线程从存储器读取/向该存储器写入的情况下,可以理解,正是该线程使得处理该线程的处理逻辑104执行向该存储器读取/从该存储器中写入。
如本文中所描述,在说明性示例中,可分离二维高斯滤波运算的每个阶段涉及执行一维高斯滤波运算。如图2中所示出,该一维高斯滤波运算使用包括七个值的滤波器内核,该七个值包括待滤波的值204以及在该值204的任一侧上的三个值。图6示出了覆盖在图5中所示出的一维值序列的某些值上的该滤波器内核的示例。如参考图6将理解,对于分配给每个线程的相应值区段的值中的一些值,该线程可以能够仅使用已读取到该线程可访问的一个或多个寄存器(例如“该线程的寄存器”)中的值区段的值来完成针对该值的一维高斯滤波运算。例如,在图6中,线程T1可以独立地完成针对值604-1的一维高斯滤波运算,因为滤波器内核602-1内的值中的所有值都已读取到该线程的寄存器中。换句话说,如本文中所描述,线程T1可以独立地计算滤波器内核602-1内的值中的所有值的加权和——因为该线程具有对该线程的寄存器内的那些值中的所有值的访问。也就是说,在另一示例中,线程T17不能独立地完成针对值604-2的一维高斯滤波运算,因为仅读取滤波器内核602-2内的值(即该值中的四个值)的子集已读取到线程T17可访问的一个或多个寄存器中。滤波器内核602-2中的其他三个值已读取到线程T9可访问的一个或多个寄存器中。换句话说,如本文中所描述,线程T9和线程T17都不可以独立地计算滤波器内核602-2内的值中的所有值的加权和——因为那些线程中无一者具有对该线程的寄存器内的那些值中的所有值的访问。由此,在此示例中,线程T9和T17必须协作以便完成针对值604-2的一维高斯滤波运算。下文中参考图7a至图7c和图10来描述两个线程协作以便完成针对某些值(诸如值604-2)的一维高斯滤波运算的方式。
运算的阶段1000的步骤在图10中示出。在步骤S1004中,多个线程中的第一线程确定从分配给第一线程的值区段到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献。在第一示例中,在步骤S1004中,多个线程中的第一线程可以对分配给第一线程的值区段的一个或多个值的至少一个集合执行运算的阶段的至少一部分,以便确定从一个或多个值的该至少一个集合到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献。在第二示例中,在步骤S1004中,多个线程中的第一线程可以确定分配给第一线程的值区段的一个或多个值,作为从分配给第一线程的值区段到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献。
参考图7a至图7c——其示出了从值区段的一个或多个值的集合到将针对相邻值区段完成的可分离高斯滤波运算的阶段的示例贡献——可以理解步骤S1004的第一示例。在图7a至图7c中,线程T9是“第一线程”,并且线程T17是“第二线程”。
图7a示出了来自图6的线程T9和T17可以如何协作以便完成针对值604-2的可分离高斯滤波运算的阶段。在图7a中,在步骤S1004的第一示例中,线程T9对该线程已被分配的值区段的三个值(例如第6值、第7值和第8值)的集合执行一维高斯滤波运算的一部分以便确定贡献708a。对这三个值执行高斯滤波运算的此部分涉及对这三个值执行加权求和。根据以待滤波的值604-2为中心的高斯函数的一部分700a来确定针对那三个值中的每个值的相应权重。
图7b示出了线程T9和T17可以如何协作以便完成针对值704-1的可分离高斯滤波运算的阶段。在图7b中,在步骤S1004的第一示例中,线程T9对该线程已被分配的值区段的两个值(例如第7值和第8值)的集合执行高斯滤波运算的一部分以便确定贡献708b。对这两个值执行高斯滤波运算的此部分涉及对这两个值执行加权求和。根据以待滤波的值704-1为中心的高斯函数的一部分700b来确定针对那两个值中的每个值的相应权重。
图7c示出了线程T9和T17可以如何协作以便完成针对值704-2的可分离高斯滤波运算的阶段。在图7c中,在步骤S1004的第一示例中,线程T9对该线程已被分配的值区段的一个值(例如第8值)的集合执行高斯滤波运算的一部分以便确定贡献708c。对此值执行高斯滤波运算的此部分涉及对该值进行加权。根据以待滤波的值704-2为中心的高斯函数的一部分700c来确定该值所乘的权重。
也就是说,在说明性示例的步骤S1004的第一示例中,线程T9确定从该线程已被分配的值区段的一个或多个值(例如(i)第6值、第7值和第8值,(ii)第7值和第8值,以及(iii)第8值)的三个集合到将由线程T17针对一维值序列的相邻值区段完成的运算的阶段的三个贡献708a、708b和708c。在此说明性示例中,在步骤S1004的第一示例中由第一线程确定的到将由第二线程完成的运算的阶段的贡献的数量可以等于滤波器内核的半径r。
应理解,在说明性示例的步骤S1004的第一示例中,以与参考图7a至图7c描述的方式类似的方式:线程T9也可以确定从该线程已被分配的值区段的一个或多个值(例如(i)第1值,(ii)第1值和第2值,以及(iii)第1值、第2值和第3值)的三个集合到(如图6中所示出)将由线程T1完成的运算的阶段的三个贡献(图7a至图7c中未示出);线程T17可以确定从该线程已被分配的值区段的一个或多个值(例如(i)第1值,(ii)第1值和第2值,以及(iii)第1值、第2值和第3值)的三个集合到将由线程T9完成的运算的阶段的三个贡献(图7a至图7c中未示出);并且线程T17可以确定从该线程已被分配的值区段的一个或多个值(例如(i)第6值、第7值和第第8值,(ii)第7值和第8值,以及(iii)第8值)的三个集合到(如图6中所示出)将由线程T25完成的运算的阶段的三个贡献(图7a至图7c中未示出)。换句话说,多个线程中的线程中的每个线程(例如图4中所示出的每个线程)可以通过执行参考图10的步骤S1004的第一示例描述的“第一线程”的动作,来确定到将由至少一个其他线程完成的运算的阶段的至少一个贡献。
参考图7a至图7c也可以理解步骤S1004的第二示例。如参考图7a至图7c将理解:分配给线程T9的值区段的第6值、第7值和第8值将贡献给将由线程T17针对值604-2完成的运算(见图7a);分配给线程T9的值区段的第7值和第8值将贡献给将由线程T17针对值704-1完成的运算(见图7b);并且分配给线程T9的值区段的第8值将贡献给将由线程T17针对值704-2执行的运算(见图7c)。因此,在步骤S1004的第二示例中,分配给线程T9的值区段的第6值、第7值和第8值可以被确定为到将由线程T17针对相邻值区段完成的运算的阶段的贡献。也就是说,在第二示例中,该贡献是未处理值。换句话说,在第二示例中,线程T9不执行步骤S1004中的运算的阶段的至少一部分——而是识别该线程已被分配的值区段的未处理值中的一个或多个未处理值,作为到将由线程T17针对相邻值区段完成的运算的阶段的贡献。线程T9可以根据将在运算期间使用的滤波器内核中待滤波的值的“左手侧”上的值的数量(例如在此示例中为三个值)来识别该线程已被分配的值区段内的值的数量,该值将贡献给将由线程T17完成的运算的阶段。以类似方式,参考图6:分配给线程T1的值区段的第6值、第7值和第8值可以被确定为到将由线程T9完成的运算的阶段的贡献;分配给线程T9的值区段的第1值、第2值和第3值可以被确定为到将由线程T1完成的运算的阶段的贡献;分配给线程T17的值区段的第1值、第2值和第3值可以被确定为到将由线程T9完成的运算的阶段的贡献;分配给线程T17的值区段的第6值、第7值和第8值可以被确定为到将由线程T25完成的运算的阶段的贡献;并且分配给线程T25的值区段的第1值、第2值和第3值可以被确定为到将由线程T17完成的运算的阶段的贡献。换句话说,多个线程中的线程中的每个线程(例如图4中所示出的每个线程)可以通过执行参考图10的步骤S1004的第二示例描述的“第一线程”的动作,来确定到将由至少一个其他线程完成的运算的阶段的至少一个贡献。
在步骤S1006中,第一线程将该线程已确定的至少一个贡献写入到存储器。具体地说,第一线程可以将至少一个贡献写入到本地存储器106。例如,参考图7a至图7c,在第一示例中,线程T9将贡献708a、708b和708c写入到本地存储器106。在第二示例中,线程T9将该线程已被分配的值区段的第6值、第7值和第8值写入到本地存储器106。在步骤S1006中,多个线程中的其他线程中的每个线程也可以将该线程在步骤S1004中确定的任何贡献写入到本地存储器106。如本文中所描述,线程束内的多个线程可以共享对本地存储器106的访问。
顺便一提,在运算的每个阶段中使用的滤波器内核的半径r小于或等于每个值区段中的值的数量的一半可能是有利的。这可能是有利的,因为这意味着在步骤S1004中由线程生成的贡献的数量不超过分配给该线程的值区段中的值的数量——这可以将在本地存储器106中存储贡献所需的存储器位置的数量限制为不超过在本地存储器106中存储值阵列的值所需的存储器位置的数量。如本文中所描述,相对于存储器108的存储容量,每个本地存储器106可以具有较小存储容量,例如60kB(千字节)——并且因此,限制本地存储器106中存储贡献所需的存储器位置的数量可能是有利的。
在步骤S1008中,第二线程从存储器中读取由第一线程确定的至少一个贡献。具体地说,第二线程可以从本地存储器106中读取至少一个贡献。如本文中所描述,线程束内的多个线程可以共享对本地存储器106的访问。第二线程可以使得至少一个贡献被读取到第二线程可访问的一个或多个寄存器中——使得该寄存器包括至少一个贡献以及分配给第二线程的相邻值区段的值。例如,参考图7a至图7c,在第一示例中,线程T17将贡献708a、708b和708c从本地存储器106中读取到该线程的寄存器中。在第二示例中,线程T17将分配给线程T9的值区段的第6值、第7值和第8值从本地存储器106中读取到该线程的寄存器中。在步骤S1008中,多个线程中的其他线程中的每个线程也可以将由被分配其相邻值区段的线程确定的任何贡献从本地存储器106中读取到该线程的寄存器中。
在步骤S1010中,第二线程根据从存储器中读取的至少一个贡献来完成针对分配给第二线程的相邻值区段的运算的阶段,以便生成处理值区段。
在第一示例中,在步骤S1010中,完成针对相邻值区段的运算的阶段可以包括:第二线程对分配给第二线程的相邻值区段的一个或多个值的至少一个集合执行运算的阶段的至少一部分,以便确定从相邻值区段的该一个或多个值中的每个值到运算的阶段的至少一个贡献;以及将由第二线程针对相邻值区段确定的该至少一个贡献与由第二线程从存储器中读取的至少一个贡献进行组合。参考图7a至图7c可以理解步骤S1010的此第一示例,其中线程T9是“第一线程”,并且线程T17是“第二线程”。
在图7a中,在步骤S1010的第一示例中,线程T17对该线程已被分配的值区段的四个值(例如第1值、第2值、第3值和第4值)的集合执行一维高斯滤波运算的一部分以便确定贡献712a,该值区段与分配给线程T9的值区段相邻。对这四个值执行高斯滤波运算的此部分涉及对这四个值执行加权求和。根据以待滤波的值604-2为中心的高斯函数的一部分710a来确定针对那三个值中的每个值的相应权重。随后,为了完成高斯滤波运算的阶段以便生成针对值604-2的处理值,线程T17将该线程从存储器中读取的贡献708a与该线程所确定的贡献712a进行组合(例如求和)。
在图7b中,在步骤S1010的第一示例中,线程T17对该线程已被分配的值区段的五个值(例如第1值、第2值、第3值、第4值和第5值)的集合执行高斯滤波运算的一部分以便确定贡献712b,该值区段与分配给线程T9的值区段相邻。对这五个值执行高斯滤波运算的此部分涉及对这五个值执行加权求和。根据以待滤波的值704-1为中心的高斯函数的一部分710b来确定针对那五个值中的每个值的相应权重。随后,为了完成高斯滤波运算的阶段以便生成针对值704-1的处理值,线程T17将该线程从存储器中读取的贡献708b与该线程所确定的贡献712b进行组合(例如求和)。
在图7c中,在步骤S1010的第一示例中,线程T17对该线程已被分配的值区段的六个值(例如第1值、第2值、第3值、第4值、第5值和第6值)的集合执行高斯滤波运算的一部分以便确定贡献712c,该值区段与分配给线程T9的值区段相邻。对这六个值执行高斯滤波运算的此部分涉及对这六个值执行加权求和。根据以待滤波的值704-2为中心的高斯函数的一部分710c来确定针对那六个值中的每个值的相应权重。随后,为了完成高斯滤波运算的阶段以便生成针对值704-2的处理值,线程T17将该线程从存储器中读取的贡献708c与该线程所确定的贡献712c进行组合(例如求和)。
在第一示例中,在步骤S1010中,线程T17可以(例如在不与另一线程协作的情况下)独立地完成高斯滤波运算的阶段,以便针对该线程已被分配的值区段中的第4值和第5值中的每一者生成相应处理值——因为以与参考图6描述的线程T1的值604-1类似的方式,线程T17具有对滤波器内核内的值中的所有值的访问,该滤波器内核用于对该线程的寄存器内的该第4值和第5值进行滤波。线程T17可以完成高斯滤波运算的阶段,以便以与参考图7a至图7c描述的该线程与线程T9的协作类似的方式,通过与线程T25协作来针对该线程已被分配的值区段中的第6值、第7值和第8值中的每一者生成相应处理值。由此,使用本文中描述的方法,在第一示例中,线程T17可以完成针对该线程已被分配的值区段的值中的每个值的高斯滤波运算的阶段,以便生成处理值区段。
在第二示例中,在步骤S1010中,完成针对相邻值区段的运算的阶段可以包括:第二线程使用分配给第二线程的相邻值区段的值以及从存储器中读取的至少一个贡献,对分配给第二线程的相邻值区段的值执行运算的阶段,以便生成处理值区段。也就是说,在第二示例中,在步骤S1010中,每个线程将具有对滤波器内核中的值中的所有值的访问,该滤波器内核用于对该线程的寄存器内分配给该线程的值区段内的值中的每个值进行滤波。例如,参考图6,在执行步骤S1008之后,线程T17将在该线程的寄存器内具有对以下的访问:分配给线程T9的值区段的第6值、第7值和第8值;分配给线程T17的值区段的值中的每个值;以及分配给线程T25的值区段的第1值、第2值和第3值。由此,在步骤S1010的第二示例中,线程T17可以独立地完成高斯滤波运算的阶段,以便针对该线程已被分配的值区段中的值中的每个值生成相应处理值。以类似方式,在步骤S1010的第二示例中,多个线程中的线程中的每个线程(例如图4中所示出的每个线程)可以独立地完成高斯滤波运算的阶段,以便针对该线程已被分配的值区段中的值中的每个值生成相应处理值。
应理解,为了执行运算的阶段1000,多个线程中的线程中的每个线程(例如图4中所示出的每个线程)可以在步骤S1004至S1006中执行“第一线程”的动作,以便确定到将由至少一个其他线程完成的运算的阶段的至少一个贡献,并且随后在步骤S1008至S1010中执行“第二线程”的动作,以便根据由至少一个其他线程确定的至少一个贡献来完成运算的阶段。
在步骤S1014中,确定运算是否完成。在待运算的值阵列是一维值阵列(例如音频信号的音频样本序列,或者传输信号的信号样本序列)并且在步骤S1004至S1010中执行的运算的阶段1000是一维运算(例如一维高斯滤波运算)的示例中,在完成步骤S1004至S1010的单个阶段1000之后,可以确定运算完成。在此情况下,第二线程可以将该第二线程已生成的处理值区段写入到全局存储器108。多个线程中的每个线程(例如图4中所示出的每个线程)可以将该线程已生成的处理值区段写入到全局存储器108,使得对应于待执行运算的值阵列的每个值的处理值被写入到全局存储器108。写入到全局存储器108的对应于值阵列的每个值的处理值可以是该方法的输出。
在待运算的值阵列是二维像素值阵列的说明性示例中,该运算是可分离二维高斯滤波运算,并且在步骤S1004至S1010中执行的运算的阶段1000是一维高斯滤波运算,在完成步骤S1004至S1010的单个(例如初始)阶段1000之后,可以确定运算没有完成。在此情况下,第二线程可以将该第二线程已生成的处理值区段写入到本地存储器106。多个线程中的每个线程(例如图4中所示出的每个线程)可以将该线程已生成的处理值区段写入到本地存储器106,使得对应于待执行运算的值阵列的每个值的处理值被写入到本地存储器106。如本文中所描述,线程束内的多个线程可以共享对本地存储器106的访问。该方法随后继续进行到步骤S1016。
为了执行运算的后一阶段,在步骤S1016中,对于值阵列的一个或多个垂直一维值序列中的每个垂直一维值序列,将来自存储器(例如本地存储器106)的相应多个处理值分配给多个线程中的每个线程,该多个处理值对应于二维值阵列的垂直一维值序列的一维值区段。该值区段可以为非重叠值区段。
参考图8可以理解此步骤——在示例中,该图示出了在运算的后一阶段中分配的多个处理值所对应的值区段。在图8中所示出的示例中,已针对二维值阵列的一个或多个竖直值序列(例如列)中的每个竖直值序列执行步骤1016,该一个或多个竖直值序列垂直于一个或多个水平值序列(例如行),在步骤S1002中,从该一个或多个水平值序列中将值区段分配给多个线程。应理解,如果已针对二维值阵列的一个或多个竖直值序列(例如列)执行步骤S1002,则可以替代地针对二维值阵列的一个或多个水平值序列(例如行)中的每个水平值序列执行步骤S1016。
在图8中,值阵列800的每个垂直一维值序列是值阵列800的一列值。在图8中,值阵列包括32列值。每一列值包括32个值。如本文中所描述,每个线程可以能够完成多达八个像素值的期望运算。此限制可能是由每个线程可访问的寄存器存储量造成的——并且应理解,在其他示例中,每个线程可以能够针对不同数量的像素值(例如在一些示例中,多达100的任何合适数量的像素值,或甚至更多的像素值)完成期望运算。在此示例中,每一列值划分成四个非重叠值区段,每个值区段包括八个值。存储在本地存储器106中的对应于该值区段中的每个值区段的多个处理值被分配给线程。在图8中,二维值阵列划分成128个值区段(即,32列×每一列4个区段),存储在本地存储器106中的对应于每个值区段的多个处理值被分配给128个线程中的相应线程——在图8中被标记为T1至T128。如本文中所描述,在示例中,线程束可以包括多达128个线程。由此,在此示例中,处理单元100的一个处理元件102可以并行处理已被分配有对应于值阵列的值的处理值的该128个线程。也就是说,待由处理单元100的处理元件102处理的线程束可以包括该128个线程(即图8中所示出的T1至T128)。
图9进一步详细地示出了垂直一维值序列900。具体地说,图9示出了值阵列800的第一列值900。该一列值900已划分成四个区段,每个区段包括八个值。存储在本地存储器106中的对应于那些值区段中的每个值区段的值的多个处理值已分别被分配给线程T1、T9、T17和T25。分配给线程T1的多个处理值对应于与对应于分配给线程T9的多个处理值的值区段相邻的值区段。分配给线程T9的多个处理值对应于与对应于分配给线程T1的多个处理值的值区段相邻的值区段,并且还对应于与对应于分配给线程T17的多个处理值的值区段相邻的值区段。分配给线程T17的多个处理值对应于与对应于分配给线程T9的多个处理值的值区段相邻的值区段,并且还对应于与对应于分配给线程T25的多个处理值的值区段相邻的值区段。分配给线程T25的多个处理值对应于与对应于分配给T17的多个处理值的值区段相邻的值区段。
在本文中描述的示例中,在运算的后一阶段中使用与在运算的初始阶段中使用的多个线程相同的多个线程(例如图4和图8中所示出的线程T1至T128)。也就是说,应理解,尽管执行如图4和图8中所示出的分配是方便的,使得在运算的后一阶段中分配给每个线程的值的数量等于在运算的初始阶段中分配给每个线程的值的数量,但情况不必如此。
在替代示例中,步骤S1016可以包括将由线程在运算的初始阶段中生成的处理值分配回该线程,以用于在运算的后一阶段中进一步处理。例如,如本文中所描述,在一些示例中,可以向线程分配来自多于一个一维值序列中的每个一维值序列的值区段。因此,在替代示例中,在步骤S1002中,可以将图4中标记为T1至T8的值区段中的每个值区段分配给一个线程(图中未示出)。更一般地,在此替代示例中,在步骤S1002中,可以向线程分配不同一维值序列中的一定数量的(例如八个)连续值区段,该数量等于该线程被分配的每个值区段中的值的数量(例如八个)。在此替代示例中,在运算的初始阶段期间,该线程可以根据本文中描述的原理与“在该线程的右侧”的一个或多个相邻线程协作,以便生成多个处理值(例如已分配有图4中标记为T9至T16的值区段的一个或多个相邻线程)。在此替代示例中,在步骤S1016中,可以将由该线程在运算的初始阶段中生成的处理值分配回该线程,以用于在运算的后一阶段中进一步处理(例如可以向该线程“分配”对应于图8中标记为T1至T8的垂直值区段中的每个垂直值区段的多个处理值)。在此替代示例中,该处理值不需要在初始阶段与后一阶段之间被写入到本地存储器106,而是可以在初始阶段与后一阶段之间被保留在该线程可访问的一个或多个寄存器内。在此替代示例中,在运算的后一阶段期间,该线程可以根据本文中描述的原理与“来自下方”的一个或多个相邻线程协作,以便生成多个输出值(例如已分配有图8中标记为T9至T16的值区段的一个或多个相邻线程)。
回到图10,在本文中描述的方法中,每个线程将完成针对该线程已被分配的多个处理值的值中的每个值的运算的后一阶段。为了实现这一点,首先,每个线程使得分配给该线程的处理值中的每个处理值被从本地存储器106读取到该线程可访问的一个或多个寄存器中。
该方法随后继续进行到步骤S1004至步骤S1010的第二遍次,以便执行运算的后一阶段1000。在运算的后一阶段中,针对分配给多个线程中的每个线程的多个处理值执行与在运算的初始阶段中针对分配给多个线程中的每个线程的值区段执行的一维高斯滤波运算相同的一维高斯滤波运算。
在后一阶段中,在步骤S1004中,多个线程中的第一线程确定从分配给第一线程的多个处理值到将由多个线程中的第二线程针对多个处理值完成的运算的后一阶段的至少一个贡献,该多个处理值与二维值阵列的垂直一维值序列的一维值区段对应,该一维值区段与垂直一维值序列的对应于分配给第一线程的多个处理值的一维值区段相邻。在第一示例中,多个线程中的第一线程可以对分配给第一线程的多个处理值中的一个或多个值的至少一个集合执行可分离运算的后一阶段的至少一部分,以便确定从一个或多个值的该至少一个集合到将由多个线程中的第二线程针对多个处理值完成的运算的后一阶段的至少一个贡献,该多个处理值与二维值阵列的垂直一维值序列的一维值区段对应,该一维值区段与垂直一维值序列的对应于分配给第一线程的多个处理值的一维值区段相邻。在第二示例中,多个线程中的第一线程可以确定分配给第一线程的多个处理值的一个或多个值,作为从分配给第一线程的多个处理值到将由多个线程中的第二线程针对多个处理值完成的运算的后一阶段的至少一个贡献,该多个处理值与二维值阵列的垂直一维值序列的一维值区段对应,该一维值区段与垂直一维值序列的对应于分配给第一线程的多个处理值的一维值区段相邻。如参考图7a至图7c所描述,以与初始阶段的步骤S1004类似的方式执行后一阶段的步骤S1004。也就是说,例如,以类似于如图4中所示出的线程T9和T17在运算的初始阶段中彼此协作的方式,如图8中所示出的线程T9和T17在运算的后一阶段中彼此协作。
在后一阶段中,在步骤S1006中,多个线程中的第一线程将该第一线程已确定的至少一个贡献写入到存储器。具体地说,多个线程中的第一线程可以将该第一线程已确定的至少一个贡献写入到本地存储器106。如本文中所描述,线程束内的多个线程可以共享对本地存储器106的访问。
在后一阶段中,在步骤S1008中,多个线程中的第二线程从存储器中读取由第一线程确定的至少一个贡献。具体地说,多个线程中的第二线程可以从本地存储器106中读取由第一线程确定的至少一个贡献。第二线程可以使得至少一个贡献被读取到第二线程可访问的一个或多个寄存器中——使得该寄存器包括至少一个贡献以及分配给第二线程的值。
在后一阶段中,在步骤S1010中,多个线程中的第二线程根据由第一线程确定的至少一个贡献来完成针对分配给第二线程的多个处理值的可分离运算的后一阶段,以便生成输出值区段。如参考图7a至图7c所描述,以与初始阶段的步骤S1010类似的方式执行后一阶段的步骤S1010。也就是说,例如,以类似于如图4中所示出的线程T9和T17在运算的初始阶段中彼此协作的方式,如图8中所示出的线程T9和T17在运算的后一阶段中彼此协作。
应理解,为了执行运算的后一阶段,多个线程中的线程中的每个线程(例如图8中所示出的每个线程)可以在后一阶段的步骤S1004至S1006中执行“第一线程”的动作,以便确定到将由至少一个其他线程完成的运算的后一阶段的至少一个贡献,并且随后在后一阶段的步骤S1008至S1010中执行“第二线程”的动作,以便根据由至少一个其他线程确定的至少一个贡献来完成运算的后一阶段。
在后一阶段中,在步骤S1014中,确定运算是否完成。在待运算的值阵列是二维像素值阵列的说明性示例中,该运算是可分离二维高斯滤波运算,并且在步骤S1004至S1010中执行的运算的初始阶段和后续阶段是垂直一维高斯滤波运算,在完成步骤S1004至S1010的后一阶段1000之后,可以确定运算完成。在此情况下,第二线程可以将该第二线程已生成的输出值区段写入到全局存储器108。多个线程中的每个线程(例如图8中所示出的每个线程)可以将该线程已生成的输出值区段写入到全局存储器108,使得对应于待执行运算的值阵列的每个值的输出值被写入到全局存储器108。写入到全局存储器108的对应于值阵列的每个值的输出值可以是该方法的输出。在所接收到的二维图像已划分成多个重叠图块以用于输入到该方法的示例中,该方法针对每个重叠图块的输出可以如本文中所描述那样被重新组合以形成经滤波的二维图像。
使用图10的方法而不是使用本文中描述的简单方法来执行可分离二维高斯滤波运算是有利的。这是因为本文中描述的方法相对较快,因为该方法涉及执行对全局存储器108的仅一组读取和一组写入来执行运算——相对于简单方法中所需的对全局存储器108的两组读取和两组写入而言。此外,在图10的方法中,每个值仅被从全局存储器108中读取一次——而不论待执行的运算的阶段数量如何。这是因为每个线程完成针对该线程被分配的多个值中的每个值的运算的每个阶段,并且在阶段之间将处理值存储在本地存储器106中。这与简单方法形成对比,在简单方法中,将每个值从存储器中读取许多次,使得每个线程可以完成针对单个值的每个阶段。本文中描述的方法利用了相同线程束内的线程在它们的处理期间共享对专用于处理那些线程的处理逻辑104的本地存储器106的访问的能力。
应理解,本文中参考图10描述的方法也可应用于对具有多于两个维度的值阵列执行的可分离多维运算。在这些示例中,可以执行步骤S1016和S1004至S1010的另外的遍次,以便执行运算的另外的阶段。
快速积分计算
应理解,本文中参考图10描述的方法不限于用于执行可分离滤波运算,诸如可分离高斯或盒式滤波运算。本文中参考图10描述的方法可用于执行其他类型的可分离运算,诸如快速积分计算运算或任何另一合适类型的可分离运算。
如同一维滤波运算一样,一维快速积分计算运算可以在多个阶段中执行,以便对多维值阵列实现可分离运算。在一维快速积分计算运算中,对一维值序列中的值进行连续求和,使得处理序列中的第一处理值等于输入序列中的第一输入值,处理序列中的第二处理值等于输入序列中的第一输入值和第二输入值,处理序列中的第三处理值等于第一输入值、第二输入值和第三输入值的总和,以此类推,直到处理序列中等于输入序列中的输入值中的所有输入值的总和的最终处理值。
快速积分图像计算运算是一种在二维图像上以两个阶段执行的快速积分计算运算类型。当执行快速积分图像计算运算时,针对图10的方法的输入可以是二维像素值阵列。
在所接收到的二维图像足够小的一些示例中,线程的一个线程束可以能够针对该二维图像的像素值中的所有像素值执行期望运算。在这些示例中,整个二维图像可以作为二维像素值阵列输入到如图10中所示出的方法。
在其他示例中,可选地,所接收到的二维图像可以划分成多个图块。该多个图块中的每个图块包括相应二维像素值阵列。与上文给出的滤波运算示例不同,该图块不需要重叠,因为当执行快速积分图像计算运算时,边缘情况不会在每个值序列的开始/结束处出现。也就是说,与上文给出的滤波运算示例不同,当执行快速积分图像计算运算时,不可能总是并行处理图块中的所有图块。这是因为,在水平地执行初始阶段的示例中,图像的第一“图块列”中的图块的每一行的最终输出值是针对图像的第二“图块列”中的图块的每一相应行的输入,图像的第二“图块列”中的图块的每一行的最终输出值是针对图像的第三“图块列”中的图块的每一相应行的输入,以此类推。因此,当执行快速积分图像计算运算时,可以在处理单元处串行处理图块中的一些图块。本领域技术人员将会知道用于进行以下操作的许多技术:传播来自对输入图像的第一“图块列”或“图块行”中的图块的处理的输出值,以用于对该图像的第二“图块列”或“图块行”中的图块的后一处理,等等——例如通过在处理单元的处理元件处处理包括多个线程束的工作组,其中一行或一列图块中的图块中的每个图块由多个线程束中的一个线程束来处理,并且多个线程束在该处理元件处被并行处理,使得第一“图块列”或“图块行”中的图块由该工作组的第一线程束来处理,该第一线程束随后经由本地存储器与该工作组的第二线程束共享其输出值,该第二线程束随后处理第二“图块列”或“图块行”中的图块,以此类推——并且因此为了简明起见,本文中将不进一步讨论这些技术。
在下文中,讨论了整个二维图像可以作为二维像素值阵列输入到图10中所示出的方法的示例,该二维像素值阵列将由在处理单元的单个处理元件(例如核)处并行运行的线程束的线程来处理。
为了执行快速积分图像计算运算的初始阶段,在步骤S1002中,对于值阵列的一个或多个一维值序列中的每个一维值序列,将一维值序列的相应值区段分配给多个线程中的每个线程。用于快速积分图像计算运算的步骤S1002可以以与针对可分离滤波运算执行步骤S1002相同的方式来执行,如本文中参考图4和图5所描述。每个线程使得分配给该线程的值区段中包括的值中的每个值被从全局存储器108中读取到专用于该线程的寄存器库110中的一个或多个寄存器(例如“该线程的寄存器”)中。
在步骤S1004中,多个线程中的第一线程对分配给第一线程的值区段的一个或多个值的至少一个集合执行运算的阶段的至少一部分,以便确定从一个或多个值的该至少一个集合到将由多个线程中的第二线程针对一维值序列的相邻值区段完成的运算的阶段的至少一个贡献。例如,参考图4和图5,线程T1可以执行对该线程已被分配的值区段中的值中的所有值(例如所有八个值)的求和。此总和是到线程T9将完成的快速积分图像计算的阶段的贡献。当执行快速积分图像计算运算时,此总和也是到线程T17和T25将完成的快速积分计算的阶段的贡献。(如图4中所示出的)线程T1至T24、T33至T56、T65至T88和T97至T120中的每个线程可以通过执行对该线程已被分配的值区段中的值中的所有值(例如所有八个值)的求和而以此方式确定贡献。
在步骤S1006中,第一线程将该线程已确定的至少一个贡献写入到存储器。具体地说,第一线程(例如此示例中的T1)可以将至少一个贡献写入到本地存储器106。如本文中所描述,线程束内的多个线程可以共享对本地存储器106的访问。在步骤S1006中,多个线程中的其他线程中的每个线程也可以将该线程在步骤S1004中确定的任何贡献写入到本地存储器106。
在步骤S1008中,第二线程从存储器中读取由第一线程确定的至少一个贡献。具体地说,第二线程(例如此示例中的T9)可以从本地存储器106中读取至少一个贡献。第二线程可以使得至少一个贡献被读取到第二线程可访问的一个或多个寄存器中——使得该寄存器包括至少一个贡献以及分配给第二线程的相邻值区段的值。例如,线程T9可以从存储器中读取由线程T1确定的贡献。另外,当执行快速积分图像计算运算时:线程T17可以从内存中读取由线程T1和T9确定的贡献,并且线程T25可以从内存中读取由线程T1、T9和T17确定的贡献。相同原理适用于二维值阵列的其他一维值序列(例如行)。
在步骤S1010中,第二线程根据由存储器确定的至少一个贡献来完成针对分配给第二线程的相邻值区段的运算的阶段,以便生成处理值区段。例如:线程T9可以通过将线程T1所确定的贡献以及该线程已被分配的值区段中的第一值进行求和,来确定针对该线程已被分配的值区段中的第一值的处理值;线程T9可以通过将线程T1所确定的贡献、该线程已被分配的值区段中的第一值和第二值进行求和,来确定针对该线程已被分配的值区段中的第二值的处理值;以此类推,直到线程T9可以通过将线程T1所确定的贡献以及该线程已被分配的值区段中的值中的所有值进行求和,来确定针对该线程已被分配的值区段中的最终(例如第八)值的处理值。另外:线程T17可以通过将线程T1所确定的贡献、T9所确定的贡献以及该线程已被分配的值区段中的第一值进行求和,来确定针对该线程已被分配的值区段中的第一值的处理值;线程T17可以通过将线程T1所确定的贡献、T9所确定的贡献、该线程已被分配的值区段中的第一值和第二值进行求和,来确定针对该线程已被分配的值区段中的第二值的处理值;以此类推,直到线程T17可以通过将线程T1所确定的贡献、T9所确定的贡献以及该线程已被分配的值区段中的值中的所有值进行求和,来确定针对该线程已被分配的值区段中的最终(例如第八)值的处理值。另外:线程T25可以通过将线程T1所确定的贡献、T9所确定的贡献、T17所确定的贡献以及该线程已被分配的值区段中的第一值进行求和,来确定针对该线程已被分配的值区段中的第一值的处理值;线程T25可以通过将线程T1所确定的贡献、T9所确定的贡献、T17所确定的贡献、该线程已被分配的值区段中的第一值和第二值进行求和,来确定针对该线程已被分配的值区段中的第二值的处理值;以此类推,直到线程T25可以通过将线程T1所确定的贡献、T9所确定的贡献、T17所确定的贡献以及该线程已被分配的值区段中的值中的所有值进行求和,来确定针对该线程已被分配的值区段中的最终(例如第八)值的处理值。相同原理适用于二维值阵列的其他一维值序列(例如行)。
在步骤S1014中,确定运算是否完成。在待运算的值阵列是二维像素值阵列的此示例中,该运算是可分离二维快速积分图像计算运算,并且在步骤S1004至S1010中执行的运算的阶段1000是一维快速积分图像计算运算,在完成步骤S1004至S1010的单个(例如初始)阶段1000之后,可以确定运算没有完成。在此情况下,第二线程(例如此示例中的线程T9)可以将该线程已生成的处理值区段写入到本地存储器106。多个线程中的每个线程(例如图4中所示出的每个线程)可以将该线程已生成的处理值区段写入到本地存储器106,使得对应于待执行运算的值阵列的每个值的处理值被写入到本地存储器106。如本文中所描述,线程束内的多个线程可以共享对本地存储器106的访问。随后,该方法继续进行到步骤S1016。
为了执行运算的后一阶段,在步骤S1016中,对于值阵列的一个或多个垂直一维值序列中的每个垂直一维值序列,将来自存储器(例如本地存储器106)的相应多个处理值分配给多个线程中的每个线程,该多个处理值对应于二维值阵列的垂直一维值序列的一维值区段。用于快速积分图像计算运算的步骤S1016可以以与针对可分离滤波运算执行步骤S1016相同的方式来执行,如本文中参考图8和图9所描述。如本文中所描述,在一些替代示例中,步骤S1016可以包括将由线程在运算的初始阶段中生成的处理值分配回该线程,以用于在运算的后一阶段中进一步处理。
该方法随后继续进行到步骤S1004至步骤S1010的第二遍次,以便执行快速积分图像计算运算的后一阶段1000。在运算的后一阶段中,针对分配给多个线程中的每个线程的多个处理值执行与在运算的初始阶段中针对分配给多个线程中的每个线程的值区段执行的一维快速积分图像计算运算相同的一维快速积分图像计算运算。快速积分图像计算运算的后一阶段1000的步骤S1004至步骤S1010以与快速积分图像计算运算的初始阶段1000的步骤S1004至步骤S1010类似的方式来执行,如本文中所描述。
在后一阶段的步骤S1014中,确定运算是否完成。在待运算的值阵列是二维像素值阵列的此示例中,该运算是可分离二维快速积分计算运算,并且在步骤S1004至S1010中执行的运算的初始阶段和后续阶段是垂直一维快速积分计算运算,在完成步骤S1004至S1010的后一阶段1000之后,可以确定运算完成。在此情况下,多个线程中的每个线程(例如图8中所示出的每个线程)可以将该线程已生成的输出值区段写入到全局存储器108,使得对应于待执行运算的值阵列的每个值的输出值被写入到全局存储器108。写入到全局存储器108的对应于值阵列的每个值的输出值可以是该方法的输出。
应理解,本文中参考图10描述的方法也可应用于对一维值阵列(例如音频信号的音频样本序列,或者传输信号的信号样本序列)执行的一维快速积分计算运算。在这些示例中,可以执行步骤S1002至S1014的单个遍次,以便执行快速积分计算运算的单个阶段。
还应理解,本文中参考图10描述的方法也可应用于对具有多于两个维度的值阵列执行的可分离多维快速积分计算运算。在这些示例中,可以执行步骤S1016和S1004至S1014的另外的遍次,以便执行快速积分计算运算的另外的阶段。
在可分离运算的阶段之间向存储器写入/从存储器中读取
如本文中参考图10所描述,在可分离运算的初始阶段的步骤S1014中,多个线程中的每个线程可以使得该线程已处理的值被写入到存储器(例如本地存储器106)。在步骤S1016中,在可分离运算的后一阶段中待运算的处理值可以被分配给多个线程。随后,可分离运算的后一阶段的步骤S1004可以从多个线程中的每个线程开始,使得将该线程已被分配的处理值从存储器(例如本地存储器106)中读取到该线程的寄存器(例如该线程在寄存器库110中的寄存器)中。
可选地,可以通过在可分离运算的初始阶段之后以规定方式将处理值写入到存储器(例如本地存储器106)来减少可分离运算的时延——如将在本文中描述。
图11示出了包括多个存储库的示例存储器106。图11中所示出的存储器106可以是“本地”存储器106——如先前在本文中参考图1A和图1B所定义。具体地说,存储器106可以由处理单元的处理元件(例如核)构成。该处理元件的处理逻辑可以访问存储器106。
本文中参考图1A和图1B描述的本地存储器106可以具有与存储器106相同的特性,如将在本文中参考图11所描述。
图11所示出的存储器106包括十六个存储库——在图11中标记为1至16。图11中的十六个存储库被示出为十六列存储器位置。存储器位置是存储器的一部分,可以将一个值(例如一个像素值)写入到该部分中。应理解,一个值可以包括多于一位的信息。应理解,存储器可以包括任何合适数量的存储库(例如8、32、64或任何另一合适数量的存储库)。应理解,图11中所示出的存储器位置的数量不旨在是限制性的——存储器可以包括任何合适数量的存储器位置。图11中所示出的十六个存储库各自是一个存储器位置“宽”。也就是说,图11中所示出的每个存储库可以在其行中的每一行中存储一个值。应理解,存储库可以是多于一个存储器位置“宽”(例如存储库可以是2个、4个或任何另一合适数量的存储器位置“宽”)。也就是说,存储库可以在其行中的每一行中存储多于一个值。
如本文中所描述,包括多个线程的线程束可以由包括处理逻辑和存储器106的处理元件(例如核)来处理。线程束内的多个线程可以共享对存储器106的访问。换句话说,多个线程中的每个线程可以使得处理逻辑向存储器106写入值以及/或者从该存储器中读取值。
在可分离运算的初始阶段之后,将处理值写入到存储器时,出现过量的存储库冲突
在每个写入步骤(例如时钟或指令)中,线程可以使得仅一个值(例如像素值)被写入到存储器106中。在每个写入步骤中,每个存储库可以由仅一个相应线程写入。当多个线程中的每个线程试图在单个写入步骤中将相应值写入到一个存储库中时,出现“存储库冲突”。当出现存储库冲突时,通过多个写入步骤来执行向该存储库中的该写入。也就是说,在每个写入步骤中,多个不同线程中的每个线程可以将相应值写入到存储器的多个不同存储库中的相应存储库中。由此,多个线程将其处理值写入到存储器中的最有效(例如最低时延)方式是,在每个写入步骤中,数量等于存储器中的存储库数量的不同线程各自将一个相应值写入到多个存储库中的相应存储库中。例如,在执行可分离运算的初始阶段之后,图4中所示出的多个线程将其处理值写入到图11的存储器106中的最有效(例如最低时延)方式是,在每个写入步骤中,16个不同线程各自将一个相应值写入到存储器106的16个不同存储库中的相应存储库中。
在将由多个线程中的每个线程写入的处理值的数量是存储器中的存储库数量的因数或者等于存储库数量的示例中,当该多个线程将其处理值写入到该存储器中时,可能出现不必要的存储库冲突。这意味着,在每个写入步骤中,不是该存储器的存储库中的所有存储库都可以被写入。这可以参考图12A来理解,该图示出了使用第一简单方法写入到存储器106的多个处理值。图12A中所示出的处理值是由如图4和图5中所示出的多个线程处理的值——其中线程T1至T128各自在如本文中所描述的可分离运算的初始阶段中处理八个相应值(例如像素P1至P8)。在此示例中,在执行可分离运算的初始阶段之后,将由多个线程中的每个线程写入的处理值的数量(即8)是存储器106中的存储库数量(即16)的因数。为了易于说明,省略了多行存储器位置。
可以根据写入缓冲器阵列来确定待写入处理值的存储库。在图12A中所示出的第一简单方法中,写入缓冲器阵列可以是一维元素序列,该一维元素序列包括:对应于将由线程T1写入的8个处理值中的每个处理值的元素(即T1P1、T1P2…T1P8);随后是对应于将由线程T2写入的8个处理值的元素(即T2P1、T2P2…T2P8);随后是对应于将由线程T3写入的8个处理值的元素(即T3P1、T3P2…T3P8);以此类推,直到对应于将由线程T128写入的8个处理值的元素(即T128P1、T128P2…T128P8)。通过将写入缓冲器阵列中的前16个元素(例如第1值至第16值)映射到第一行的16个存储器位置,将写入缓冲器阵列中的随后16个元素(例如第17值至第32值)映射到第二行的16个存储器位置,以此类推,可以将写入缓冲器阵列映射到存储器106。将写入缓冲器阵列映射到存储器,使得处理值在写入缓冲器阵列的对应元素所映射到的存储器位置中被写入到存储器中。
如本文中所描述,在每个写入步骤(例如时钟或指令)中,每个线程可以使得仅一个值被写入到存储器106中。因此,在第一写入步骤中,线程T1至T128中的每个线程试图将针对其第一值(即P1)的相应处理值写入到存储器(即处理值T1P1、T2P1、T3P1、T4P1、T5P1、T6P1、T7P1、T8P1直至T128P1)。尽管所有128个线程不可能在单个写入步骤中向存储器106中的16个存储库写入,但128个线程中的多组16个线程能够在每个写入步骤中向存储器106中的16个存储库写入(即,使得通过8个写入步骤写入P1值中的所有128个P1值)的情况将是优选的。然而,使用第一简单方法,这也是不可能的——如参考图12A将理解。例如,在第一写入步骤中,线程T1试图将T1P1写入到与以下操作相同的存储库(例如图12A中的存储库1):线程T3试图写入T3P1,T5试图写入T5P1,线程T7试图写入T7P1,线程T9试图写入T9P1,线程T11试图写入T11P1,线程T13试图写入T13P1,以及线程T15试图写入T15P1。另外,在该第一写入步骤中,线程T2试图将T2P1写入到与以下操作相同的存储库(例如图12A中的存储库9):线程T4试图写入T4P1,T6试图写入T6P1,线程T8试图写入T8P1,T10试图写入T10P1,线程T12试图写入T12P1,T14试图写入T14P1,以及线程T16试图写入T16P1。这意味着,不是这组16个线程(即线程T1至T16)在一个写入步骤中写入到16个不同存储库,而是在此第一简单方法中,由这16个线程的对(即线程(i)T1和T2,(ii)T3和T4等至(viii)T15和T16)通过八个写入步骤写入到两个不同存储库来执行相同数量的写入。这是低效的,因为在每个写入步骤中,十六个存储库中只有两个被写入。线程T17至T32中的每个线程需要另外八个写入步骤以将针对该线程的P1的相应处理值写入到存储器,以此类推,直到线程T113至T128需要八个写入步骤以将针对该线程的P1的相应处理值写入到存储器。这意味着,将针对P1值中的所有128个P1值写入到存储器106中需要64个写入步骤——而不是在每个写入步骤中写入所有16个存储库需要8个写入步骤。随后,将此低效写入过程再重复七次,以便使多个线程中的每个线程写入该线程的其他七个处理值中的每个处理值(即P2至P8中的每一者)。
在可分离运算的后一阶段之前,当从存储器中读取处理值时,出现过量的存储库冲突
在每个读取步骤(例如时钟或指令)中,线程可以使得仅一个值(例如像素值)被从存储器106中读取。在每个读取步骤中,每个存储库可以由仅一个相应线程读取。当多个线程中的每个线程试图在单个读取步骤中从一个存储库中读取相应值时,出现“存储库冲突”。当出现存储库冲突时,通过多个读取步骤来执行从该存储库中的该读取。也就是说,在每个读取步骤中,多个不同线程中的每个线程可以从存储器的多个不同存储库中的相应存储库中读取相应值。由此,多个线程从存储器中读取处理值的最有效(例如最低时延)方式是,在每个读取步骤中,数量等于存储器中的存储库数量的不同线程各自从多个存储库中的相应存储库中读取一个相应值。例如,在执行可分离运算的后一阶段之前,图8中所示出的多个线程从图11的存储器106中读取处理值的最有效(例如最低时延)方式是,在每个读取步骤中,16个不同线程各自从存储器106的16个不同存储库中的相应存储库中读取一个相应值。
在将由多个线程中的每个线程读取的处理值的数量是存储器中的存储库数量的因数或者等于存储库数量的示例中,当该多个线程从该存储器中读取该多个线程的处理值时,可能出现不必要的存储库冲突。这意味着,在每个读取步骤中,不是该存储器的存储库中的所有存储库都可以被读取。这可以参考图12B来理解,该图示出了使用第二简单方法写入到存储器106的多个处理值。图12B中所示出的处理值是由如图4和图5中所示出的多个线程处理的值——其中线程T1至T128各自在如本文中所描述的可分离运算的初始阶段中处理八个相应值(例如像素P1至P8)。在此示例中,在执行可分离运算的后一阶段之前,将由(例如,如图8中所示出那样布置的)多个线程中的每个线程读取的值的数量(即8)是存储器中的存储库的数量(即16)的因数。为了易于说明,省略了多行存储器位置。
如本文中所描述,可以根据写入缓冲器阵列来确定待写入处理值的存储库。在图12B中所示出的第二简单方法中,写入缓冲器阵列可以是一维元素序列,该一维元素序列包括:对应于线程T1至T8中的每个线程的第一处理值P1的元素(即T1P1、T2P1…T8P1);随后是对应于针对线程T1至T8中的每个线程的第二处理值P2的元素(即T1P2、T2P2…T8P2);以此类推,直到对应于针对线程T1至T8中的每个线程的第八处理值P8的元素(即T1P8、T2P8…T8P8);随后是对应于线程T9至T16中的每个线程的第一处理值P1的元素(即T9P1、T10P1…T16P1);随后是对应于线程T9至T16中的每个线程的第二处理值P2的元素(即T9P2、T10P2…T16P2);以此类推,直到对应于针对线程T9至T16中的每个线程的第八处理值P8的元素(即T9P8、T10P8…T16P8);以此类推,直到对应于针对线程T121至T128中的每个线程的第八处理值P8的元素(即T121P8、T122P8…T128P8)。通过将写入缓冲器阵列中的前16个元素(例如第1值至第16值)映射到第一行的16个存储器位置,将写入缓冲器阵列中的随后16个元素(例如第17值至第32值)映射到第二行的16个存储器位置,以此类推,可以将写入缓冲器阵列映射到存储器106。将写入缓冲器阵列映射到存储器,使得处理值在写入缓冲器阵列的对应元素所映射到的存储器位置中被写入到存储器中。
在运算的后一阶段之前,图8中所示出的线程T1从存储器106中读取处理值T1P1、T2P1、T3P1、T4P1、T5P1、T6P1、T7P1和T8P1。这可以通过将在如图4中所示出的初始阶段中分配给线程T1至T8的值阵列内的位置与对应于在如图8中所示出的后一阶段中分配给线程T1的处理值的值阵列内的位置进行比较来理解。应用相同原理:图8中所示出的线程T2读取处理值T1P2、T2P2、T3P2、T4P2、T5P2、T6P2、T7P2和T8P2;图8中所示出的线程T3读取处理值T1P3、T2P3、T3P3、T4P3、T5P3、T6P3、T7P3和T8P3;图8中所示出的线程T4读取处理值T1P4、T2P4、T3P4、T4P4、T5P4、T6P4、T7P4和T8P4;图8中所示出的线程T5读取处理值T1P5、T2P5、T3P5、T4P5、T5P5、T6P5、T7P5和T8P5;图8中所示出的线程T6读取处理值T1P6、T2P6、T3P6、T4P6、T5P6、T6P6、T7P6和T8P6;图8中所示出的线程T7读取处理值T1P7、T2P7、T3P7、T4P7、T5P7、T6P7、T7P7和T8P7;并且图8中所示出的线程T8读取处理值T1P8、T2P8、T3P8、T4P8、T5P8、T6P8、T7P8和T8P8。为了简明起见,在可分离运算的后一阶段之前由图8中所示出的其他线程中的每个线程读取的处理值将不会在本文详尽列出。如本文中所描述,通过比较图4与图8,本领域技术人员将不难确定由图8中所示出的其他线程中的每个线程读取哪些处理值。
如本文中所描述,在每个读取步骤(例如时钟或指令)中,线程可以使得仅一个值(例如像素值)被从存储器106中读取。因此,在第一读取步骤中,如图8中所示出的线程T1至T128中的每个线程试图从存储器中读取相应处理值。尽管所有128个线程不可能在单个读取步骤中从存储器106中的16个存储库中读取,但128个线程中的多组16个线程能够在每个读取步骤中从存储器106中的16个存储库中读取(即,使得线程中的所有128个线程通过8个读取步骤读入相应处理值)的情况将是优选的。然而,使用第二简单方法,这也是不可能的——如参考图12B将理解。例如,在第一读取步骤中,线程T1试图从与以下操作相同的存储库(例如图12B中的存储库1)中读取T1P1:线程T3试图读取T1P3;线程T5试图读取T1P5;线程T7试图读取T1P7;线程T33试图读取T9P1;线程T35试图读取T9P3;线程T37试图读取T9P5;以及线程T39试图读取T9P7。另外,在第一读取步骤中,线程T2试图从与以下操作相同的存储库(例如图12B中的存储库9)中读取T1P2:线程T4试图读取T1P4;线程T6试图读取T1P6;线程T8试图读取T1P8;线程T34试图读取T9P2;线程T36试图读取T9P4;线程T38试图读取T9P6;以及线程T40试图取T9P8。这意味着,不是这组16个线程(即线程T1至T8以及T33至T40)在一个读取步骤中从16个不同存储库中读取,而是在此第二简单方法中,由这16个线程的对(即线程(i)T1和T2,(ii)T3和T4等至(viii)T39和T40)通过八个读取步骤从两个不同存储库中读取来执行相同数量的读取。这是低效的,因为在每个读取步骤中,十六个存储库中只有两个被读取。这意味着,线程中的所有128个线程读入一个相应处理值需要64个读取步骤——而不是在每个读取步骤中读取所有16个存储库需要8个读取步骤。随后,将此低效读取过程再重复七次,以便多个线程中的每个线程读入分配给该线程的处理值中的其他七个处理值。
当在可分离运算的阶段之间向存储器写入/从存储器中读取时,避免了过量的存储库冲突
本文中参考图13描述了一种在包括存储器的处理单元处对二维值阵列执行可分离运算的计算机实现的方法。可分离运算可以是本文中描述的可分离运算中的任何可分离运算(例如可分离高斯滤波运算、可分离盒式滤波运算或可分离快速积分计算运算)或任何另一合适类型的可分离运算。该方法可用于以下两者:(i)将在于可分离运算的初始阶段之后将处理值写入到存储器(例如本地存储器106)时引起的存储库冲突的数量最小化;以及(ii)将在于该可分离运算的后一阶段之前从该存储器(例如本地存储器106)中读取那些处理值时引起的存储库冲突的数量最小化。由此,该方法可以减少与执行可分离运算相关联的时延。
针对图13中所示出的方法的输入是二维值阵列。输入到图13中所示出的方法的二维值阵列可以具有与可输入到图10中所示出的方法的如本文中所讨论的二维值阵列中的任何二维值阵列相同的特性。
在步骤S1302中,将输入到该方法的二维值阵列划分成多个二维值子阵列(例如元胞)。参考图14——该图示出了划分成多个二维值子阵列1至16的二维值阵列1400——可以理解此步骤。二维值子阵列可以是不重叠的。在图14中,二维值阵列是正方形的,并且二维值子阵列中的每个二维值子阵列是正方形的。在图14中,阵列中每一行中的子阵列的数量等于阵列中每一列的子阵列的数量。划分成多个二维值子阵列的二维值阵列可以由多维阵列[I][J][K][M]来表示,其中I和J表示两个维度中的每个维度中的值阵列内的值子阵列的数量,并且K和M表示两个维度中的每个维度中的值子阵列中的每个值子阵列内的值的数量。例如,在本文中参考图4、图5、图8、图9和图14描述的说明性示例中,多维阵列可以由[4][4][8][8]表示。也就是说,I表示子阵列的行数,J表示子阵列的列数,K表示每个子阵列内的行数,并且M表示每个子阵列内的列数。
在步骤S1304中,对于多个子阵列中的每个子阵列,使用多个线程,针对该值子阵列执行可分离运算的初始阶段,以便针对该值子阵列的每个值生成相应处理值。可以通过执行如本文中参考图10所描述的步骤S1002至S1010来执行步骤S1304。例如:通过使用如图4中所示出的线程T1至T8,可以针对如图14中所示出的子阵列1执行可分离运算的初始阶段;通过使用如图4中所示出的线程T9至T16,可以针对如图14中所示出的子阵列2执行可分离运算的初始阶段;以此类推,直到通过使用如图4中所示出的线程T121至T128,可以针对如图14中所示出的子阵列16执行可分离运算的初始阶段。
在步骤S1306中,对于多个子阵列中的每个子阵列,多个线程中的每个线程通过多个写入步骤将相应第一多个处理值写入到存储器(例如图11中所示出的存储器106),该第一多个处理值对应于该值子阵列的一维值序列。例如,参考图4、图5和图14,线程T1写入对应于子阵列1的一维值序列(例如列)内的八个值的八个处理值(例如T1P1、T1P2、T1P3、T1P4、T1P5、T1P6、T1P7和T1P8),该线程针对该子阵列执行可分离运算的初始阶段。为了简明起见,由图4中所示出的其他线程中的每个线程针对图14中所示出的子阵列中的每个子阵列写入的处理值将不会在本文详尽列出。通过参考图4和图14,技术人员将不难确定由其他线程中的每个线程针对子阵列中的每个子阵列写入哪些处理值。
如本文中所描述,可以根据写入缓冲器阵列来确定待写入处理值的存储库。根据本文中描述的原理,在步骤S1306中,可以根据元素数量比二维值阵列中的元素数量多的写入缓冲器阵列来确定待写入处理值的存储库。例如,在本文中描述的说明性示例中,二维值阵列包括1024个元素,并且因此,在步骤S1306中使用的写入缓冲器阵列包括大于1024个元素。写入缓冲器阵列可以包括对应于二维阵列的值的值元素,以及对应于存储器填充的填充元素。更具体地,写入缓冲器阵列可以包括对应于二维阵列的值的多组连续值元素,以及散布在该多组之间的填充元素。每一组中的值元素的数量可以(i)等于存储器所包括的存储库的数量(ii)是该数量的倍数,或者(iii)是该数量的因数。例如,存储器106包括16个存储库,并且因此,每一组中的值元素的数量可以是(i)16,(ii)16的倍数,诸如32、64或128,或者(iii)16的因数,诸如8。每一组中的值元素的数量可以等于或小于用于针对值阵列执行可分离运算的线程的数量。例如,在本文中描述的说明性示例中,将128个线程用于针对值阵列执行可分离运算。在此示例中,写入缓冲器阵列的每一组中的值元素的数量可以等于或小于128。
在存储器中的每个存储库是一个存储器位置“宽”的示例中(例如,如在图11中所示出的存储器106中),至少一个填充元素可以散布在多组值元素之间。在存储器中的每个存储库多于一个存储器位置“宽”的示例中,多个连续填充元素可以散布在多组连续值元素之间。换句话说,散布在多组连续值元素之间的连续填充元素的数量可以大于或等于存储器中的存储库的每一行中的存储器位置的数量。
写入缓冲器阵列可以是一维阵列——例如一维元素序列。为了确定每个处理值将被写入到哪个存储库中,可以将写入缓冲器阵列映射到处理逻辑可访问的存储器的结构。例如,通过将写入缓冲器阵列中的前16个元素(例如第1值至第16值)映射到第一行的16个存储器位置,将写入缓冲器阵列中的随后16个元素(例如第17值至第32值)映射到第二行的16个存储器位置,以此类推,可以将写入缓冲器阵列映射到图11的存储器106的结构。应理解,不需要从存储器106的第一(例如“左上”)存储器位置开始将写入缓冲器阵列映射到存储器106的结构。也就是说,可以从存储器106中的任何合适的存储器位置开始将写入缓冲器阵列映射到存储器106的结构。
在步骤S1306中,可以将写入缓冲器阵列映射到存储器,使得对应于二维阵列的值的处理值在写入缓冲器阵列的值元素所映射到的存储器位置中被写入到存储器中,并且对应于二维阵列的值的处理值不在写入缓冲器阵列的填充元素所映射到的存储器位置中被写入到存储器。任何其他信息(例如一个或多个“0”位,或者任何任意值)可以在写入缓冲器阵列的填充元素所映射到的存储器位置中被写入到存储器。替代地,写入缓冲器阵列的填充元素所映射到的存储器位置可以完全不被写入(例如那些存储器位置可以是“留空的”)。
可以根据基本存储器地址、写入偏移量和写入填充量来确定线程在步骤S1306中写入处理值的存储器位置。可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程写入处理值的存储器位置。该总和可用于确定写入缓冲器阵列中待写入的处理值所对应的元素。基本存储器地址可以是写入缓冲器阵列内的第一元素。
写入偏移量和写入填充量可以取决于待写入到存储器的处理值所对应的值在值阵列内的位置。例如,可以向值阵列中的每个值分配坐标[i][j][k][m]——使用零索引来定义(即,使得行或列中的第一子阵列或值被分配有针对该行或列维度的“0”坐标)——该坐标定义了该值在如本文中所定义的多维阵列[I][J][K][M]内的位置。针对待写入的处理值的写入偏移量可以是该处理值所对应的值的坐标[i][j][k][m]的函数。也就是说,i表示子阵列中包括该值的子阵列所定位的行,j表示子阵列中包括该值的子阵列所定位的列,k表示子阵列中该值所定位的行,并且m表示子阵列中该值所定位的列。在一些示例中,参考图4,值T1P1具有坐标[0][0][0][0],值T1P2具有坐标[0][0][0][1],值T9P1具有坐标[0][1][0][0],值T78P3具有坐标[2][1][5][2],并且值T128T6具有坐标[3][3][7][5]。
下文提供了合适的写入偏移量的非限制性示例。
写入填充量可以等于写入偏移量除以填充频率。该除法可以是整数除法。整数除法包括将第一个数除以第二个数,并且将结果的整数部分作为输出返回。例如,53除以8的整数除法将等于6(例如“余数”5不作为输出的一部分返回)。填充频率可以(i)等于存储器所包括的存储库的数量(ii)是该数量的倍数,或者(iii)是该数量的因数。例如,存储器106包括16个存储库,并且因此,填充频率可以是(i)16,(ii)16的倍数,诸如32、64或128,或者(iii)16的因数,诸如8。填充频率可以等于或小于用于针对值阵列执行可分离运算的线程的数量。例如,在本文中描述的说明性示例中,将128个线程用于针对值阵列执行可分离运算。在此示例中,填充频率可以等于或小于128。填充频率也可以是二的幂,即该填充频率是2n,其中n是整数。这意味着,1除以此数可以被执行为位的右移,而不是必须执行在硬件中实现起来较低效的全除法计算。
应理解,写入缓冲器阵列可以存在于物理存储器中(例如可以在寄存器库110中的寄存器中实现),使得在该写入缓冲器阵列的内容被传送到存储器(例如存储器106)之前,由线程在步骤S1304中生成的处理值被物理地写入到该写入缓冲器阵列中。替代地,写入缓冲器阵列可以是线程在概念上用于确定在步骤S1304中生成的每个处理值将被写入存储器中的哪个存储器位置的构造,其中将处理值直接从每个线程可访问的相应的一个或多个寄存器物理地写入到存储器(例如存储器106)中所确定的存储器位置中。
在步骤S1306中,通过应用本文中描述的原理,在多个写入步骤中的至少一个写入步骤中将相应处理值写入到存储器(例如图11的存储器106)的存储库中的每个存储库中。具体地说,通过应用本文中描述的原理,可以在多个写入步骤中的每个写入步骤中将相应处理值写入到存储器(例如图11的存储器106)的存储库中的每个存储库中。也就是说,在步骤S1306中的写入期间避免了过量的存储库冲突。
在下文中,提供了说明存储器106中的存储器位置的四个具体示例,多个线程可以通过应用本文中描述的原理而将处理值写入到该存储器位置。应理解,这些具体实现仅借助于示例来提供,并且本文中描述的原理可以不同地来应用。
示例1
参考图15A——该图示出了使用根据本文中描述的原理的第一方法写入到存储器106的多个处理值——可以理解示例1。图15A中所示出的处理值是由如图4和图5中所示出的多个线程处理的值——其中线程T1至T128各自在如本文中所描述的可分离运算的初始阶段中处理八个相应值(例如像素P1至P8)。
在示例1中,用于确定每个处理值将被写入到存储器106中的哪个存储器位置的写入缓冲器阵列包括对应于二维阵列的值的多组八个连续值元素,其中一个填充元素散布在该多组中的每一组之间。在示例1中,写入缓冲器阵列是一维元素序列,该一维元素序列包括:对应于将由线程T1写入的8个处理值的值元素(即T1P1、T1P2…T1P8);随后是填充元素;随后是对应于将由线程T2写入的8个处理值的值元素(即T2P1、T2P2…T2P8);随后是填充元素;随后是对应于将由线程T3写入的8个处理值的值元素(即T3P1、T3P2…T3P8);随后是填充元素;以此类推,直到对应于将由线程T128写入的8个处理值的值元素(即T128P1、T128P2…T128P8)。
如本文中所描述,可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1306中写入处理值的存储器位置。该总和可用于确定写入缓冲器阵列中待写入的处理值所对应的元素——其中基本存储器地址是该写入缓冲器阵列内的第一元素。在示例1中,对于在多维阵列[I][J][K][M]内具有坐标[i][j][k][m]的值,写入偏移量等于(i×J×K×M)+(j×K×M)+(k×M)+m,并且写入填充量等于写入偏移量除以8(填充频率)。该除法可以是整数除法。
图15A示出了在将此写入缓冲器阵列映射到存储器106以使得实现以下情况时存储器106的内容:对应于二维阵列的值的处理值在写入缓冲器阵列的对应值元素所映射到的存储器位置中被写入到存储器106中,并且对应于二维阵列的值的处理值不在写入缓冲器阵列的填充元素所映射到的存储器位置中被写入到存储器106。在图15A中,写入缓冲器阵列的填充元素所映射到的存储器位置由“X”指示。为了易于说明,省略了多行存储器位置。
在示例1中,可以在多个写入步骤中的至少一个写入步骤中将相应处理值写入到存储器(例如图11的存储器106)的存储库中的每个存储库中。例如,参考图15A,在一个写入步骤中:线程T1可以将T1P1写入到存储库1中;线程T2可以将T2P1写入到存储库10中;线程T3可以将T3P1写入到存储库3中;线程T4可以将T4P1写入到存储库12中;线程T5可以将T5P1写入到存储库5中;线程T6可以将T6P1写入到存储库14中;线程T7可以将T7P1写入到存储库7中;线程T8可以将T8P1写入到存储库16中;线程T9可以将T9P1写入到存储库9中;线程T10可以将T10P1写入到存储库2中;线程T11可以将T11P1写入到存储库11中;线程T12可以将T12P1写入到存储库4中;线程T13可以将T13P1写入到存储库13中;线程T14可以将T14P1写入到存储库6中;线程T15可以将T15P1写入到存储库15中;并且线程T16可以将T16P1写入到存储库8中。
此第一方法是有效的,因为128个线程中的多组16个线程能够在每个写入步骤中写入到存储器106中的16个存储库(即,使得P1值中的所有128个P1值通过8个写入步骤被写入)。随后,可以将此有效写入过程再重复七次,以便使多个线程中的每个线程写入该线程的其他七个处理值中的每个处理值(即P2至P8中的每一者)。
示例2
参考图15B——该图示出了使用根据本文中描述的原理的第二方法写入到存储器106的多个处理值——可以理解示例2。图15B中所示出的处理值是由如图4和图5中所示出的多个线程处理的值——其中线程T1至T128各自在如本文中所描述的可分离运算的初始阶段中处理八个相应值(例如像素P1至P8)。
在示例2中,用于确定每个处理值将被写入到存储器106中的哪个存储器位置的写入缓冲器阵列包括对应于二维阵列的值的多组十六个连续值元素,其中一个填充元素散布在该多组中的每一组之间。在示例2中,写入缓冲器阵列是一维元素序列,该一维元素序列包括:对应于将由线程T1写入的8个处理值的值元素(即T1P1、T1P2…T1P8);随后是对应于将由线程T2写入的8个处理值的值元素(即T2P1、T2P2…T2P8);随后是填充元素;随后是对应于将由线程T3写入的8个处理值的值元素(即T3P1、T3P2…T3P8);随后是对应于将由T4写入的8个处理值的值元素(即T4P1、T4P2…T4P8);随后是填充元素;以此类推,直到对应于将由线程T128写入的8个处理值的值元素(即T128P1、T128P2…T128P8)。
如本文中所描述,可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1306中写入处理值的存储器位置。该总和可用于确定写入缓冲器阵列中待写入的处理值所对应的元素——其中基本存储器地址是该写入缓冲器阵列内的第一元素。在示例2中,对于在多维阵列[I][J][K][M]内具有坐标[i][j][k][m]的值,写入偏移量等于(i×J×K×M)+(j×K×M)+(k×M)+m,并且写入填充量等于写入偏移量除以16(填充频率)。该除法可以是整数除法。
图15B示出了在将此写入缓冲器阵列映射到存储器106以使得实现以下情况时存储器106的内容:对应于二维阵列的值的处理值在写入缓冲器阵列的对应值元素所映射到的存储器位置中被写入到存储器106中,并且对应于二维阵列的值的处理值不在写入缓冲器阵列的填充元素所映射到的存储器位置中被写入到存储器106。在图15B中,写入缓冲器阵列的填充元素所映射到的存储器位置由“X”指示。为了易于说明,省略了多行存储器位置。
在示例2中,可以在多个写入步骤中的至少一个写入步骤中将相应处理值写入到存储器(例如图11的存储器106)的存储库中的每个存储库中。例如,参考图15B,在一个写入步骤中:线程T1可以将T1P1写入到存储库1中;线程T2可以将T2P1写入到存储库9中;线程T3可以将T3P1写入到存储库2中;线程T4可以将T4P1写入到存储库10中;线程T5可以将T5P1写入到存储库3中;线程T6可以将T6P1写入到存储库11中;线程T7可以将T7P1写入到存储库4中;线程T8可以将T8P1写入到存储库12中;线程T9可以将T9P1写入到存储库5中;线程T10可以将T10P1写入到存储库13中;线程T11可以将T11P1写入到存储库6中;线程T12可以将T12P1写入到存储库14中;线程T13可以将T13P1写入到存储库7中;线程T14可以将T14P1写入到存储库15中;线程T15可以将T15P1写入到存储库8中;并且线程T16可以将T16P1写入到存储库16中。
此第二方法是有效的,因为128个线程中的多组16个线程能够在每个写入步骤中写入到存储器106中的16个存储库(即,使得P1值中的所有128个P1值通过8个写入步骤被写入)。随后,可以将此有效写入过程再重复七次,以便使多个线程中的每个线程写入该线程的其他七个处理值中的每个处理值(即P2至P8中的每一者)。
示例3
参考图15C——该图示出了使用根据本文中描述的原理的第三方法写入到存储器106的多个处理值——可以理解示例3。图15C中所示出的处理值是由如图4和图5中所示出的多个线程处理的值——其中线程T1至T128各自在如本文中所描述的可分离运算的初始阶段中处理八个相应值(例如像素P1至P8)。
在示例3中,用于确定每个处理值将被写入到存储器106中的哪个存储器位置的写入缓冲器阵列包括对应于二维阵列的值的多组32个连续值元素,其中一个填充元素散布在该多组中的每一组之间。在示例3中,写入缓冲器阵列是一维元素序列,该一维元素序列包括:对应于将由线程T1写入的8个处理值的值元素(即T1P1、T1P2…T1P8);随后是对应于将由线程T2写入的8个处理值的值元素(即T2P1、T2P2…T2P8);随后是对应于将由线程T3写入的8个处理值的值元素(即T3P1、T3P2…T3P8);随后是对应于将由线程T4写入的8个处理值的值元素(即T4P1、T4P2…T4P8);随后是填充元素;随后是对应于将由T5写入的8个处理值的值元素(即T5P1、T5P2…T5P8);随后是对应于将由线程T6写入的8个处理值的值元素(即T6P1、T6P2…T6P8);随后是对应于将由线程T7写入的8个处理值的值元素(即T7P1、T7P2…T7P8);随后是对应于将由T8写入的8个处理值的值元素(即T8P1、T8P2…T8P8);随后是填充元素;以此类推,直到对应于将由线程T128写入的8个处理值的值元素(即T128P1、T128P2…T128P8)。
如本文中所描述,可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1306中写入处理值的存储器位置。该总和可用于确定写入缓冲器阵列中待写入的处理值所对应的元素——其中基本存储器地址是该写入缓冲器阵列内的第一元素。在示例3中,对于在多维阵列[I][J][K][M]内具有坐标[i][j][k][m]的值,写入偏移量等于(i×J×K×M)+(j×K×M)+(k×M)+m,并且写入填充量等于写入偏移量除以32(填充频率)。该除法可以是整数除法。
图15C示出了在将此写入缓冲器阵列映射到存储器106以使得实现以下情况时存储器106的内容:对应于二维阵列的值的处理值在写入缓冲器阵列的对应值元素所映射到的存储器位置中被写入到存储器106中,并且对应于二维阵列的值的处理值不在写入缓冲器阵列的填充元素所映射到的存储器位置中被写入到存储器106。在图15C中,写入缓冲器阵列的填充元素所映射到的存储器位置由“X”指示。为了易于说明,省略了多行存储器位置。
在示例3中,可以在多个写入步骤中的至少一个写入步骤中将相应处理值写入到存储器(例如图11的存储器106)的存储库中的每个存储库中。例如,参考图15C,在一个写入步骤中:线程T1可以将T1P1写入到存储库1中;线程T2可以将T2P1写入到存储库9中;线程T5可以将T5P1写入到存储库2中;线程T6可以将T6P1写入到存储库10中;线程T9可以将T9P1写入到存储库3中;线程T10可以将T10P1写入到存储库11中;线程T13可以将T13P1写入到存储库4中;线程T14可以将T14P1写入到存储库12中;线程T17可以将T17P1写入到存储库5中;线程T18可以将T18P1写入到存储库13中;线程T21可以将T21P1写入到存储库6中;线程T22可以将T22P1写入到存储库14中;线程T25可以将T25P1写入到存储库7中;线程T26可以将T26P1写入到存储库15中;线程T29可以将T29P1写入到存储库8中;并且线程T30可以将T30P1写入到存储库16中。
此第三方法是有效的,因为128个线程中的多组16个线程能够在每个写入步骤中写入到存储器106中的16个存储库(即,使得P1值中的所有128个P1值通过8个写入步骤被写入)。随后,可以将此有效写入过程再重复七次,以便使多个线程中的每个线程写入该线程的其他七个处理值中的每个处理值(即P2至P8中的每一者)。
示例4
参考图15D——该图示出了使用根据本文中描述的原理的第四方法写入到存储器106的多个处理值——可以理解示例4。图15D中所示出的处理值是由如图4和图5中所示出的多个线程处理的值——其中线程T1至T128各自在如本文中所描述的可分离运算的初始阶段中处理八个相应值(例如像素P1至P8)。
在示例4中,用于确定每个处理值将被写入到存储器106中的哪个存储器位置的写入缓冲器阵列包括对应于二维阵列的值的多组16个连续值元素,其中一个填充元素散布在该多组中的每一组之间。在示例4中,写入缓冲器阵列是一维元素序列,该一维元素序列包括:对应于子阵列1的线程T1至T8中的每个线程的第一处理值P1的值元素(即T1P1、T2P1…T8P1);随后是对应于针对子阵列1的线程T1至T8中的每个线程的第二处理值P2的值元素(即T1P2、T2P2…T8P2);随后是填充元素;随后是对应于子阵列1的线程T1至T8中的每个线程的第三处理值P3的值元素(即T1P3、T2P3…T8P3);随后是对应于针对子阵列1的线程T1至T8中的每个线程的第四处理值P4的值元素(即T1P4、T2P4…T8P4);随后是填充元素;以此类推,直到对应于针对子阵列1的线程T1至T8中的每个线程的第八处理值P8的值元素(即T1P8、T2P8…T8P8);随后是填充元素;随后是对应于子阵列2的线程T9至T16中的每个线程的第一处理值P1的值元素(即T9P1、T10P1…T16P1);随后是对应于子阵列2的线程T9至T16中的每个线程的第二处理值P2的值元素(即T9P2、T10P2…T16P2);随后是填充元素;以此类推,直到对应于针对子阵列2的线程T9至T16中的每个线程的第八处理值P8的元素(即T9P8、T10P8…T16P8);随后是填充元素;以此类推,直到对应于针对子阵列16的线程T121至T128中的每个线程的第八处理值P8的元素(即T121P8、T122P8…T128P8)。
如本文中所描述,可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1306中写入处理值的存储器位置。该总和可用于确定写入缓冲器阵列中待写入的处理值所对应的元素——其中基本存储器地址是该写入缓冲器阵列内的第一元素。在示例4中,对于在多维阵列[I][J][K][M]内具有坐标[i][j][k][m]的值,写入偏移量等于(i×J×K×M)+(j×K×M)+(m×K)+k,并且写入填充量等于写入偏移量除以16(填充频率)。该除法可以是整数除法。
图15D示出了在将此写入缓冲器阵列映射到存储器106以使得实现以下情况时存储器106的内容:对应于二维阵列的值的处理值在写入缓冲器阵列的对应值元素所映射到的存储器位置中被写入到存储器106中,并且对应于二维阵列的值的处理值不在写入缓冲器阵列的填充元素所映射到的存储器位置中被写入到存储器106。在图15D中,写入缓冲器阵列的填充元素所映射到的存储器位置由“X”指示。为了易于说明,省略了多行存储器位置。
在示例4中,可以在多个写入步骤中的至少一个写入步骤中将相应处理值写入到存储器(例如图11的存储器106)的存储库中的每个存储库中。例如,参考图15D,在一个写入步骤中:线程T1可以将T1P1写入到存储库1中;线程T2可以将T2P1写入到存储库2中;线程T3可以将T3P1写入到存储库3中;线程T4可以将T4P1写入到存储库4中;线程T5可以将T5P1写入到存储库5中;线程T6可以将T6P1写入到存储库6中;线程T7可以将T7P1写入到存储库7中;线程T8可以将T8P1写入到存储库8中;线程T17可以将T17P1写入到存储库9中;线程T18可以将T18P1写入到存储库10中;线程T19可以将T19P1写入到存储库11中;线程T20可以将T20P1写入到存储库12中;线程T21可以将T21P1写入到存储库13中;线程T22可以将T22P1写入到存储库14中;线程T23可以将T23P1写入到存储库15中;并且线程T24可以将T24P1写入到存储库16中。
此第四方法是有效的,因为128个线程中的多组16个线程能够在每个写入步骤中写入到存储器106中的16个存储库(即,使得P1值中的所有128个P1值通过8个写入步骤被写入)。随后,可以将此有效写入过程再重复七次,以便使多个线程中的每个线程写入该线程的其他七个处理值中的每个处理值(即P2至P8中的每一者)。
回到图13,在步骤S1308中,对于多个子阵列中的每个子阵列,多个线程中的每个线程通过多个读取步骤从存储器106中读取相应第二多个处理值,该第二多个处理值对应于在值阵列内相对于该值子阵列的转置位置中的值子阵列的垂直一维值序列。参考图4、图8、图14和表1可以理解这一点。
如图14中所示出,如果值阵列1400被转置,则该值阵列将有效地反映在对角线1402周围。与对角线1402相交的子阵列(即图14中所示出的子阵列1、6、11和16)在转置期间将不会改变位置(尽管该子阵列的多行值和多列值会被转置)。因此,例如,对于子阵列1,阵列1400内的转置位置中的子阵列是子阵列1。对于不与对角线1402相交的子阵列,该子阵列的位置将在阵列1400的转置期间改变。因此,例如,对于子阵列2,阵列1400内的转置位置中的子阵列是子阵列5。表1定义了相对于阵列1400内的子阵列中的每个子阵列处于转置位置的子阵列。
表1
因此,在示例中,在步骤S1306中,参考图4和图14,线程T1写入对应于子阵列1的一维值序列(例如列)内的八个值的八个处理值(例如T1P1、T1P2、T1P3、T1P4、T1P5、T1P6、T1P7和T1P8),该线程针对该子阵列执行可分离运算的初始阶段。在步骤S1308中,参考图4、图8和图14,线程T1读取对应于子阵列1(在阵列内相对于子阵列1处于转置位置的子阵列)的垂直一维值序列(例如列)内的八个值的八个处理值(例如T1P1、T2P1、T3P1、T4P1、T5P1、T6P1、T7P1和T8P1),该线程将针对该子阵列执行可分离运算的后一阶段。
在另一示例中,在步骤S1306中,参考图4和图14,线程T9写入对应于子阵列2的一维值序列(例如列)内的八个值的八个处理值(例如T9P1、T9P2、T9P3、T9P4、T9P5、T9P6、T9P7和T9P8),该线程针对该子阵列执行可分离运算的初始阶段。在步骤S1308中,参考图4、图8和图14,线程T9读取对应于子阵列5(在阵列内相对于子阵列2处于转置位置的子阵列)的垂直一维值序列(例如列)内的八个值的八个处理值(例如T33P1、T34P1、T35P1、T36P1、T37P1、T38P1、T39P1和T40P1),该线程将针对该子阵列执行可分离运算的后一阶段。
为了简明起见,本文将不会详尽列出在执行可分离运算的初始阶段之后由图4中所示出的其他线程中的每个线程针对图14中所示出的子阵列中的每个子阵列写入的处理值,以及在执行可分离运算的后一阶段之前由图8中所示出的其他线程中的每个线程读取的处理值。通过参考图4和图14,技术人员将不难确定由其他线程中的每个线程针对子阵列中的每个子阵列写入哪些处理值。如本文中所描述,通过比较图4与图8,本领域技术人员将不难确定由图8中所示出的其他线程中的每个线程读取哪些处理值。
可以根据读取缓冲器阵列来确定线程将从中读取处理值的存储库。步骤S1308中使用的读取缓冲器阵列可以具有与步骤S1306中使用的写入缓冲器阵列相同的特性——如本文中所描述。例如,读取缓冲器阵列可以是一维阵列。读取缓冲器阵列可以具有比二维值阵列中的元素数量多的元素数量。读取缓冲器阵列可以包括对应于二维阵列的值的多组连续值元素,以及散布在该多组之间的填充元素。在步骤S1308中使用的读取缓冲器阵列中的值和填充元素的相对数量可以对应于在步骤S1306中使用的写入缓冲器阵列中的值和填充元素的相对数量。
存储器的内容可以映射到读取缓冲器阵列的结构,使得从存储器中从映射到读取缓冲器阵列的值元素上的存储器位置中读取对应于二维阵列的值的处理值,并且不从存储器中从映射到读取缓冲器阵列的填充元素上的存储器位置中读取值。例如,通过将存储器106的第一行16个存储器位置映射到读取缓冲器阵列中的前16个元素(例如第1值至第16值),将存储器106的第二行16个存储器位置映射到随后16个元素(例如第17值至第32值),可以将图11的存储器106的内容映射到读取缓冲器阵列的结构。应理解,不需要从存储器106的第一(“左上”)存储器位置开始将存储器106映射到读取缓冲器阵列。相反,可以从在步骤S1306中写入处理值的第一存储器位置开始将存储器106映射到读取缓冲器阵列。
如本文中所描述,可以向值阵列中的每个值分配坐标[i][j][k][m]——该坐标定义了该值在如本文中所定义的多维阵列[I][J][K][M]内的位置。一般来说,在步骤S1306中将在多维阵列[I][J][K][M]内具有坐标[i][j][k][m]的处理值写入到存储器的线程可以在步骤S1308中从存储器中读入在多维阵列[I][J][K][M]内具有转置坐标(例如[j][i][m][k])的处理值。例如,如本文中所描述,在步骤S1306中,线程T1写入以下处理值:具有坐标[0][0][0][0]的T1P1;具有坐标[0][0][0][1]的T1P2;具有坐标[0][0][0][2]的T1P3;具有坐标[0][0][0][3]的T1P4;具有坐标[0][0][0][4]的T1P5;具有坐标[0][0][0][5]的T1P6;具有坐标[0][0][0][6]的T1P7;以及具有坐标[0][0][0][7]的T1P8。如本文中所描述,在步骤S1308中,线程T1读取以下处理值:具有坐标[0][0][0][0]的T1P1;具有坐标[0][0][1][0]的T2P1;具有坐标[0][0][2][0]的T3P1;具有坐标[0][0][3][0]的T4P1;具有坐标[0][0][4][0]的T5P1;具有坐标[0][0][5][0]的T6P1;具有坐标[0][0][6][0]的T7P1;以及具有坐标[0][0][7][0]的T8P1。
可以根据基本存储器地址、读取偏移量和读取填充量来确定线程在步骤S1308中读取处理值的存储器位置。读取偏移量和读取填充量可以取决于待读取的处理值所对应的值在值阵列内的位置(例如坐标)。可以根据基本存储器地址、读取偏移量和读取填充量的总和来确定线程将读取处理值的存储器位置。该总和可用于确定读取缓冲器阵列中待读取的处理值所对应的元素。下文提供了合适的读取偏移量的非限制性示例。读取填充量可以等于读取偏移量除以填充频率。该除法可以是整数除法。在步骤S1308中使用的填充频率可以等于在步骤S1306中使用的填充频率——如本文中所描述。
应理解,读取缓冲器阵列可以存在于物理存储器中(例如可以在寄存器库110中的寄存器中实现),使得在该读取缓冲器阵列的内容被传送到每个线程可访问的相应的一个或多个寄存器中之前,线程使得来自存储器的处理值被物理地读取到该读取缓冲器阵列中。替代地,读取缓冲器阵列可以是线程在概念上用于确定那些线程将从存储器中的哪些存储器位置中读取值的构造,其中将处理值直接从所确定的存储器位置中物理地读取到每个线程可访问的相应的一个或多个寄存器中。
在步骤S1308中,通过应用本文中描述的原理,在多个读取步骤中的至少一个读取步骤中从存储器(例如图11的存储器106)的存储库中的每个存储库中读取相应处理值。具体地说,通过应用本文中描述的原理,可以在多个读取步骤中的每个读取步骤中从存储器(例如图11的存储器106)的存储库中的每个存储库中读取相应处理值。也就是说,在步骤S1308中的读取期间,可以避免过量的存储库冲突。这可以通过回到上文参考图15A至图15D描述的四个具体示例来理解。
示例1
在示例1中在步骤S1308中使用的读取缓冲器阵列中的值和填充元素的相对数量可以对应于在示例1中在步骤S1306中使用的写入缓冲器阵列中的值和填充元素的相对数量,如本文中所描述。在示例1中,图15A中所示出的存储器106的内容可以映射到读取缓冲器阵列。可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1308中读取处理值的存储器位置。该总和可用于确定读取缓冲器阵列中待读取的处理值所对应的元素——其中基本存储器地址是该读取缓冲器阵列内的第一元素。如本文所述,通常,在步骤S1306将具有坐标[i][j][k][m]的处理值写入存储器的线程可以在步骤S1308从存储器读入具有转置坐标(例如,[j][i][m][k])的处理值。因此,在示例1中,在步骤S1306中写入具有坐标[i][j][k][m]的处理值的线程所使用的读取偏移量等于(j×J×K×M)+(i×K×M)+(m×M)+k,并且读取填充量等于读取偏移量除以8(填充频率)。该除法可以是整数除法。
在示例1中,可以在多个读取步骤中的至少一个读取步骤中从存储器(例如图11的存储器106)的存储库中的每个存储库中读取相应处理值。例如,参考图15A,在一个读取步骤中:线程T1可以从存储库1中读取T1P1;线程T2可以从存储库2中读取T1P2;线程T3可以从存储库3中读取T1P3;线程T4可以从存储库4中读取T1P4;线程T5可以从存储库5中读取T1P5;线程T6可以从存储库6中读取T1P6;线程T7可以从存储库7中读取T1P7;线程T8可以从存储库8中读取T1P8;线程T33可以从存储库9中读取T9P1;线程T34可以从存储库10中读取T9P2;线程T35可以从存储库11中读取T9P3;线程T36可以从存储库12中读取T9P4;线程T37可以从存储库13中读取T9P5;线程T38可以从存储库14中读取T9P6;线程T39可以从存储库15中读取T9P7;并且线程T40可以从存储库16中读取T9P8。此第一方法是有效的,因为128个线程中的多组16个线程能够在每个读取步骤中从存储器106中的16个存储库中读取(即,使得线程中的所有128个线程可以通过8个读取步骤读入一个相应处理值)。随后,可以将此有效读取过程再重复七次,以便多个线程中的每个线程读取分配给该线程的其他相应七个处理值中的每个处理值。
示例2
在示例2中在步骤S1308中使用的读取缓冲器阵列中的值和填充元素的相对数量可以对应于在示例2中在步骤S1306中使用的写入缓冲器阵列中的值和填充元素的相对数量,如本文中所描述。在示例2中,图15B中所示出的存储器106的内容可以映射到读取缓冲器阵列。可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1308中读取处理值的存储器位置。该总和可用于确定读取缓冲器阵列中待读取的处理值所对应的元素——其中基本存储器地址是该读取缓冲器阵列内的第一元素。如本文所述,通常,在步骤S1306将具有坐标[i][j][k][m]的处理值写入存储器的线程可以在步骤S1308从存储器读入具有转置坐标(例如,[j][i][m][k])的处理值。因此,在示例2中,在步骤S1306中写入具有坐标[i][j][k][m]的处理值的线程所使用的读取偏移量等于(j×J×K×M)+(i×K×M)+(m×M)+k,并且读取填充量等于读取偏移量除以16(填充频率)。该除法可以是整数除法。
在示例2中,可以在多个读取步骤中的至少一个读取步骤中从存储器(例如图11的存储器106)的存储库中的每个存储库中读取相应处理值。例如,参考图15B,在一个读取步骤中:线程T1可以从存储库1中读取T1P1;线程T2可以从存储库2中读取T1P2;线程T3可以从存储库3中读取T1P3;线程T4可以从存储库4中读取T1P4;线程T5可以从存储库5中读取T1P5;线程T6可以从存储库6中读取T1P6;线程T7可以从存储库7中读取T1P7;线程T8可以从存储库8中读取T1P8;线程T65可以从存储库9中读取T17P1;线程T66可以从存储库10中读取T17P2;线程T67可以从存储库11中读取T17P3;线程T68可以从存储库12中读取T17P4;线程T69可以从存储库13中读取T17P5;线程T70可以从存储库14中读取T17P6;线程T71可以从存储库15中读取T17P7;并且线程T72可以从存储库16中读取T17P8。
此第二方法是有效的,因为128个线程中的多组16个线程能够在每个读取步骤中从存储器106中的16个存储库中读取(即,使得线程中的所有128个线程可以通过8个读取步骤读入一个相应处理值)。随后,可以将此有效读取过程再重复七次,以便多个线程中的每个线程读取分配给该线程的相应其他七个处理值中的每个处理值。
示例3
在示例3中在步骤S1308中使用的读取缓冲器阵列中的值和填充元素的相对数量可以对应于在示例3中在步骤S1306中使用的写入缓冲器阵列中的值和填充元素的相对数量,如本文中所描述。在示例3中,图15C中所示出的存储器106的内容可以映射到读取缓冲器阵列。可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1308中读取处理值的存储器位置。该总和可用于确定读取缓冲器阵列中待读取的处理值所对应的元素——其中基本存储器地址是该读取缓冲器阵列内的第一元素。如本文所述,通常,在步骤S1306将具有坐标[i][j][k][m]的处理值写入存储器的线程可以在步骤S1308从存储器读入具有转置坐标(例如,[j][i][m][k])的处理值。因此,在示例3中,在步骤S1306中写入具有坐标[i][j][k][m]的处理值的线程所使用的读取偏移量等于(j×J×K×M)+(i×K×M)+(m×M)+k,并且读取填充量等于读取偏移量除以32(填充频率)。该除法可以是整数除法。
在示例3中,可以在多个读取步骤中的至少一个读取步骤中从存储器(例如图11的存储器106)的存储库中的每个存储库中读取相应处理值。例如,参考图15C,在一个读取步骤中:线程T1可以从存储库1中读取T1P1;线程T2可以从存储库2中读取T1P2;线程T3可以从存储库3中读取T1P3;线程T4可以从存储库4中读取T1P4;线程T5可以从存储库5中读取T1P5;线程T6可以从存储库6中读取T1P6;线程T7可以从存储库7中读取T1P7;线程T8可以从存储库8中读取T1P8;线程T9可以从存储库9中读取T33P1;线程T10可以从存储库10中读取T33P2;线程T11可以从存储库11中读取T33P3;线程T12可以从存储库12中读取T33P4;线程T13可以从存储库13中读取T33P5;线程T14可以从存储库14中读取T33P6;线程T15可以从存储库15中读取T33P7;并且线程T16可以从存储库16中读取T33P8。
此第三方法是有效的,因为128个线程中的多组16个线程能够在每个读取步骤中从存储器106中的16个存储库中读取(即,使得线程中的所有128个线程可以通过8个读取步骤读入一个相应处理值)。随后,可以将此有效读取过程再重复七次,以便多个线程中的每个线程读取分配给该线程的相应其他七个处理值中的每个处理值。
示例4
在示例4中在步骤S1308中使用的读取缓冲器阵列中的值和填充元素的相对数量可以对应于在示例4中在步骤S1306中使用的写入缓冲器阵列中的值和填充元素的相对数量,如本文中所描述。在示例4中,图15D中所示出的存储器106的内容可以映射到读取缓冲器阵列。可以根据基本存储器地址、写入偏移量和写入填充量的总和来确定线程在步骤S1308中读取处理值的存储器位置。该总和可用于确定读取缓冲器阵列中待读取的处理值所对应的元素——其中基本存储器地址是该读取缓冲器阵列内的第一元素。如本文所述,通常,在步骤S1306将具有坐标[i][j][k][m]的处理值写入存储器的线程可以在步骤S1308从存储器读入具有转置坐标(例如,[j][i][m][k])的处理值。因此,在示例4中,在步骤S1306中写入具有坐标[i][j][k][m]的处理值的线程所使用的读取偏移量等于(j×J×K×M)+(i×K×M)+(k×K)+m,并且读取填充量等于读取偏移量除以16(填充频率)。该除法可以是整数除法。
在示例4中,可以在多个读取步骤中的至少一个读取步骤中从存储器(例如图11的存储器106)的存储库中的每个存储库中读取相应处理值。例如,参考图15D,在一个读取步骤中:线程T1可以从存储库1中读取T1P1;线程T2可以从存储库9中读取T1P2;线程T3可以从存储库2中读取T1P3;线程T4可以从存储库10中读取T1P4;线程T5可以从存储库3中读取T1P5;线程T6可以从存储库11中读取T1P6;线程T7可以从存储库4中读取T1P7;线程T8可以从存储库12中读取T1P8;线程T33可以从存储库5中读取T9P1;线程T34可以从存储库13中读取T9P2;线程T35可以从存储库6中读取T9P3;线程T36可以从存储库14中读取T9P4;线程T37可以从存储库7中读取T9P5;线程T38可以从存储库15中读取T9P6;线程T39可以从存储库8中读取T9P7;并且线程T40可以从存储库16中读取T9P8。
此第四方法是有效的,因为128个线程中的多组16个线程能够在每个读取步骤中从存储器106中的16个存储库中读取(即,使得线程中的所有128个线程可以通过8个读取步骤读入一个相应处理值)。随后,可以将此有效读取过程再重复七次,以便多个线程中的每个线程读取分配给该线程的相应其他七个处理值中的每个处理值。
回到图13,在步骤S1310中,对于多个子阵列中的每个子阵列,使用多个线程,针对由多个线程读取的多个处理值执行可分离运算的后一阶段,以便针对转置位置中的值子阵列的每个值生成相应输出值。可以通过执行如本文中参考图10所描述的步骤S1004至S1010来执行步骤S1310。例如:通过使用如图8中所示出的线程T1至T8,可以针对如图14中所示出的子阵列1执行可分离运算的后一阶段;通过使用如图8中所示出的线程T33至T40,可以针对如图14中所示出的子阵列2执行可分离运算的后一阶段;通过使用如图8中所示出的线程T65至T72,可以针对如图14中所示出的子阵列3执行可分离运算的后一阶段;通过使用如图8中所示出的线程T97至T104,可以针对如图14中所示出的子阵列4执行可分离运算的后一阶段;并且通过使用如图8中所示出的线程T121至T128,可以针对如图14中所示出的子阵列16执行可分离运算的后一阶段。
在执行运算的后一阶段之后,多个线程中的每个线程(例如图8中所示出的每个线程)可以将该线程已生成的输出值区段写入到存储器(例如全局存储器108),使得对应于待执行运算的值阵列的每个值的输出值被写入到存储器(例如全局存储器108)。该写入也可以使用本文中描述的原理来执行,例如以便使在将输出值写入到全局存储器108时引起的存储库冲突的数量最小化。
写入到存储器(例如全局存储器108)的对应于值阵列的每个值的输出值可以是图13的方法的输出。
在上文参考图4、图8、图13和图14描述的说明性示例中,“水平地”执行步骤S1304中的可分离运算的初始阶段,并且“竖直地”执行步骤S1310中的可分离运算的后一阶段。应理解,替代地,步骤S1304中的可分离运算的初始阶段可以被“竖直地”执行,并且步骤S1310中的可分离运算的后一阶段可以被“水平地”执行。换句话说,在上文参考图4、图8、图13和图14描述的说明性示例中,在步骤S1306中,每个值子阵列的一维值序列是该值子阵列的一行值,并且在步骤S1308中,转置位置中的每个值子阵列的垂直一维值序列是转置位置中的该值子阵列的一列值。应理解,替代地,在步骤S1306中,每个值子阵列的一维值序列可以是该值子阵列的一列值,并且在步骤S1308中,转置位置中的每个值子阵列的垂直一维值序列可以是转置位置中的该值子阵列的一行值。
在本文中参考图13描述的方法的说明性示例中,在可分离运算的每个阶段中(例如在步骤S1304和S1310中),二维阵列的每个一维值序列可以划分成被分配给相应多个线程中的每个线程的多个值区段。例如,参考图5,值阵列400的第一行值500可以划分成可在运算的初始阶段中被分配给线程T1、T9、T17和T25的四个区段,并且参考图9,对应于值阵列800的第一列值900的处理值可以划分成可在运算的后一阶段中被分配给线程T1、T9、T17和T25的四个区段。在此说明性示例中,在运算的每个阶段期间,相邻线程可以协作以便完成一维运算的每个阶段——如本文中参考图10的步骤S1004至S1010所描述。应理解,在本文中参考图13描述的方法中,情况不必如此。也就是说,在替代示例中,在可分离运算的每个阶段中(例如在步骤S1304和S1310中),二维阵列的整个一维值序列可以被分配给多个线程中的每个线程。例如,参考图5,值阵列400的整个第一行值500可以在运算的初始阶段中(即在步骤S1304中)被分配给单个线程,并且参考图9,对应于值阵列800的整个第一列值900的处理值可以在运算的后一阶段中(即在步骤S1304中)被分配给该单个线程。在此替代示例中,该线程不需要与另一线程协作以便完成运算的每个阶段——因为该线程将在该线程的寄存器内具有对将在运算的每个阶段中运算的一维值序列的值中的所有值的访问,并且因此可以独立地完成运算的每个阶段(例如本文中参考图2描述的一维高斯运算)。
图16示出了可在其中实现本文中描述的处理单元的计算机系统。计算机系统包括中央处理单元(CPU)1602、图形处理单元(GPU)100、存储器108、神经网络加速器(NNA)1608,以及诸如显示器1616、扬声器1618和相机1622的其他设备1614。输入到本文中描述的方法的值阵列(例如图像和/或音频信号)可以由该其他设备1614中的一个或多个设备——例如相机1622和/或麦克风(图14中未示出)——来生成。本文中描述的方法的输出(例如经滤波的图像和/或经滤波的音频信号)可以被提供给该其他设备1614中的一个或多个设备——例如显示器1616和/或扬声器1618。一个或多个处理元件102在GPU 100上实现。在其他示例中,可以从计算机系统中省略所描绘的部件中的一个或多个部件。计算机系统的部件可经由通信总线1620彼此通信。
图1A和图1B的图形处理单元以及图16的计算机系统被示出为包括多个功能块。这仅是示意性的,并不旨在限定此类实体的不同逻辑元件之间的严格划分。每个功能块可以任何合适的方式提供。应当理解,由处理单元形成的本文描述的中间值不需要由处理单元在任何时间点物理地生成,并且可以仅表示方便地描述由处理单元在其输入与输出之间执行的处理的逻辑值。
本文中所描述的处理单元可体现在集成电路上的硬件中。本文中描述的处理单元可被配置成执行本文中描述的任一种方法。一般来说,上文描述的功能、方法、技术或部件中的任一者可以在软件、固件、硬件(例如固定逻辑电路系统)或它们的任何组合中实现。本文中可以使用术语“模块”、“功能性”、“部件”、“元件”、“单元”、“块”和“逻辑”来概括地表示软件、固件、硬件或它们的任何组合。在软件具体实现的情况下,模块、功能性、部件、元件、单元、块或逻辑表示程序代码,所述程序代码当在处理器上被执行时执行指定任务。本文中描述的算法和方法可由执行代码的一个或多个处理器执行,该代码使得处理器执行算法/方法。计算机可读存储介质的示例包含随机访问存储器(RAM)、只读存储器(ROM)、光盘、闪存存储器、硬盘存储器,以及可使用磁性、光学和其他技术来存储指令或其他数据并且可由机器访问的其他存储器装置。
如本文中所使用的术语计算机程序代码和计算机可读指令是指用于处理器的任何种类的可执行代码,包含以机器语言、解译语言或脚本语言表达的代码。可执行代码包含二进制代码、机器代码、字节代码、定义集成电路的代码(例如硬件描述语言或网表),以及用例如C、Java或OpenCL等编程语言代码表达的代码。可执行代码可以是例如任何种类的软件、固件、脚本、模块或库,当在虚拟机或其他软件环境中被适当地执行、处理、解译、编译、运行时,这些软件、固件、脚本、模块或库使得支持可执行代码的计算机系统的处理器执行由所述代码指定的任务。
处理器、计算机或计算机系统可以是任何种类的装置、机器或专用电路,或者它们的具有处理能力以使得其可执行指令的集合或部分。处理器可以是或包括任何种类的通用或专用处理器,诸如CPU、GPU、NNA、片上系统、状态机、媒体处理器、专用集成电路(ASIC)、可编程逻辑阵列、现场可编程门阵列(FPGA)等。计算机或计算机系统可包括一个或多个处理器。
本发明还旨在涵盖限定如本文中所描述的硬件的配置的软件,诸如HDL(硬件描述语言)软件,如用于设计集成电路或用于配置可编程芯片以执行期望功能。即,可以提供一种在其上编码有形式为集成电路定义数据集的计算机可读程序代码的计算机可读存储介质,当在集成电路制造系统中被处理(即运行)时,该计算机可读程序代码将该系统配置成制造被配置成执行本文描述的任何方法的处理单元,或者制造包括本文描述的任何设备的处理单元。集成电路定义数据集可以是例如集成电路描述。
因此,可以提供一种在集成电路制造系统处制造如本文所描述的处理单元的方法。此外,可以提供一种集成电路定义数据集,该集成电路定义数据集当在集成电路制造系统中被处理时,使制造处理单元的方法被执行。
集成电路定义数据集可以呈计算机代码的形式,例如作为网表,用于配置可编程芯片的代码,作为定义适合于在集成电路中以任何级别制造的硬件的硬件描述语言,包括作为寄存器传输级(RTL)代码,作为高级电路表示(诸如Verilog或VHDL),以及作为低级电路表示(诸如OASIS(RTM)和GDSII)。在逻辑上定义适合于在集成电路中制造的硬件的更高级表示法(例如RTL)可在计算机系统处进行处理,所述计算机系统被配置用于在软件环境的上下文中产生集成电路的制造定义,所述软件环境包括电路元件的定义以及用于组合这些元件以便产生由表示法如此定义的集成电路的制造定义的规则。如通常软件在计算机系统处执行以便定义机器的情况一样,可能需要一个或多个中间用户步骤(例如提供命令、变量等),以便将计算机系统配置成生成集成电路的制造定义,以执行定义集成电路以便生成该集成电路的制造定义的代码。
现在将参考图17描述在集成电路制造系统处处理集成电路定义数据集以便将该系统配置成制造处理单元的示例。
图17示出了集成电路(IC)制造系统1702的示例,该IC制造系统被配置成制造如本文任何示例中描述的处理单元。具体地说,IC制造系统1702包括布局处理系统1704和集成电路产生系统1706。IC制造系统1702被配置成接收IC定义数据集(例如,定义如本文任何示例中描述的处理单元),处理IC定义数据集,并且根据IC定义数据集来生成IC(例如,其体现如本文任何示例中描述的处理单元)。对IC定义数据集的处理将IC制造系统1702配置成制造体现如本文任何示例中描述的处理单元的集成电路。
布局处理系统1704配置成接收并处理IC定义数据集以确定电路布局。根据IC定义数据集确定电路布局的方法在本领域中是已知的,并且例如可以涉及合成RTL代码以确定待生成的电路的门级表示,例如就逻辑部件(例如NAND、NOR、AND、OR、MUX和FLIP-FLOP部件)而言。通过确定逻辑部件的位置信息,可以根据电路的门级表示来确定电路布局。这可以自动完成或者在用户参与下完成,以便优化电路布局。当布局处理系统1704已经确定电路布局时,其可将电路布局定义输出到IC生成系统1706。电路布局定义可以是例如电路布局描述。
如本领域中已知的,IC生成系统1706根据电路布局定义来生成IC。例如,IC生成系统1706可以实现用于生成IC的半导体装置制造工艺,所述半导体装置制造工艺可以涉及光刻和化学处理步骤的多步骤序列,在此期间,在由半导体材料制成的晶片上逐渐形成电子电路。电路布局定义可以呈掩模的形式,所述掩模可以在用于根据电路定义生成IC的光刻工艺中使用。可替代地,提供给IC生成系统1706的电路布局定义可呈计算机可读代码的形式,IC生成系统1706可使用所述计算机可读代码来形成用于生成IC的合适掩模。
由IC制造系统1702执行的不同过程可全部在一个位置中例如由一方来实施。可替代地,IC制造系统1702可以是分布式系统,使得一些过程可在不同位置处执行,并且可由不同方来执行。例如,以下阶段中的一些阶段可以在不同位置处以及/或者由不同方来执行:(i)合成表示IC定义数据集的RTL代码,以形成待生成的电路的门级表示;(ii)基于门级表示来生成电路布局;(iii)根据电路布局来形成掩模;以及(iv)使用掩模来制造集成电路。
在其他示例中,在集成电路制造系统处对集成电路定义数据集的处理可以将该系统配置成在不处理IC定义数据集以便确定电路布局的情况下制造处理单元。例如,集成电路定义数据集可以定义诸如FPGA的可重新配置的处理器的配置,并且对数据集的处理可将IC制造系统配置为(例如,通过将配置数据加载到FPGA)生成具有该定义的配置的可重新配置的处理器。
在一些实施例中,当在集成电路制造系统中被处理时,集成电路制造定义数据集可以使集成电路制造系统生成如本文所描述的装置。例如,由集成电路制造定义数据集以上文参照图17所描述的方式对集成电路制造系统进行的配置可以制造如本文所描述的装置。
在一些示例中,集成电路定义数据集可以包含在数据集处定义的硬件上运行的软件,或者与在数据集处定义的硬件组合运行的软件。在图17所示的示例中,IC生成系统可以由集成电路定义数据集进一步配置成在制造集成电路时根据在集成电路定义数据集处限定的程序代码将固件加载到所述集成电路上,或者以其它方式向集成电路提供与集成电路一起使用的程序代码。
与已知的具体实现相比,在本申请中阐述的概念在装置、设备、模块和/或系统中(以及在本文实施的方法中)的具体实现可以提高性能。性能改进可包含计算性能提高、时延减少、吞吐量增大和/或功耗减小中的一者或多者。在制造这类装置、设备、模块和系统(例如在集成电路中)期间,可在性能提高与物理具体实现之间进行权衡,从而改进制造方法。例如,可在性能改进与布局面积之间进行权衡,从而匹配已知具体实现的性能,但使用更少的硅。例如,这可以通过以串行方式重复使用功能块或在装置、设备、模块和/或系统的元件之间共享功能块来完成。相反,本申请中所阐述的带来装置、设备、模块和系统的物理具体实现的改进(例如,硅面积减小)的概念可与性能提高进行权衡。这可以例如通过在预定义面积预算内制造模块的多个实例来完成。
申请人据此独立地公开了本文所描述的每个单独的特征以及两个或更多个此类特征的任意组合,到达的程度使得此类特征或组合能够根据本领域技术人员的普通常识基于本说明书整体来实行,而不管此类特征或特征的组合是否解决本文中所公开的任何问题。鉴于前文描述,本领域技术人员将清楚,可以在本发明的范围内进行各种修改。

Claims (20)

1.一种在处理单元处对值阵列执行运算的计算机实现的方法,所述方法包括:
为了执行所述运算的阶段:
对于所述值阵列的一个或多个一维值序列中的每个一维值序列:
将所述一维值序列的相应值区段分配给多个线程中的每个线程;以及
所述多个线程中的第一线程;
确定从分配给所述第一线程的所述值区段到将由所述多个线程中的第二线程针对所述一维值序列的相邻值区段完成的所述运算的所述阶段的至少一个贡献;以及
将所述至少一个贡献写入到存储器;以及
所述多个线程中的所述第二线程:
从所述存储器中读取所述至少一个贡献;以及
根据从所述存储器中读取的所述至少一个贡献来完成针对分配给所述第二线程的所述相邻值区段的所述运算的所述阶段,以便生成处理值区段。
2.如权利要求1所述的方法,所述方法还包括:所述多个线程中的所述第一线程对分配给所述第一线程的所述值区段的一个或多个值的至少一个集合执行所述运算的所述阶段的至少一部分,以便确定从一个或多个值的所述至少一个集合到将由所述多个线程中的所述第二线程针对所述一维值序列的所述相邻值区段完成的所述运算的所述阶段的所述至少一个贡献。
3.如权利要求2所述的方法,所述方法还包括:
所述多个线程中的所述第二线程:
对分配给所述第二线程的所述相邻值区段的一个或多个值的至少一个集合执行所述运算的所述阶段的至少一部分,以便确定从所述相邻值区段的一个或多个值的所述至少一个集合到将由所述第一线程针对分配给所述第一线程的所述值区段完成的所述运算的所述阶段的至少一个贡献;以及
将由所述第二线程确定的所述至少一个贡献写入到所述存储器;以及
所述多个线程中的所述第一线程:
从所述存储器中读取由所述第二线程确定的所述至少一个贡献;以及
根据从所述存储器中读取的由所述第二线程确定的所述至少一个贡献来完成针对分配给所述第一线程的所述值区段的所述运算的所述阶段,以便生成处理值区段。
4.如权利要求2或3所述的方法,其中完成针对所述相邻值区段的所述运算的所述阶段包括:
所述第二线程对分配给所述第二线程的所述相邻值区段的一个或多个值的至少一个集合执行所述运算的所述阶段的至少一部分,以便确定从所述相邻值区段的所述一个或多个值中的每个值到所述运算的所述阶段的至少一个贡献;以及
将由所述第二线程针对所述相邻值区段确定的所述至少一个贡献与由所述第二线程从所述存储器中读取的所述至少一个贡献进行组合。
5.如权利要求1所述的方法,所述方法还包括:所述多个线程中的所述第一线程确定分配给所述第一线程的所述值区段的一个或多个值,作为从分配给所述第一线程的所述值区段到将由所述多个线程中的所述第二线程针对所述一维值序列的所述相邻值区段完成的所述运算的所述阶段的所述至少一个贡献。
6.如权利要求1至3中任一项所述的方法,其中所述多个线程由所述处理单元的核所包括的处理逻辑来处理,所述处理逻辑在芯片上实现,并且所述存储器在物理上与所述处理逻辑位于位于芯片上。
7.如权利要求6所述的方法,所述方法还包括:所述多个线程中的每个线程从另一存储器中读取分配给所述线程的所述值区段的所述值,所述另一存储器并在物理上与所述核不位于同一芯片上。
8.如权利要求1至3中任一项所述的方法,其中所述值阵列是像素值阵列、音频信号的音频样本阵列或传输信号的信号样本阵列。
9.如权利要求1至3中任一项所述的方法,其中所述值阵列是二维像素值阵列,并且所述运算是可分离滤波运算。
10.如权利要求9所述的方法,其中在所述可分离滤波运算的所述阶段期间,所述一维值序列的值根据一维滤波器内核来滤波,所述一维滤波器内核包括待滤波的值以及所述值序列中定位在所述值的一侧或两侧上的一个或多个值。
11.如权利要求9所述的方法,其中所述可分离滤波运算是可分离高斯滤波运算或可分离盒式滤波运算。
12.如权利要求10所述的方法,其中所述滤波器内核的半径小于或等于每个值区段中的值的数量的一半。
13.如权利要求1至3中任一项所述的方法,其中:
所述值阵列的所述一维值序列是所述值阵列的一行值;或者
所述值阵列的所述一维值序列是所述值阵列的一列值。
14.如权利要求1至3中任一项所述的方法,所述方法还包括:将由所述多个线程生成的所述处理值区段写入到所述存储器,使得对应于所述值阵列的每个值的处理值被写入到存储器。
15.如权利要求14所述的方法,其中所述运算的所述阶段是所述运算的初始阶段,所述值阵列是二维值阵列,所述运算是可分离运算,并且所述方法还包括:
为了执行所述运算的后一阶段:
对于所述二维值阵列的一个或多个垂直一维值序列中的每个垂直一维值序列:
向所述多个线程中的每个线程分配来自所述存储器的相应多个处理值,所述多个处理值对应于所述二维值阵列的所述垂直一维值序列的一维值区段;以及
所述多个线程中的第一线程;
确定从分配给所述第一线程的所述多个处理值到将由所述多个线程中的第二线程针对多个处理值完成的所述运算的所述后一阶段的至少一个贡献,所述多个处理值与所述二维值阵列的所述垂直一维值序列的一维值区段对应,所述一维值区段与所述垂直一维值序列的对应于分配给所述第一线程的所述多个处理值的所述一维值区段相邻;以及
将由所述第一线程确定的所述至少一个贡献写入到所述存储器;以及
所述多个线程中的所述第二线程:
从所述存储器中读取由所述第一线程确定的所述至少一个贡献;以及根据由所述第一线程确定的所述至少一个贡献来完成针对分配给所述第二线程的所述多个处理值的所述可分离运算的所述后一阶段,以便生成输出值区段。
16.如权利要求15所述的方法,所述方法还包括:
所述多个线程中的所述第一线程对分配给所述第一线程的所述多个处理值中的一个或多个值的至少一个集合执行所述可分离运算的所述后一阶段的至少一部分,以便确定从一个或多个值的所述至少一个集合到将由所述多个线程中的所述第二线程针对所述多个处理值完成的所述运算的所述后一阶段的至少一个贡献,所述多个处理值与所述二维值阵列的所述垂直一维值序列的所述一维值区段对应,所述一维值区段与所述垂直一维值序列的对应于分配给所述第一线程的所述多个处理值的所述一维值区段相邻;或者
所述多个线程中的所述第一线程确定分配给所述第一线程的所述多个处理值的一个或多个值,作为从分配给所述第一线程的所述多个处理值到将由所述多个线程中的所述第二线程针对所述多个处理值完成的所述运算的所述后一阶段的所述至少一个贡献,所述多个处理值与所述二维值阵列的所述垂直一维值序列的所述一维值区段对应,所述一维值区段与所述垂直一维值序列的对应于分配给所述第一线程的所述多个处理值的所述一维值区段相邻。
17.如权利要求15所述的方法,其中:
所述二维值阵列的所述一维值序列是所述二维值阵列的一行值,并且所述二维值阵列的所述垂直一维值序列是所述二维值阵列的一列值;或者
所述二维值阵列的所述一维值序列是所述二维值阵列的一列值,并且所述二维值阵列的所述垂直一维值序列是所述二维值阵列的一行值。
18.如权利要求1至3中任一项所述的方法,所述方法还包括:
接收二维图像;
将所述二维图像划分成多个重叠图块,每个图块包括二维像素值阵列;以及
对每个图块的所述二维像素值阵列执行如权利要求1至3中任一项所述的方法。
19.一种用于对值阵列执行运算的处理单元,所述处理单元包括处理逻辑和存储器,所述处理逻辑被配置成:
为了执行所述运算的阶段:
对于所述值阵列的一个或多个一维值序列中的每个一维值序列:
将所述一维值序列的相应值区段分配给多个线程中的每个线程;以及
由所述多个线程中的第一线程;
确定从分配给所述第一线程的所述值区段到将由所述多个线程中的第二线程针对所述一维值序列的相邻值区段完成的所述运算的所述阶段的至少一个贡献;以及
将所述至少一个贡献写入到所述存储器;以及
由所述多个线程中的所述第二线程:
从所述存储器中读取所述至少一个贡献;以及
根据从所述存储器中读取的所述至少一个贡献来完成针对分配给所述第二线程的所述相邻值区段的所述运算的所述阶段,以便生成处理值区段。
20.一种非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质上存储有计算机可读指令,当在计算机系统处被执行时,所述计算机可读指令使得所述计算机系统执行在处理单元处对值阵列执行运算的计算机实现的方法,所述方法包括:
为了执行所述运算的阶段:
对于所述值阵列的一个或多个一维值序列中的每个一维值序列:
将所述一维值序列的相应值区段分配给多个线程中的每个线程;以及
所述多个线程中的第一线程;
确定从分配给所述第一线程的所述值区段到将由所述多个线程中的第二线程针对所述一维值序列的相邻值区段完成的所述运算的所述阶段的至少一个贡献;以及
将所述至少一个贡献写入到存储器;以及
所述多个线程中的所述第二线程:
从所述存储器中读取所述至少一个贡献;以及
根据从所述存储器中读取的所述至少一个贡献来完成针对分配给所述第二线程的所述相邻值区段的所述运算的所述阶段,以便生成处理值区段。
CN202311759264.0A 2022-12-21 2023-12-19 在处理单元处对值阵列执行运算 Pending CN118227516A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GB2219374.2 2022-12-21
GB2219374.2A GB2620810A (en) 2022-12-21 2022-12-21 Performing a separable operation on a two-dimensional array of values at a processing unit comprising a memory
GB2219375.9 2022-12-21

Publications (1)

Publication Number Publication Date
CN118227516A true CN118227516A (zh) 2024-06-21

Family

ID=85035640

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311759264.0A Pending CN118227516A (zh) 2022-12-21 2023-12-19 在处理单元处对值阵列执行运算

Country Status (2)

Country Link
CN (1) CN118227516A (zh)
GB (1) GB2620810A (zh)

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060245642A1 (en) * 2005-04-29 2006-11-02 Stmicroelectronics S.R.L. Software implemented image generating pipeline using a dedicated digital signal processor
US10768899B2 (en) * 2019-01-29 2020-09-08 SambaNova Systems, Inc. Matrix normal/transpose read and a reconfigurable data processor including same

Also Published As

Publication number Publication date
GB2620810A (en) 2024-01-24
GB202219374D0 (en) 2023-02-01

Similar Documents

Publication Publication Date Title
US11157592B2 (en) Hardware implementation of convolutional layer of deep neural network
US11886536B2 (en) Methods and systems for implementing a convolution transpose layer of a neural network
US20200202198A1 (en) Neural network processor
EP3757901A1 (en) Schedule-aware tensor distribution module
EP4030302A1 (en) Buffer addressing for a convolutional neural network
US20230394615A1 (en) Task execution in a simd processing unit with parallel groups of processing lanes
EP3093757B1 (en) Multi-dimensional sliding window operation for a vector processor
US20210174180A1 (en) Hardware Implementation of a Neural Network
US11106968B1 (en) Circuit arrangements and methods for traversing input feature maps
CN110490308B (zh) 加速库的设计方法、终端设备及存储介质
CN111767243A (zh) 数据处理方法、相关设备及计算机可读介质
CN118227516A (zh) 在处理单元处对值阵列执行运算
CN118227515A (zh) 在包括存储器的处理单元处对二维值阵列执行可分离运算
EP4391376A1 (en) Performing a separable operation on a two-dimensional array of values at a processing unit comprising a memory
US20210174181A1 (en) Hardware Implementation of a Neural Network
US20240231826A1 (en) Performing an operation on an array of values at a processing unit
GB2580179A (en) Tile-based scheduling
US20240231913A1 (en) Performing a separable operation on a two-dimensional array of values at a processing unit comprising a memory
CN111562979B (zh) 内存分配
GB2585810A (en) Buffer addressing for a convolutional neural network
US20220092731A1 (en) Downscaler and Method of Downscaling
GB2625215A (en) Implementation of a neural network
GB2611658A (en) Hardware implementation of a neural network
GB2622455A (en) Compressing a neural network
GB2602494A (en) Implementing fully-connected neural-network layers in hardware

Legal Events

Date Code Title Description
PB01 Publication