CN113448586A - 自动编译器数据流优化的集成 - Google Patents
自动编译器数据流优化的集成 Download PDFInfo
- Publication number
- CN113448586A CN113448586A CN202011539114.5A CN202011539114A CN113448586A CN 113448586 A CN113448586 A CN 113448586A CN 202011539114 A CN202011539114 A CN 202011539114A CN 113448586 A CN113448586 A CN 113448586A
- Authority
- CN
- China
- Prior art keywords
- memory
- streams
- loop
- compiler
- values
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
- G06F8/4435—Detection or removal of dead or redundant code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/445—Exploiting fine grain parallelism, i.e. parallelism at instruction level
- G06F8/4452—Software pipelining
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
各种实施例大体涉及优化用于空间架构(例如,可配置空间加速器)的自动转换框架(例如,编译器、运行时等)中的数据流,该自动转换框架将高级别用户代码转换成使用“流”的形式(例如,等待时间不敏感的通道、行缓冲区),以减少开销、消除或提高冗余存储器存取的效率并提高整体吞吐量。
Description
技术领域
本文所描述的实施例总体上涉及在自动转换框架中优化数据流。
背景技术
在计算中,控制流可能与操作(例如,各个语句、指令或函数调用的执行或评估)的可能顺序有关,诸如操作之间的“优先约束”。数据流可能与通过程序或系统将数据路由到何处以及在路由期间对数据应用哪些转换有关。
传统上,可以以若干方式来实现某些计算过程的优化。例如,可以通过优化硬件架构(诸如微处理器或图形处理单元(GPU))上的寄存器数量来减少存储器操作的数量并且可以利用数据重用。在另一个示例中,并行编译器可以被设计和配置成用于优化控制流代码。
附图说明
图1示出示例CSA。
图2A示出代码的第一示例。
图2B示出代码的第二示例。
图3A示出代码的第三示例。
图3B示出代码的第四示例。
图3C示出代码的第五示例。
图4A示出代码的第六示例。
图4B示出代码的第七示例。
图4C示出代码的第八示例。
图4D示出代码的第九示例。
图5示出代码的第十示例。
图6A示出dgemm的示例收缩实现方式。
图6B示出代码的第十一示例。
图6C示出第一维度的示例收缩实现方式。
图7示出示例计算架构。
图8示出示例通信架构。
图9示出示例流程图。
图10A示出代码的第十二示例。
图10B示出代码的第十三示例。
图10C示出代码的第十四示例。
图10D示出代码的第十五示例。
图10E示出代码的第十六示例。
具体实施方式
各种实施例大体涉及优化用于空间架构(例如,可配置空间加速器)的自动转换框架(例如,编译器、运行时等)中的数据流,该自动转换框架将高级别用户代码转换成使用“流”的形式(例如,等待时间不敏感的通道、行缓冲区),以减少开销、消除或提高冗余存储器存取的效率并提高整体吞吐量。
如将在下面进一步描述的,可以经由至少两组不同的自动编译器转换来实现自动数据流优化:(i)对编译器中现有的高级循环转换过程进行一系列增强以用于流感知,这可以以各种方式扩展循环转换过程的作用域,并为数据流架构实例化(诸如可配置空间加速器(CSA))带来更好的代码生成;以及(ii)新颖的数据流任务优化,其将至少使用标准的并行for循环方式编写的代码转换为将存储器存取分为计算中的单独任务的形式,其中任务可以使用不需要存储器存取的新数据流构造相互通信。
空间架构
图1示出了根据本公开的一个或多个实施例的示例可配置空间加速器(CSA)100。CSA 100的架构是针对数据流图的执行的空间架构的示例。可以理解的是,可以将CSA 100设计和配置为与传统x86核一起运行,从而允许该核维护传统支持并处理在传统核上可能更高效或更容易的其他计算任务。
如图所示,CSA 100可以以处理元件(PE)以及存储器接口102和管芯上互连网络104的异构阵列的形式实现。CSA 100可以被配置成用于执行一个或多个数据流图。数据流图一般可以指在对序列化代码的编译时出现的显式并行的程序描述。CSA 100可以允许数据流图被直接配置到CSA阵列上,例如,并非被转换为顺序指令流。数据流图从顺序编译流中的派生允许CSA 100的实施例支持熟悉的编程模型并直接执行具有最小修改的现有的高性能计算(HPC)代码。
如图1中所示,存储器接口102可耦合至存储器以允许CSA 100将数据存取(例如,加载和/或存储)到(例如,管芯外)存储器。PE阵列可以是异构的,例如使得没有PE支持完整的CSA数据流架构和/或一个或多个PE被编程(例如,定制)以执行仅一些但高度高效的操作。CSA 100可包括以下一者或多者:整数算术PE、浮点算术PE、通信电路系统和结构内存储。在示例中,对于特定的数据流图,每一个PE仅处理图中的一个或两个操作。
在数据流图中,CSA的通信弧可被称为等待时间不敏感通道(LIC),其允许按顺序、背压、点对点通信。在示例中,LIC(连同其他合适类型的缓冲区,诸如行或数据缓冲区)在本文中可以被称为“流”。可以以流水线方式、在不多余一个周期等待时间的情况下实现数据流图通道。此外,CSA编译器可以负责通过命令式输入语言(例如,通过并行注释增强的C、C++、Fortran)进行控制流到数据流的转换。
CSA架构的独特方面在于数据流结构中可用的资源总数可能受到限制,因此,可能需要仔细考虑以将大型并行循环主体适配到CSA架构上。当前,应用程序依靠编译器来优化数据重用并在CSA内部的多个处理单元上复制工作。可以理解,CSA上的并行循环可以被动态地流水线化,例如,可以在先前的迭代完成之前开始执行后面的迭代。CSA上的有效性能可以经由循环主体的流水线化执行和循环主体的物理复制来实现,每个循环主体都可以进行流水线化。但是,当今的编译器优化并未充分利用CSA通信通道,这可能导致生成CSA的次优代码。为了生成用于数据流架构的最优代码,本文描述了新颖的自动编译器转换。
自动编译器转换
根据实施例,对传统编译器循环转换的增强可包括:(i)适用于循环嵌套模式(在本文中也可以称为嵌套循环),包括短行程计数内循环,该内循环具有相对于外循环不变的一组加载,并且进一步实现循环缓冲,该循环缓冲允许重用来自流的值,从而减少冗余存储器存取(例如,扩展循环不变代码移动),(ii)扩展循环承载的标量替换,以通过使用值的滚动窗口使内循环在流上可用(例如,超出循环承载的标量替换),从而在内循环中处理类似模板的存储器存取,(iii)增强完整的展开转换,以允许以后通过使用流的单元跨度存取来进行此类展开的循环内的存储和加载,这可以实现展开的所有优点(诸如在循环内寄存其他数组存取),并且同时不对存储和加载的非单元跨度存取转换付出任何惩罚,以及(iv)使用流增强展开和收缩转换,使得避免因增加变量移位和轮转而产生的开销。
根据进一步的实施例,新的编译器优化可包括将一个或多个复杂的嵌套循环或循环嵌套(诸如矩阵乘法或模版计算)自动转换为对数据流友好的形式,该形式经由以下组合对于空间架构更高效:将存储器操作提取到流中,创建可流水线化的并发任务,和/或使用流在这些任务之间进行通信。
优点
由于各种原因,本文所描述的实施例和示例是有利的。例如,对于高性能计算(HPC)和非HPC工作负载,可以获得CSA架构(和其他相关的数据流架构)的峰值性能。在另一个示例中,由于CSA编译器可以自动转换用例如C、C++、具有OpenMP注释的Fortran、DPC++、SYCL、OpenCL等编写的用户程序以创建(例如,使用中间表示(IR)流)可流水线化的并行任务,因此可以实现总体效率和可移植性。因此,无需改变程序就可以获得最优的数据重用和更高的吞吐量。
使用流增强现有编译器循环转换以及
自动数据流任务编译器转换
如上所述,与CSA相关联的LIC可以表示数据流图中的通信弧,并且可以用于在各种并行任务(例如,在数据流结构上并发执行的循环嵌套)中的流水线阶段之间传递数据。
根据一个或多个实施例,至少三个主要内置函数可以实现或与一个或多个流(例如,“init(初始化)”、“read(读)”和“write(写)”)一起使用。例如,“int Builtin_csa_lic_init(sizeof(T),size_tdepth,size_t pref_depth)”可以创建类型为“T”的LIC,并且可以将其深度初始化为两种大小:避免死锁并产生正确结果的最小缓冲区大小的depth(深度),以及代表最佳性能的“pref_depth”。在另一个示例中,“void Builtin_csa_lic_write(intlic,T value)”可以在缓冲区中插入新元素。在又一进一步的示例中,“Tbuiltin_csa_lic_read((T)0,int lic)”可以移除缓冲区中的后续元素(例如,下一个元素)。
上述内置函数可用于在编译器中实现新的基于流的操作,诸如轮转、合并、分散、广播和移位。在示例中,轮转可以是通过将数据复制到流中而仅加载一次来减少存储器操作数的操作,合并可以是将多个流的结果合并在一起并写入一个流的多对一操作,分散可以是合并的对偶操作(例如,一对多),广播可以表示一个生产者与多个消费者之间的通信,移位可以是用于维持值的滚动窗口的操作,例如,当每次执行移位时,一个值在一端丢弃,而在另一端加载新的值。与基于流的操作有关的细节(轮转、合并、分散、广播、移位)分别在图10A至图10E中描述,并在下面进一步描述。
可以理解的是,为了易于理解,使用C++和各种注释的混合,以伪代码的形式给出了图中所示和本文所描述的所有代码示例。可以进一步理解的是,转换是作为循环优化框架的一部分在编译器内部执行的,并且对编译器中间表示(IR)进行操作。在一些示例中,即使编译器转换仅修改较小的区域(诸如单个最内层的循环),示例也可以列出较大的代码区域(诸如循环嵌套)。
使用流增强现有编译器循环转换
如上所述,可以实现对传统编译器循环优化的增强,以使它们是“流感知”的。在示例中,与简单寄存器相比,这些增强可以经由使用“流”中可用的额外存储来扩大传统优化的作用域并进一步扩展性能效益。因此,在数据流结构中的应用执行期间,可以在流中保存或存储更多的值,这(例如,通过提高存储器和高速缓存带宽利用率)减少了存储器存取的总数并使存储器存取更高效。
在进一步的示例中,增强可以以直接的方式集成到传统的优化编译器中的现有高级别循环转换中。传统优化编译器中的高级别循环优化框架通常根据周围的循环索引来分析仿射存储器存取。此外,可以分析循环中暴露的并行性,然后可以基于与缺乏循环承载依赖性相关联的信息(例如,该信息可以由用户提供,可以基于此框架中的编译器自动并行分析来得出该信息)将该循环转换为动态流水线循环(例如,当针对数据流架构时)。
对于以下描述的每个编译器转换,可以理解的是,可以使用核循环嵌套。可以进一步理解的是,在以下示例中(例如,基于用户最初使用C++编写的源代码),用户可以经由“OpenMP parallel for”注释表示在循环嵌套的多个层级中的并行性,其中注释被伪代码捕获为每个此类循环上的“循环标记并行”注释。传统的优化编译器可以使用注释来执行数据流架构中循环的动态流水线,然后可以利用流的优点,从而允许更高的值重用率并导致程序中存储器存取的更好优化。
(i)循环缓冲,以允许重用流中的值,从而减少冗余存储器存取
根据一个或多个实施例,循环缓冲可以涉及使用缓冲区来循环数据,其中可以从存储器中提取或泵送第一数据流。此后,同一数据可以多次重用,而无需附加的存储器操作。在传统的编程和编译器优化中,上述缓冲区可以是驻留在存储器中的阵列。但是,使用流扩展,由于流缓冲区实际上充当了存储,因此不需要对存储器的冗余存取或到存储器的冗余行程。
在示例中,应用代码中的一种常见模式可以是嵌套循环(或循环嵌套),该嵌套循环具有带有一组加载的短行程计数最内层的循环(例如,取决于最内层的循环索引),该组加载相对于(例如,可能具有大的行程计数的)外循环不变。可以理解的是,行程计数可以指循环执行或被调用的最小次数。如果最内层的循环没有被编译器完全展开,则可能存在冗余的存储器存取,这可能使高速缓存和存储器子系统紧张,从而降低性能。在进一步的示例中,QCD基准(例如,捕获大型复杂C++应用的热点的核)在其主计算中包含多级别循环嵌套,其中内部mu循环从“U”中读取一组九个值,并且在外部“s”循环的每次迭代中重新读取该组值。
图2A示出了根据本公开的一个或多个实施例的代码200的示例。如图所示,编译器可以完全展开“c1”和“c2”循环,并且因此,在每个“s”循环迭代中公开了U数组的72次存取。如果“mu”循环也已完全展开,则数组值的标量替换可将U数组引用转换为可以从“s”循环中移除的标量引用。但是,“mu”循环的主体可能太大,无法完全展开,并且无法应用标量化。
图2B示出了根据本公开的一个或多个实施例的代码220的示例。如图所示,通过将每个“s”循环迭代中所需的U值加载到流(或高级别LIC)中,可以在“mu”循环内将LIC中的值重新循环(例如,八次)。可以理解的是,在mu循环的每次迭代中使用存储在LIC中的不同值,其中轮转确保从流中仅存在一个读取位点。例如,可能存在九个流(例如,九个LIC),一个流与每个“c1”-“c2”对相对应。至少为此,可以实现大块值的循环不变代码运动。在代码220中,可以在“s”循环之外(但仍在“site(位点)”循环内)将U值读取到LIC中,并在“mu”循环内重用。
可以理解的是,U具有数据类型“ComplexD”,并且内置流可以支持数据类型double和其他原始类型的值,使得分别处理U元素的实部和虚部。此外,“轮转”功能(参见图10A和下面的相对应描述)可以有效地从流返回值,并且对于从零到“Ls”的“s”的每个值,流中可以用于将来的重用的值被保留。因此,U加载的总数可以减少Ls倍,这促进了改进的高速缓存带宽利用率和效率。
在示例中,流感知轮转转换中的附加分析可以是至少部分地基于循环索引的使用和用于证明整个外循环的不变性的循环承载的数据相关性分析来标识循环嵌套中的一组存储器存取的循环不变性。可以理解的是,可能存在可以被编译器完全展开的内循环(诸如在c1和c2循环中),使得可以为每个此类展开的实例使用单独的流。可以写入单个流并轮转的一组值可以适合该流的长度。
如图2B中所示,上述编译器代码转换因此可以涉及在适当的循环层级结构上创建循环嵌套(或循环),以从存储器中加载值(避免任何冗余)并写入到LIC中。编译器可以用并行注释标记新循环,以启用动态流水线。此外,这可能涉及修改具有冗余存储器存取的原始循环嵌套,以从相对应的LIC读取值并且对于外循环的连续迭代轮转值,并进一步确保新创建的循环(L1)和原始循环(L2)被标记为并行任务(带有适当的IR注释),使得循环可以并发执行。可以理解的是,可以基于任务执行的数据流语义来观察通过流的写-读相关性。
(ii)扩展循环承载的标量替换转换
传统的循环承载的标量替换引用可以通过将数组引用转换为标量引用来减少存储器存取的总数,这可以用作任何架构的重要优化技术,诸如模板代码,其中可能存在大量的存储器存取,这些存取从循环的一次迭代到下一次迭代重复进行。例如,从一次迭代到下一次迭代的值可以被保存在寄存器中,并且下一次迭代可以重用来自寄存器而不是来自存储器的值。
图3A示出了根据本公开的一个或多个实施例的代码300的示例。如图所示,标量替换之前的原始循环显示在顶部,标量替换之后的经转换的循环显示在底部。如进一步所示,在循环中所有标量替换的数组引用都可以是显式的,使得可以将每个存储器存取更改为使用标量。在某些情况下,加载源自不同的内循环(例如,必须首先完全展开以使得所有存储器存取是显式的),除非完全展开内循环,否则可能不发生标量替换。
图3B示出了根据本公开的一个或多个实施例的代码320的示例。如图所示,例如,当将存储语句替换为内循环时,编译器将不执行标量替换。
图3C示出了根据本公开的一个或多个实施例的代码340的示例。如图所示,代码340是例如一维(1D)模板中的移位操作的应用(参见图10E和下面的相对应描述)。在一些示例数据流架构中,可以通过使用值的滚动窗口将循环承载的标量替换应用于流(与标量相反)。例如,在每个输出位置,可以丢弃在先前位置使用的一个输入值,并可以从存储器中加载新值。至少为此,可以针对计算的每个点将一个输入值移出/移入。有利地,前述编译器转换增强允许减少存储器存取(如在传统的标量替换中一样),但是不需要内循环的完全展开。
如上所述,如果最内层的k循环(在窗口上)已完全展开,则传统的编译器可能能够通过应用循环承载的标量替换优化来减少总存储器存取。但是,流的使用有利地实现了相同的优化,而无需展开k循环。通过按原样保留内循环,可以更大程度地展开外循环,这实现在同一图形空间中数据流架构的更高的总体计算性能和更好的资源使用率。此外,外循环展开在每个周期中将存储器存取扩展到不同的高速缓存行,并且可以导致更好的存储器子系统利用率,从而转化为更高的性能。
(iii)完全展开转换增强以生成存储和加载
根据一个或多个实施例,对于嵌套循环(或循环嵌套)中的一次或多次存储器存取模式,在外循环内部完全展开内循环可在整个外循环迭代的存储器存取中创建非单元跨度。因此,该跨度可能禁用在可能需要单元跨度存取的架构中生成流存储器操作。可以理解的是,跨度可以指数组的跨度(也可以称为增量、间距或步长),其是存储器中连续数组元素的起点之间的位置数,并且以数组元素大小为单位(例如,字节)度量;例如,跨度大小与其每个元素大小完全相同的数组在存储器中可以是连续的,并且可以称为具有单元跨度或者是单元跨度的。在示例中,流和流存取的实现通过最大化存储器带宽利用率来提高性能。例如,在CSA架构中,标量存储操作可导致每两个周期执行一次存储,而使用流的存储器操作可导致每三个周期执行两次存储。
在一个示例中,将多个流的结果组合成单个流的合并操作(参见图10B和下面的相对应描述)可以用于通过在两个循环之间传递流而将非单元跨度存取转换为单元跨度存取,如下所述。因此,在示例中,合并操作允许编译器执行循环的完全展开(如在传统编译器中所做的那样),但经由使用流来提高存储器带宽进一步改善了该过程。
图4A示出了根据本公开的一个或多个实施例的代码400的示例。如代码400中所示,“kmeans”基准中包含“hot”循环并且“BLOCK_FACTOR”的值可以是64。核计算可能发生在中间i循环(例如,“numFeatures”循环)中,并且之后,最终值可以在最后一次“rowIndex”循环中存储到“inner_product”数组中,该“rowIndex”循环可以完全展开64次。最外层的k循环可被标记为并行,并且可以调用了可能由编译器内联的函数“InnerProductAllNoMallocNoXScaleICXCSA()”。核计算可能在包含内部“rowIndex”循环的i循环中,该“rowIndex”循环被编译器完全展开,从而产生一组64个总和减少(sum-reduction)。然后可以是将减少的值存储到inner_product数组中的存储循环。
图4B示出了根据本公开的一个或多个实施例的代码420的示例。使用上述合并操作,可以由编译器优化最后一个最内层的循环,该循环被标记为“循环10”(顶部的代码),以执行或进行底部所示的代码。
在底部代码420中,仍然发生“循环10_1”的完全展开(因子为64),但是将值写入流数组(例如,LIC数组),而不是直接执行存储。因此,例如,至少来自LIC数组的值全部“合并”以创建单个LIC,并且在随后的(例如,流水线化的)“L10_2循环”中,可以通过从单个LIC中读取来存储值。至少在这方面,存储现在在循环中可以是单元跨度的,并且不展开该循环,这导致流存储带宽最大化。
图4C示出了根据本公开的一个或多个实施例的代码440的替代示例。在代码440中所示的替代表示中,编译器转换可以确定创建一组存储循环,通过将迭代空间划分为两个(或四个或八个等)块,每个存储循环可以导致单个流存储操作,如图所示。
因此,代码440允许在每个周期中(使用数据流结构中的不同功能单元)执行多个流存储操作。在示例中,确定要使用多少个循环(例如,合并的流)还可以考虑由循环的每个实例化存储的多个单独元素,以确保每个循环实例覆盖整个高速缓存行。
图4D示出了根据本公开的一个或多个实施例的代码460的又另一个示例。基于分散操作(参见图10C和下面的相对应描述),可以使用类似但不同的技术将非单元跨度存储器加载循环转换为单元跨度存储器加载循环,如图4D的代码460中所示的两列所示。例如,左列示出了正在转换为单元跨度(右列)的非单元跨度。
因此,如上所述,可以增强或修改由编译器循环优化框架执行的完全展开转换,以经由流执行上述附加转换,以通过流存储器操作(例如,流加载和存储)的生成来提高带宽。
(iv)展开和收缩:向量相乘
根据一个或多个实施例,“展开和收缩(unroll-and-squash)”可以是“展开和挤压(unroll-and-jam)”的替代优化技术。例如,在展开和收缩中,可以经由流水线化并行执行许多不同的外循环迭代和内循环迭代,而不是创建循环主体的多个副本。
由于编译器转换的通常实现需要添加变量移位和轮转并在内循环外部创建序言和结语代码,因此附加逻辑可能引入循环承载的相关性,并且可能造成数据流架构上额外的开销。但是,经由流的实现方式更有效,因为它允许直接映射到硬件并且不引入额外的相关性。
图5示出了根据本公开的一个或多个实施例的示例代码500。为了便于说明,在代码500中提供了一个简单的向量相乘示例,该示例示出了原始代码以及带有和不带有流的两种实现方式。如代码500中所示,左列示出无流的代码而右列示出有流的代码。原始代码可以如下:
自动数据流任务编译器转换
根据一个或多个实施例,可以实现新的基于流的编译器转换。为了最大化可移植性和代码重用,新颖的优化过程可以自动将代码转换为使用流。例如,可以将存储器操作提取到流中,然后可以创建可流水线化的并发任务,这些任务可以经由流彼此通信。下面将进一步描述用于新颖转换的伪算法以及对双精度通用矩阵-矩阵乘法(“dgemm”)和(例如,1D、2D)模板的应用。
(i)伪算法
在示例中,分布设计选择包括经由使用展开的复制来在CSA处理单元之间分布输入元素。例如,如果核由执行融合乘-加(FMA)计算的二维循环组成,则由于CSA上可能总共有256个FMA,因此一种设计选择可以是创建16x16位点(例如,处理元件)或“工作者”,其中每个循环可以展开16次(例如,因此可以将“展开因子”视为16x16)。该示例设计可以通过使用特定成本模型的编译器或关于如何复制核的用户输入来完全执行。
在进一步的示例中,可以创建数据并将其加载到流中。存储器操作可在核中被提取并加载到新循环。至少部分地基于上述分配设计选择,可以创建用于这些存储器操作中的每一个的流。例如,流可以是具有任何合适维度(例如,与执行的展开程度相对应的维度)的数组。在进一步的实例中,对于每个维度,元素的数量可以与展开因子相同。在dgemm示例中,并且如将在下面关于图6B进一步描述的,可以展开两个外循环,使得可以将“matB”加载到“b_in[16][0]”中,这使流“b_in”呈现为二维。此外,加载循环可以使用与原始循环相同的循环嵌套范围,并且进一步地,展开可以应用于加载循环。
在又进一步的示例中,可以执行计算。例如,原始循环可以被更新以使用流而不是传统的存储器操作。在核具有相互馈送的多个计算的情况下,同一循环中的多个计算也可以解耦并放入多个循环中。每次计算,可以将等式的左侧(LHS)放入流中,并且可以从先前的循环流中读取每个后续循环计算的右侧(RHS)。
在附加的示例中,可以执行数据重用和通信。在一个示例中,工作者之间的数据重用和每个工作者内部完成的计算可适用于dgemm和二维(2D)模板的第二维。例如,在dgemm中,可以经由沿“matB”的列和沿“matA”的行扫描数据来实现数据重用。因此,图6B中沿列的16次迭代的展开循环可以被省略。但是,整个计算可以在每个工作者内执行,因此工作者之间不传递部分结果。例如,在2D模板中,可以在第二维中以同一方式执行计算,其中将部分结果保留在每个工作者内。在第二示例中,每个工作者内的数据重用(例如,广播)和工作者之间传递的计算可以在1D和2D模板的第一维中发生,其中每个工作者执行FMA并将其结果发送给相邻工作者。
在又更多示例中,可以创建结果并将其存储到流中。可以提取任何存储操作,并且可以添加附加的循环以存储数据或将数据传递到其他后续核。在某些情况下,循环可以使用与原始存储操作的索引所涉及的循环相同的范围。
(ii)dgemm应用
图6A示出了根据本公开的一个或多个实施例的dgemm的示例收缩实现方式600。如收缩实现方式600中所示,收缩dgemm可包括至少九个FMA,其中框可以代表或指示计算并且箭头可以代表或指示传递。
在示例中,使用流的dgemm的收缩实现方式600可包括将输入元素分配到数组单元的FMA,同时协调数组单元之间的数据传递以至少增加吞吐量并减少存储器操作。
可以实现或使用通过展开复制的各种配置。在第一示例中,两个外循环“j”和“i”的展开可能导致处理器被布置在2D网格中。如果展开因子为16x16,则生成的FMA的数量可能为256。在第二示例中,除了展开“循环j”八次和展开“循环i”八次之外,最内层的“循环k”也可以展开四次以具有四次缩减的链,这可能导致具有256个并行FMA的四个网格。
图6B示出了根据本公开的一个或多个实施例的代码620的示例。代码620表示至少使用16x16复制的dgemm实现方式。代码620也可以被编写或配置为减少存储器操作的数量。例如,可以添加对“matB”流的轮转操作以对多个CSA片仅加载一次数据。此后,可以应用在j和i维度上的展开和收缩4x4优化来交错外循环迭代并隐藏内循环减少等待时间(例如,对于4个FMA为16个周期)。
(ii)模板应用
图6C示出了根据一个或多个实施例的第一维度的示例收缩实现方式640。收缩实现方式640可以是收缩一维模板,其中半径为1,直径为3(例如,工作者的数量为3)。如图所示,可以以循环方式将数据加载到三个工作者流中(例如,“in0”、“in1”、“in2”)。在示例中,广播通信可发生在每个工作者内部,使得在工作者之间不传递数据,但是可传递部分结果,如箭头所示。
根据实施例,可以将上述新颖算法应用于模板,以使存储器操作与计算解耦,并且进一步利用流来存储输入数据。当工作者以分布式方式读取一次数据时,可以使用流来传递和更新数据。至少在这方面,可以经由不同的CSA PE广播相同的数据。此外,通过流水线化模板计算,在每个周期中,可以在不同的PE处理不同的数据元素。
图7示出了例如适于实现如前所述的各实施例的计算设备(诸如计算机、膝上型设备、平板计算机、移动计算机、智能手机等)的示例计算架构700。此外,计算设备可以是数据中心(例如,服务器基础结构、虚拟化的服务器基础结构)中的计算设备和/或可以是云计算环境中的基于云的计算机。在一个实施例中,计算架构700可以包括或被实现为系统的部分,这将在下面进一步描述。在示例中,一个或多个计算设备及其处理电路系统可以包括或支持多个微处理器以及CSA。
如本申请中所使用的,术语“系统”和“组件”旨在指计算机相关实体、或者硬件、硬件和软件的组合、软件、或执行中的软件,由示例性计算架构700来提供其示例。例如,组件可以是但不限于是:处理器上运行的进程、处理器、硬盘驱动器、(光和/或磁存储介质的)多个存储驱动器、对象、可执行代码、执行线程、程序、和/或计算机。作为说明,在服务器上运行的应用和该服务器两者都可以是组件。一个或多个组件可以驻留在进程和/或执行线程内,并且组件可以局部化在一个计算机上和/或分布在两个或更多个计算机之间。进一步地,组件可通过各种类型的通信介质彼此通信地耦合以协调操作。该协调可涉及单向或双向的信息交换。例如,组件能以通过通信介质传输的信号的形式来传输信息。该信息可被实现为分配给各信号线的信号。在此类分配中,每一条消息都是信号。然而,进一步的实施例可替代地采用数据消息。此类数据消息可跨各种连接被发送。示例性连接包括并行接口、串行接口和总线接口。
计算架构700包括各种常见计算元件,诸如,一个或多个处理器、多核处理器、协处理器、存储器单元、芯片组、控制器、外围设备、接口、振荡器、定时设备、视频卡、音频卡、多媒体输入/输出(I/O)组件、电源,等等。然而,实施例不限于由计算架构700来实现。
如该图中所示,计算架构700包括处理单元704、系统存储器706和系统总线708。处理单元704可以是各种可商购的处理器中的任一种。
系统总线708提供用于系统组件的接口,这些系统组件包括但不限于系统存储器706到处理单元704。系统总线708可以是若干类型的总线结构中的任一种,这些总线结构可使用各种市场上可买到的总线架构中的任一种来进一步互连到存储器总线(具有或不具有存储器控制器)、外围总线和局部总线。接口适配器可以经由插槽架构连接到系统总线708。示例插槽架构可包括但不限于:加速图形端口(AGP)、卡片式总线、(扩展式)工业标准架构((E)ISA)、微通道架构(MCA)、网络用户总线(NuBus)、外围组件互连(扩展式)(PCI(X))、PCI快速(PCI Express)、个人计算机存储卡国际协会(PCMCIA),等等。
计算架构700可以包括或实现各种制品。制品可以包括用于存储逻辑的计算机可读存储介质。计算机可读存储介质的示例可以包括能够存储电子数据的任何有形介质,包括易失性存储器或非易失性存储器、可移除存储器或不可移除存储器、可擦除存储器或不可擦除存储器、可写存储器或可重写存储器等。逻辑的示例可以包括使用任何合适类型的代码(比如源代码、编译代码、解释代码、可执行代码、静态代码、动态代码、面向对象代码、可视代码等)实现的可执行计算机程序指令。实施例还可以至少部分地实现为包含在非瞬态计算机可读介质之中或之上的指令,所述指令可以由一个或多个处理器读取和执行以使得能够执行本文描述的操作。
系统存储器706可以包括各种类型的一个或多个更高速存储器单元形式的计算机可读存储介质,如只读存储器(ROM)、随机存取存储器(RAM)、动态RAM(DRAM)、双倍数据速率DRAM(DDRAM)、同步DRAM(SDRAM)、静态RAM(SRAM)、可编程ROM(PROM)、可擦除可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)、快闪存储器、聚合体存储器(如铁电聚合物存储器)、双向存储器、相变或铁电存储器、硅氧氮氧硅(SONOS)存储器、磁性或光学卡、设备阵列(如独立磁盘冗余阵列(RAID))驱动、固态存储器驱动(例如,USB存储器)、固态驱动(SSD)和适用于存储信息的任何其他类型的存储介质。在该图中示出的所图示实施例中,系统存储器706可以包括非易失性存储器710和/或易失性存储器712。基本输入/输出系统(BIOS)可以被存储在非易失性存储器710中。
计算机702可包括以一个或多个较低速存储器单元形式的各种类型的计算机可读存储介质,包括内部(或外部)硬盘驱动器(HDD)714、用于从可移除磁盘716读取或向可移除磁盘718写入的磁软盘驱动器(FDD)720、以及用于从可移除光盘722(例如,CD-ROM或DVD)读取或向可移除光盘822写入的光盘驱动器820。HDD 714、FDD 716和光盘驱动器720可以分别通过HDD接口724、FDD接口726和光驱接口728连接到系统总线708。用于外部驱动器实现方式的HDD接口724可以包括通用串行总线(USB)和IEEE 1394接口技术中的至少一者或包括这两者。
驱动器及相关联的计算机可读介质提供了对数据、数据结构、计算机可执行指令等等的易失性和/或非易失性存储。例如,可以将数个程序模块存储在驱动器和存储器单元710、712中,这些程序模块包括操作系统730、一个或多个应用程序732、其他程序模块734、以及程序数据736。在一个实施例中,一个或多个应用程序732、其他程序模块734和程序数据736可包括例如系统700的各种应用和/或组件。
用户可以通过一个或多个有线/无线输入设备(例如,键盘738和诸如鼠标740之类的指点设备)将命令和信息键入到计算机702中。其他输入设备可以包括麦克风、红外(IR)远程控制、射频(RF)远程控制、游戏板、手写笔、读卡器、软件狗(Dongle)、指纹打印读取器、手套、图形输入板、操纵杆、键盘、视网膜读取器、触摸屏(例如,电容式、电阻式等)、轨迹球、轨迹板、传感器、触控笔等等。这些和其他输入设备通常通过耦合至系统总线708的输入设备接口742连接至处理单元704,但也可通过诸如并行端口、IEEE 1394串行端口、游戏端口、USB端口、IR接口等等之类的其他接口被连接。
监视器744或其他类型的显示设备也经由诸如视频适配器746之类的接口连接至系统总线708。监视器744可位于计算机702的内部或外部。除了监视器744之外,计算机还典型地包括诸如扬声器、打印机等等之类的其他外围输出设备。
计算机702可使用经由有线和/或无线通信而至一个或多个远程计算机(诸如远程计算机748)的逻辑连接在联网环境中操作。远程计算机748可以是工作站、服务器计算机、路由器、个人计算机、便携式计算机、基于微处理器的娱乐设备、对等设备或其他常见的网络节点,并且通常包括相对于计算机702描述的许多或所有元件,但出于简明的目的,仅示出存储器/存储设备750。所描绘的逻辑连接包括到局域网(LAN)752和/或例如广域网(WAN)754之类的更大网络的有线/无线连接性。此类LAN和WAN联网环境常见于办公室和公司,并且促进诸如内联网之类的企业范围的计算机网络,所有这些都可连接到例如因特网之类的全球通信网络。
当在LAN联网环境中使用时,计算机702通过有线和/或无线通信网络接口或适配器756连接到LAN 752。适配器756可以促进到LAN 752的有线和/或无线通信,其还可包括其上设置的用于利用适配器756的无线功能进行通信的无线接入点。
当在WAN联网环境中使用时,计算机702可以包括调制解调器758,或连接到WAN754上的通信服务器,或者具有用于诸如通过因特网等在WAN 754上建立通信的其他手段。调制解调器758经由输入设备接口742连接到系统总线708,该调制解调器758可以是内部或外部的,并且可以是有线和/或无线设备。在联网环境中,相对于计算机702所描绘的程序模块或其部分可以被存储在远程存储器/存储设备750中。将会领会,所示的网络连接是示例性的,并且可以使用在计算机之间建立通信链路的其他手段。
计算机702可操作以使用IEEE 802标准族来与有线和无线设备或实体进行通信,这些设备或实体诸如以无线通信(例如,IEEE 802.11空中调制技术)可操作地设置的无线设备。这至少包括Wi-Fi(或无线保真)、WiMax和蓝牙TM无线技术,等等。因此,通信可以是如同常规网络那样的预定义结构,或者仅仅是至少两个设备之间的自组织(ad hoc)通信。Wi-Fi网络使用称为IEEE 802.11x(a、b、n、g等)的无线电技术来提供安全、可靠、快速的无线连接性。Wi-Fi网络可以用于使计算机彼此连接、连接至因特网、以及连接至有线网络(其使用IEEE 802.3相关的介质和功能)。
计算设备的各种元件可包括各种硬件元件、软件元件或两者的组合。硬件元件的示例可以包括:设备、逻辑设备、部件、处理器、微处理器、电路、处理器、电路元件(例如,晶体管、电阻器、电容器、电感器等)、集成电路、专用集成电路(ASIC)、可编程逻辑器件(PLD)、数字信号处理器(DSP)、现场可编程门阵列(FPGA)、存储单元、逻辑门、寄存器、半导体器件、芯片、微芯片、芯片组等。软件元件的示例可以包括:软件组件、程序、应用、计算机程序、应用程序、系统程序、软件开发程序、机器程序、操作系统软件、中间件、固件、软件模块、例程、子例程、函数、方法、过程、软件接口、应用程序接口(API)、指令集、计算代码、计算机代码、代码段、计算机代码段、字、值、符号或其任何组合。然而,判定是否是使用硬件元件和/或软件元件来实现实施例可以根据多个因数而变化,如给定的实现方式所期望的,诸如期望的计算速率、功率电平、耐热性、处理周期预算、输入数据速率、输出数据速率、存储器资源、数据总线速度以及其他设计或性能约束。
图8示出适于实现各实施例的示例性通信架构800。例如,一个或多个计算设备可以经由通信框架810彼此通信。
通信架构800包括各种常见通信元件,诸如发射器、接收器、收发器、无线电装置、网络接口、基带处理器、天线、放大器、滤波器、电源,等等。然而,实施例不限于由通信架构800来实现。
如图8中所示,通信架构800包括计算机802和计算机804,该计算机802和计算机804可操作地连接到可以被用来存储相应计算机802和服务器804本地的信息(诸如cookie和/或相关联的上下文信息)的一个或多个相应的客户端数据存储806和807。此外,计算机802和804可以类似于计算架构700或包括如计算架构700的特征。
计算机802和804可以使用通信框架810在彼此之间传递信息。通信框架810可实现任何公知的通信技术和协议。通信框架810可以被实现为分组交换网络(例如,诸如因特网之类的公共网络、诸如企业内联网之类专有网络,等等)、电路交换网络(例如,公共交换电话网)、或分组交换网络和电路交换网络的组合(具有合适的网关和转换器)。
通信框架810可以实现各种网络接口,这些网络接口被布置成成接受、传输和连接至通信网络。网络接口可以被认为是输入/输出(I/O)接口的专用形式。网络接口可采用连接协议,包括但不限于直接连接,以太网(例如粗、细、双绞线10/100/1000Base T等)、令牌环、无线网络接口、蜂窝网络接口、IEEE 802.7ax网络接口、IEEE 802.16网络接口、IEEE802.20网络接口等等。此外,可使用多个网络接口来与各种通信网络类型接合。例如,可采用多个网络接口来允许通过广播、多播和单播网络的通信。如果处理要求规定更大量的速度和容量,则可以类似地采用分布式网络控制器架构来池化、负载平衡并且以其他方式增加计算机802和804所要求的通信带宽。通信网络可以是有线和/或无线网络中的任何一个或其组合,包括但不限于直接互连、安全定制连接、专有网络(例如,企业内联网)、公共网络(例如因特网)、个域网(PAN)、局域网(LAN)、城域网(MAN)、作为因特网上的节点的操作任务(OMNI)、广域网(WAN)、无线网络、蜂窝网络、以及其他通信网络。
图9示出了根据本公开的实施例的示例流程图900。流程图900表示上述新颖的编译器优化伪算法的流程。在示例中并且如下所述,该算法可以自动地将代码(例如,复杂的循环嵌套,诸如矩阵相乘或模版计算)转换为数据流友好的形式,该形式可以通过将存储器操作提取到流中、创建同时的可流水线化任务并使用流在任务之间进行通信,从而对空间架构更有效。结果,有利地,可以增加吞吐量和效率,同时可以减少存储器操作。可以理解的是,每个框中描述的特征可以由一个或多个CSA的处理电路系统、处理元件(PE)来执行,并且进一步地,可以理解的是,不需要以任何特定顺序执行这些框。
在框902处,可以经由使用展开过程的复制来在CSA处理元件或单元之间分配输入元素。如上所述,与框902相关联的特征与分配设计选择相关,并且该设计可以通过基于特定成本模型的编译器或由关于如何复制核的用户输入来实现。
在框904处,可以创建数据并将其加载到CSA架构的一个或多个流(例如,LIC)中。如上所述,可以提取存储器操作以将其加载到核中的新循环,并且可以为每个提取的存储器操作创建进一步的流。在示例中,每个流可以是预定义维度的数组。
在框906处,可以执行计算。更新原始循环以使用在框904处创建的流而不是存储器操作。如上所述,在核具有相互馈送的多个计算的情况下,框906可以将最初在同一循环中的多个计算解耦,并且将它们放入多个循环中。
在框908处,可以执行数据重用和通信。如上所述,取决于工作者之间的通信模式,可以在工作者之间执行数据重用并且可以在每个工作者内部执行计算。在另一个实例中,可以在每个工作者内执行数据重用并且可以在工作者之间传递计算。
在框910处,创建结果并将其存储在流中。此外,如果存在任何存储操作,则也可以提取存储操作。此外,在框910处,可以将用于存储数据或传递数据的附加循环添加到不同的后续核。
图10A示出了根据本公开的一个或多个实施例的代码1000的示例。代码1000表示CSA流的示例轮转操作。例如,轮转操作可用于通过将数据复制到流中而仅将它们加载一次来减少存储器操作的数量。如代码1000中所示,长度为“M”的数组“A”可以在外部r循环内重复存取。最小深度为“M”的中间缓冲区可以用来包含复制的数据,如左图所示。这样,可以使用添加到C++头文件中的高级别方法轮转,如右图所示。
图10B示出了根据本公开的一个或多个实施例的代码1020的示例。代码1020表示CSA流的示例合并操作。例如,合并操作可以是多对一操作,该多对一操作将多个流的结果合并在一起并将该多个流的结果写入一个流。可以理解的是,合并中涉及的流可以具有相同的动态深度。此外,可以将输入流指定为数组或可变参数,并且可以按顺序执行合并。如代码1020中所示,“lic_one”可以从“lic[0]”接收一个值,从“lic[1]”接收一个值,从“lic[2]”接收一个值,然后可以迭代以再次从“lic[0]”获得值。
图10C示出了根据本公开的一个或多个实施例的代码1040的示例。代码1040代表CSA流的示例分散操作。例如,分散可以是合并的对偶操作(一对多)。可以理解的是,输入流动态深度必须是输出流数量的倍数。可以将输出流指定为数组或可变参数,并且也可以按顺序执行分散。如代码1040中所示,分散将一个流“lic_one”的数据按值分配到多个流“lic[3]”。可以进一步理解,输出自变量可以被指定为分散的第二自变量。
图10D示出了根据本公开的一个或多个实施例的代码1060的示例。代码1060表示CSA流的示例广播操作。例如,广播可以表示一个“生产者”与多个“消费者”之间的通信,其中多个消费者可以为每个实例获取相同的值。如代码1060中所示,可以使用读/写基元来实现广播操作。
图10E示出了根据本公开的一个或多个实施例的代码1080的示例。代码1080表示CSA流的示例移位操作。例如,移位可用于维持值的滚动窗口,例如,当每次执行移位时,一个值在一端丢弃,而在另一端加载新的值。如代码1080中所示,如果模板窗口大小为“直径”,则可使用“直径–1”的LIC大小从一个输出位置传输值,以在下一位置使用。在代码1080中进一步所示,第一组循环使用在第一位置所需的值来“启动(prime)”LIC。第二组循环执行计算以移动LIC中的值。可以理解的是,移位函数的参数定义了输出数组的范围和模板窗口的大小。
可利用处理电路系统、分立电路系统、专用集成电路(ASIC)、逻辑门和/或单芯片架构的任意组合来实现上述设备的组件和特征。此外,在适当情况下,可利用微控制器、可编程逻辑阵列和/或微处理器或上述的任意组合来实现设备的特征。注意,在本文中硬件、固件和/或软件元件可合称或单独地称为“逻辑”或“电路”。
一些实施例可使用表述“一个实施例”和“实施例”及其派生词来描述。这些术语意味着与实施例相联系地描述的具体特征、结构或者特性被包含在至少一个实施例中。在本说明书中的不同位置处出现短语“在一个实施例中”不一定全都指同一个实施例。进一步地,可使用表述“耦合的”和“连接的”及其派生词对一些实施例进行描述。这些术语并不必旨在作为彼此的同义词。例如,一些实施例可使用术语“连接的”和/或“耦合的”来描述,以指示两个或更多个元件彼此直接的物理接触或电接触。然而,术语“耦合的”还可意味着两个或更多元件彼此不直接接触,但仍然彼此协作或相互作用。
强调的是,提供本公开的摘要以允许读者快速判定本技术公开的本质。提交该摘要,并且理解该摘要将不用于解释或限制权利要求书的范围或含义。此外,在前述具体实施方式中可以看出,为了使本公开流畅,在单个实施例中,将各个特征成组到一起。这种公开方法不应被解释为反映要求保护的实施例要求比每一项权利要求中明确记载的的特征更多的特征的意图。相反,如所附权利要求所反映,发明主题在于比单个所公开的实施例的全部特征更少的特征。因此,所附权利要求由此被并入具体实施方式中,其中每项权利要求独立成为单独实施例。在所附权利要求书中,术语“包括(including)”和“其中(in which)”分别被用作相应的术语“包括(comprising)”和“其中(wherein)”的普通英语等价词。此外,术语“第一”、“第二”、“第三”等仅用作标记,并不旨在对它们的对象施加数值要求。
上文所描述的内容包括所公开的架构的示例。当然,不可能描述组件和/或方法的每个可想到的组合,但是本领域普通技术人员可以认识到许多进一步的组合和置换是可能的。相应地,新颖的架构旨在涵盖落入所附权利要求的精神和范围内的全部此类变更、修改和变型。
现在本公开转向多个说明性示例。
示例1。一种用于自动编译器转换的设备,该设备包括:一个或多个处理器,每个处理器包括多个处理元件,该一个或多个处理器可操作以使编译器用于:对一个或多个嵌套循环使用循环缓冲以允许重用来自与一个或多个处理元件相关联的一个或多个流的值;或基于值的滚动窗口经由一个或多个流执行内循环中的一次或多次存储器存取;或允许与展开的循环相关联的一个或多个存储器操作稍后经由一个或多个流通过至少一个单元跨度存取来进行;或经由一个或多个流执行展开和收缩过程。
示例2。示例1的设备,其中,一个或多个处理器是可配置空间加速器(CSA)。
示例3。示例1的设备,其中,编译器是CSA优化编译器。
示例4。示例2的设备,其中,一个或多个流是与一个或多个CSA中的每一个CSA的一个或多个处理元件之间的通信相关联的等待时间不敏感通道(LIC)。
示例5。示例1的设备,其中,循环缓冲包括使用一个或多个流来循环数据而没有到存储器的任何冗余行程,并且其中一个或多个嵌套循环包括具有短行程计数的内循环。
示例6。示例5的设备,其中,数据经由轮转操作循环。
示例7。示例1的设备,其中,与一次或多次存储器存取的执行相关联的存储器存取包括基于模板的存储器存取。
示例8。示例1的设备,其中值的滚动窗口包括在每个输出位置处丢弃在先前位置中使用的输入值并从存储器中加载新的值。
示例9。示例8的设备,其中,值的滚动窗口包括执行移位操作。
示例10。示例1的设备,其中一个或多个存储器操作包括存储和加载,并且一个或多个存储器操作的允许至少部分地基于合并操作或分散操作。
示例11。一种系统,包括示例1至示例10中任一项的设备。
示例12。用于自动编译器转换的至少一种机器可读存储介质,包括指令,指令在由至少一个处理器执行时,处理器包括多个处理元件并且可操作以使得编译器用于:对一个或多个嵌套循环使用循环缓冲以允许重用来自与一个或多个处理元件相关联的一个或多个流的值;或基于值的滚动窗口经由一个或多个流执行内循环中的一次或多次存储器存取;或允许与展开的循环相关联的一个或多个存储器操作稍后经由一个或多个流通过至少一个单元跨度存取来进行;或经由一个或多个流执行展开和收缩过程。
示例13。示例12的至少一种机器可读存储介质,其中,一个或多个处理器是可配置空间加速器(CSA)。
示例14。示例12的至少一种机器可读存储介质,其中,编译器是CSA优化编译器。
示例15。示例13的至少一种机器可读存储介质,其中,一个或多个流是与一个或多个CSA中的每一个CSA的一个或多个处理元件之间的通信相关联的等待时间不敏感通道(LIC)。
示例16。示例12的至少一种机器可读存储介质,其中,循环缓冲包括使用一个或多个流来循环数据而没有到存储器的任何冗余行程,并且其中一个或多个嵌套循环包括具有短行程计数的内循环。
示例17。示例16的至少一种机器可读存储介质,其中,数据经由轮转操作循环。
示例18。示例12的至少一种机器可读存储介质,其中,与一次或多次存储器存取的执行相关联的存储器存取包括基于模板的存储器存取。
示例19。示例10的至少一种机器可读存储介质,其中值的滚动窗口包括在每个输出位置处丢弃在先前位置中使用的输入值并从存储器中加载新的值。
示例20。示例19的至少一种机器可读存储介质,其中,值的滚动窗口包括执行移位操作。
示例21。示例12的至少一种机器可读存储介质,其中一个或多个存储器操作包括存储和加载,并且一个或多个存储器操作的允许至少部分地基于合并操作或分散操作。
示例22。一种用于自动编译器转换的处理器,该处理器包括多个处理元件,该处理器可操作以使编译器用于:对一个或多个嵌套循环使用循环缓冲以允许重用来自与一个或多个处理元件相关联的一个或多个流的值;或基于值的滚动窗口经由一个或多个流执行内循环中的一次或多次存储器存取;或允许与展开的循环相关联的一个或多个存储器操作稍后经由一个或多个流通过至少一个单元跨度存取来进行;或经由一个或多个流执行展开和收缩过程。
示例23。示例22的处理器,其中,一个或多个处理器是可配置空间加速器(CSA)。
示例24。示例22的处理器,其中,编译器是CSA优化编译器。
示例25。示例23的处理器,其中,一个或多个流是与一个或多个CSA中的每一个CSA的一个或多个处理元件之间的通信相关联的等待时间不敏感通道(LIC)。
示例26。示例22的处理器,其中,循环缓冲包括使用一个或多个流来循环数据而没有到存储器的任何冗余行程,并且其中一个或多个嵌套循环包括具有短行程计数的内循环。
示例27。示例26的处理器,其中,数据经由轮转操作循环。
示例28。示例22的处理器,其中,与一次或多次存储器存取的执行相关联的存储器存取包括基于模板的存储器存取。
示例29。示例22的处理器,其中值的滚动窗口包括在每个输出位置处丢弃在先前位置中使用的输入值并从存储器中加载新的值。
示例30。示例29的处理器,其中,值的滚动窗口包括执行移位操作。
示例31。示例22的处理器,其中一个或多个存储器操作包括存储和加载,并且一个或多个存储器操作的允许至少部分地基于合并操作或分散操作。
示例32。一种系统,包括示例12至示例21中任一项的至少一种机器可读存储介质。
示例33。一种系统,包括示例22至示例31中任一项的处理器。
示例34。一种用于自动编译器转换的方法,该方法包括:对一个或多个嵌套循环使用循环缓冲以允许重用来自与一个或多个处理元件相关联的一个或多个流的值;或基于值的滚动窗口经由一个或多个流执行内循环中的一次或多次存储器存取;或允许与展开的循环相关联的一个或多个存储器操作稍后经由一个或多个流通过至少一个单元跨度存取来进行;或经由一个或多个流执行展开和收缩过程。
示例35。示例34的方法,该方法由一个或多个处理器执行。
示例36。示例35的方法,其中,一个或多个处理器是可配置空间加速器(CSA)。
示例37。示例35的方法,其中,一个或多个流是与一个或多个CSA中的每一个CSA的一个或多个处理元件之间的通信相关联的等待时间不敏感通道(LIC)。
示例38。示例34的方法,其中,循环缓冲包括使用一个或多个流来循环数据而没有到存储器的任何冗余行程,并且其中一个或多个嵌套循环包括具有短行程计数的内循环。
示例39。示例34的方法,其中,与一次或多次存储器存取的执行相关联的存储器存取包括基于模板的存储器存取。
示例40。示例34的方法,其中值的滚动窗口包括在每个输出位置处丢弃在先前位置中使用的输入值并从存储器中加载新的值。
示例41。示例34的方法,其中一个或多个存储器操作包括存储和加载,并且一个或多个存储器操作的允许至少部分地基于合并操作或分散操作。
示例42。一种设备,包括用于执行示例34至示例41中任一项的方法的装置。
示例43。至少一种机器可读存储介质,包括用于执行示例34至示例41中任一项的方法的装置。
示例44。一种系统,包括用于执行示例34至示例41中任一项所述的方法的装置。
示例45。一种设备,包括示例12至示例21中任一项的至少一种机器可读存储介质。
示例46。一种系统,包括示例12至示例21中任一项的至少一种机器可读存储介质。
示例47。一种用于编译器优化伪算法的方法,该方法包括:经由使用展开的复制来在处理器的多个处理元件之间分布输入元素;创建数据并将其加载到一个或多个流中;执行计算;执行数据重用和通信;以及创建结果并将其存储在一个或多个流中。
示例48。示例47的方法,其中,处理器是可配置空间加速器(CSA)。
示例49。示例47的方法,其中,一个或多个流是与多个处理元件之间的通信相关联的等待时间不敏感通道(LIC)。
示例50。一种用于编译器优化伪代码算法的设备,该设备包括:一个或多个处理器,每个处理器包括多个处理元件,该一个或多个处理器可操作以使编译器用于:经由使用展开的复制来在处理器的多个处理元件之间分布输入元素;创建数据并将其加载到一个或多个流中;执行计算;执行数据重用和通信;以及创建结果并将其存储在一个或多个流中。
示例51。一种用于编译器优化伪代码算法的至少一种机器可读存储介质,包括指令,指令在由至少一个处理器执行时,处理器包括多个处理元件并且可操作以使得编译器用于:经由使用展开的复制来在处理器的多个处理元件之间分布输入元素;创建数据并将其加载到一个或多个流中;执行计算;执行数据重用和通信;以及创建结果并将其存储在一个或多个流中。
示例52。一种用于编译器优化伪代码算法的处理器,该处理器包括多个处理元件,该处理器可操作以使编译器用于:经由使用展开的复制来在处理器的多个处理元件之间分布输入元素;创建数据并将其加载到一个或多个流中;执行计算;执行数据重用和通信;以及创建结果并将其存储在一个或多个流中。
示例53。一种系统,包括示例50的设备。
示例54。一种系统,包括示例51的至少一种机器可读存储介质。
示例55。一种系统,包括示例52的处理器。
示例56。一种设备,包括用于执行示例47至示例49中任一项的方法的装置。
示例57。一种系统,包括用于执行示例47至示例49中任一项所述的方法的装置。
示例58。至少一种机器可读存储介质,包括用于执行示例47至示例49中任一项的方法的装置。
示例59。一种设备,包括示例51的至少一种机器可读存储介质。
示例60。一种系统,包括示例51的至少一种机器可读存储介质。
Claims (25)
1.一种设备,所述设备包括:
一个或多个处理器,每个处理器包括一个或多个处理元件,所述一个或多个处理器能操作以使编译器用于:
对一个或多个嵌套循环使用循环缓冲以允许重用来自与所述一个或多个处理元件相关联的一个或多个流的值;或
基于值的滚动窗口经由所述一个或多个流执行内循环中的一次或多次存储器存取;或
允许与展开的循环相关联的一个或多个存储器操作稍后经由所述一个或多个流通过至少一个单元跨度存取来进行;或
经由所述一个或多个流执行展开和收缩过程。
2.如权利要求1所述的设备,其中,所述一个或多个处理器是可配置空间加速器CSA并且其中,所述编译器是CSA优化编译器。
3.如权利要求2所述的设备,其中,所述一个或多个流是与一个或多个CSA中的每一个CSA的所述一个或多个处理元件之间的通信相关联的等待时间不敏感通道LIC。
4.如权利要求1所述的设备,其中,所述循环缓冲包括使用所述一个或多个流来循环数据而没有到存储器的任何冗余行程,并且其中所述一个或多个嵌套循环包括具有短行程计数的内循环。
5.如权利要求4所述的设备,其中,所述数据经由轮转操作循环。
6.如权利要求1所述的设备,其中,与一次或多次存储器存取的执行相关联的存储器存取包括基于模板的存储器存取。
7.如权利要求1所述的设备,其中所述值的滚动窗口包括在每个输出位置处丢弃在先前位置中使用的输入值并从存储器中加载新的值。
8.如权利要求7所述的设备,其中,所述值的滚动窗口包括执行移位操作。
9.如权利要求1所述的设备,其中所述一个或多个存储器操作包括存储和加载,并且所述一个或多个存储器操作的允许至少部分地基于合并操作或分散操作。
10.一种用于自动编译器转换的方法,所述方法由编译器经由一个或多个处理器实现,每个处理器包括一个或多个处理元件,所述方法包括:
对一个或多个嵌套循环使用循环缓冲以允许重用来自与所述一个或多个处理元件相关联的一个或多个流的值;或
基于值的滚动窗口经由所述一个或多个流执行内循环中的一次或多次存储器存取;或
允许与展开的循环相关联的一个或多个存储器操作稍后经由所述一个或多个流通过至少一个单元跨度存取来进行;或
经由所述一个或多个流执行展开和收缩过程。
11.如权利要求10所述的方法,其中,所述一个或多个处理器是可配置空间加速器CSA并且其中,所述编译器是CSA优化编译器。
12.如权利要求11所述的方法,其中,所述一个或多个流是与一个或多个CSA中的每一个CSA的所述一个或多个处理元件之间的通信相关联的等待时间不敏感通道LIC。
13.如权利要求10所述的方法,其中,所述循环缓冲包括使用所述一个或多个流来循环数据而没有到存储器的任何冗余行程,并且其中所述一个或多个嵌套循环包括具有短行程计数的内循环。
14.如权利要求13所述的方法,其中,所述数据经由轮转操作循环。
15.如权利要求10所述的方法,其中,与一次或多次存储器存取的执行相关联的存储器存取包括基于模板的存储器存取。
16.如权利要求10所述的方法,其中所述值的滚动窗口包括在每个输出位置处丢弃在先前位置中使用的输入值并从存储器中加载新的值。
17.如权利要求16所述的方法,其中,所述值的滚动窗口包括执行移位操作。
18.如权利要求10所述的方法,其中所述一个或多个存储器操作包括存储和加载,并且所述一个或多个存储器操作的允许至少部分地基于合并操作或分散操作。
19.一种处理器,包括:
包括一个或多个处理元件,所述处理器能操作以使编译器用于:
对一个或多个嵌套循环使用循环缓冲以允许重用来自与所述一个或多个处理元件相关联的一个或多个流的值;或
基于值的滚动窗口经由所述一个或多个流执行内循环中的一次或多次存储器存取;或
允许与展开的循环相关联的一个或多个存储器操作稍后经由所述一个或多个流通过至少一个单元跨度存取来进行;或
经由所述一个或多个流执行展开和收缩过程。
20.如权利要求19所述的处理器,其中,所述一个或多个处理器是能配置空间加速器CSA并且其中,所述编译器是CSA优化编译器。
21.如权利要求20所述的处理器,其中,所述一个或多个流是与一个或多个CSA中的每一个CSA的所述一个或多个处理元件之间的通信相关联的等待时间不敏感通道LIC。
22.如权利要求19所述的处理器,其中,所述循环缓冲包括使用所述一个或多个流来循环数据而没有到存储器的任何冗余行程,并且其中所述一个或多个嵌套循环包括具有短行程计数的内循环。
23.如权利要求19所述的处理器,其中所述值的滚动窗口包括在每个输出位置处丢弃在先前位置中使用的输入值并从存储器中加载新的值。
24.如权利要求19所述的处理器,其中所述一个或多个存储器操作包括存储和加载,并且所述一个或多个存储器操作的允许至少部分地基于合并操作或分散操作。
25.如权利要求19所述的处理器,其中,与一次或多次存储器存取的执行相关联的存储器存取包括基于模板的存储器存取。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/832,797 | 2020-03-27 | ||
US16/832,797 US11106438B2 (en) | 2020-03-27 | 2020-03-27 | Integration of automated complier dataflow optimizations |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113448586A true CN113448586A (zh) | 2021-09-28 |
Family
ID=71608923
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011539114.5A Pending CN113448586A (zh) | 2020-03-27 | 2020-12-23 | 自动编译器数据流优化的集成 |
Country Status (3)
Country | Link |
---|---|
US (1) | US11106438B2 (zh) |
CN (1) | CN113448586A (zh) |
DE (1) | DE102020133795A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115168916B (zh) * | 2022-07-26 | 2023-01-13 | 北京大数据先进技术研究院 | 一种面向移动终端应用的数字对象可信存证方法和系统 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS6382513A (ja) * | 1986-09-26 | 1988-04-13 | Toshiba Corp | バレルシフタ |
US6820250B2 (en) * | 1999-06-07 | 2004-11-16 | Intel Corporation | Mechanism for software pipelining loop nests |
US7420568B1 (en) * | 2003-12-17 | 2008-09-02 | Nvidia Corporation | System and method for packing data in different formats in a tiled graphics memory |
KR101756820B1 (ko) * | 2010-10-21 | 2017-07-12 | 삼성전자주식회사 | 중첩 루프를 처리하기 위한 재구성 가능 프로세서 및 방법 |
US8904243B2 (en) * | 2012-06-29 | 2014-12-02 | Sap Se | Event management systems and methods |
US20150288965A1 (en) * | 2014-04-08 | 2015-10-08 | Microsoft Corporation | Adaptive quantization for video rate control |
US10805392B2 (en) * | 2015-08-13 | 2020-10-13 | Advanced Micro Devices, Inc. | Distributed gather/scatter operations across a network of memory nodes |
US11315045B2 (en) * | 2016-12-29 | 2022-04-26 | Intel Corporation | Entropy-based weighting in random forest models |
US10572404B2 (en) * | 2017-06-30 | 2020-02-25 | Intel Corporation | Cyclic buffer pointer fixing |
US10515046B2 (en) * | 2017-07-01 | 2019-12-24 | Intel Corporation | Processors, methods, and systems with a configurable spatial accelerator |
-
2020
- 2020-03-27 US US16/832,797 patent/US11106438B2/en active Active
- 2020-12-16 DE DE102020133795.7A patent/DE102020133795A1/de active Pending
- 2020-12-23 CN CN202011539114.5A patent/CN113448586A/zh active Pending
Also Published As
Publication number | Publication date |
---|---|
US20200233649A1 (en) | 2020-07-23 |
US11106438B2 (en) | 2021-08-31 |
DE102020133795A1 (de) | 2021-09-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6858239B2 (ja) | プログラムコードを、高性能で電力効率の良いプログラマブルな画像処理ハードウェアプラットフォームにマッピングするためのコンパイラ技法 | |
US7926046B2 (en) | Compiler method for extracting and accelerator template program | |
Lee et al. | Early evaluation of directive-based GPU programming models for productive exascale computing | |
CN110633248A (zh) | 高性能计算环境中的序列优化 | |
Tian et al. | Compiling a high-level directive-based programming model for gpgpus | |
US20120096445A1 (en) | Method and apparatus for providing portability of partially accelerated signal processing applications | |
US20230024035A1 (en) | Zero-copy sparse matrix factorization synthesis for heterogeneous compute systems | |
Houtgast et al. | GPU-accelerated BWA-MEM genomic mapping algorithm using adaptive load balancing | |
CN104375805A (zh) | 采用多核处理器仿真可重构处理器并行计算过程的方法 | |
Hormati et al. | Macross: Macro-simdization of streaming applications | |
Li et al. | Warp-consolidation: A novel execution model for gpus | |
Jiang et al. | Boyi: A systematic framework for automatically deciding the right execution model of OpenCL applications on FPGAs | |
Zhang et al. | CMOST: A system-level FPGA compilation framework | |
Hegde et al. | CaffePresso: Accelerating convolutional networks on embedded SoCs | |
CN113448586A (zh) | 自动编译器数据流优化的集成 | |
He et al. | Agile hardware and software co-design for RISC-V-based multi-precision deep learning microprocessor | |
Oh et al. | Efficient execution of stream graphs on coarse-grained reconfigurable architectures | |
Haaß et al. | Automatic custom instruction identification in memory streaming algorithms | |
Lambert et al. | In-depth optimization with the OpenACC-to-FPGA framework on an Arria 10 FPGA | |
Papakonstantinou et al. | Throughput-oriented kernel porting onto FPGAs | |
Baker et al. | Hybrid programming using OpenSHMEM and OpenACC | |
Da Silva et al. | Performance and resource modeling for FPGAs using high-level synthesis tools | |
Wan et al. | HeteroPP: A directive‐based heterogeneous cooperative parallel programming framework | |
Lee et al. | High-productivity programming and optimization framework for stream processing on fpga | |
Caragea et al. | Brief announcement: performance potential of an easy-to-program PRAM-on-chip prototype versus state-of-the-art processor |
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 |