用于实现具有局部存储需求的循环流水线化的自动编译器数据流优化

文档序号:189909 发布日期:2021-11-02 浏览:18次 >En<

阅读说明:本技术 用于实现具有局部存储需求的循环流水线化的自动编译器数据流优化 (Automated compiler data flow optimization for implementing circular pipelining with local storage requirements ) 是由 R·迪欧德哈 S·德米特里耶夫 D·伍德沃思 R·克里什奈耶 K·格洛索普 A·苏达尔萨南 于 2020-12-18 设计创作,主要内容包括:本文描述了用于实现具有局部存储需求的循环流水线化的自动编译器数据流优化。系统、设备和方法可以提供一种技术,该技术用于:检测源代码中的一个或多个局部变量,其中(多个)局部变量在源代码中的循环的迭代之间缺乏相关性;自动生成(多个)局部变量的流水线执行代码;以及将流水线执行代码合并到编译器的输出中。在一个示例中,流水线执行代码包括(多个)局部变量的缓冲存储的池的初始化。(Automated compiler data flow optimization for implementing loop pipelining with local storage requirements is described herein. Systems, devices, and methods may provide techniques for: detecting one or more local variables in the source code, wherein the local variable(s) lack correlation between iterations of a loop in the source code; pipelined execution code that automatically generates local variable(s); and incorporating the pipelined execution code into an output of the compiler. In one example, the pipelined execution code includes initialization of a pool of buffer stores of local variable(s).)

具体实施方式

现在转到图1,示出了编译器20,其中编译器20将源代码22自动转换为输出24,该输出24可由数据流架构(诸如例如,FPGA、CSA等)执行。在实施例中,源代码22用通过并行注释(例如,OpenMP并行编译指示)来增强的高级语言(诸如例如,C、C++或Fortran)编写,以实现数据流架构中的运行时并行性。源代码22通常可以使用循环来执行各种操作。实际上,应用的运行时性能可能受执行循环以执行任务所花费的时间所支配。在诸如CSA之类的数据流架构上,可以通过以下方式来提高并行循环的性能:a)创建循环主体(例如,“工作者(worker)”)的多个副本,b)并行执行工作者,以及c)流水线化工作者的执行。

在所示的示例中,源代码22包含一个或多个局部变量26(例如,私有变量),这些局部变量在源代码22中的循环的迭代之间缺乏相关性。如将更详细讨论的,在循环内声明时,此类变量可能自然地发生。在实施例中,(多个)局部变量26偶尔用于相对大的数据数组。在这种情况下,为了提高包含(多个)局部变量26的循环的吞吐量,所图示的编译器20生成(多个)局部变量26的流水线执行代码28并将流水线执行代码28合并到编译器20的输出24中。因此,以每个循环迭代获得其自己的副本的方式来分配所图示的局部变量,从而允许流水线化执行。如前所述,将工作者的执行进行流水线化可以显著提高性能。

图2A示出了包含声明变量“b”的循环的源代码30(例如,“for(int i=0;i<n;i++”),该变量“b”可被视为局部变量,因为它在循环的迭代之间缺乏相关性。在所图示的示例中,变量具有固定大小(例如,100个整数的数组)。因此,变量b的局部存储需求是固定的,并且对于编译器是静态已知的。所图示的源代码30可容易地替代已讨论的源代码22(图1)。相应地,可以自动生成所图示的局部变量的流水线执行代码。

图2B示出了包含声明变量“spa”的循环的源代码32(例如,“for(int i=ibegin;i<iend;i++)”),该变量“spa”也在循环的迭代之间缺乏相关性并且被视为局部变量。在所图示的示例中,变量的大小变化并且仅在运行时才知道。所图示的源代码32可容易地替代已讨论的源代码22(图1)。相应地,可以自动生成所图示的局部变量的流水线执行代码。

图2C示出了包含使用变量“b”的循环的源代码34(例如,“for(int j=x;j<y;j++)”),其中变量“b”被显式指定为私有变量(例如,使用“private(私有)”子句)。也可以使用其他显式子句(诸如“firstprivate(第一私有)”、“lastprivate(最后私有)”、“reduction(缩减)”等)。在所图示的示例中,变量具有固定大小(例如,100个整数的数组)。因此,变量b的局部存储需求是固定的,并且对于编译器是静态已知的。所图示的源代码34可容易地替代已讨论的源代码22(图1)。相应地,可以自动生成所图示的局部变量的流水线执行代码。

图2D示出了包含循环的源代码36(例如,“for(int i=0;i<n;i++)”),该循环从循环内动态地为变量“b”分配存储器。在所图示的示例中,变量是局部变量,该局部变量在循环的迭代之间缺乏相关性,并且变量的大小可以保持恒定或变化。所图示的源代码36可容易地替代已讨论的源代码22(图1)。相应地,可以自动生成所图示的局部变量的流水线执行代码。

现在转到图3,示出了数据流图中的第一功能单元42(例如,节点)与数据流图中的第二功能单元44之间的通信弧40(例如,LIC)。在所图示的示例中,功能单元42和44用于在循环中对与局部变量相关联的数据执行操作。在实施例中,通信弧40包括缓冲器存储(未示出)(诸如例如,一个或多个行缓冲器、FIFO(先进先出)缓冲器等),该缓冲器存储可用于保存能够将与循环中的局部变量相关联的数据分配给不同的循环迭代的值。

图4示出操作编译器的方法50。方法50一般可被实现于编译器中,诸如例如已讨论的编译器20(图1)。更具体地,方法50可在一个或多个模块中被实现为逻辑指令的集合,该逻辑指令的集合存储在诸如随机存取存储器(RAM)、只读存储器(ROM)、可编程ROM(PROM)、固件、闪存等之类的机器或计算机可读存储介质中,存储在诸如例如可编程逻辑阵列(PLA)、FPGA、复杂可编程逻辑器件(CPLD)的可配置逻辑中,存储在使用诸如例如专用集成电路(ASIC)、互补式金属氧化物半导体(CMOS)之类的电路技术或晶体管-晶体管逻辑(TTL)技术的固定功能逻辑硬件中,或存储在上述各项的任何组合中。

例如,可以用一种或多种编程语言的任何组合来编写用于实施在方法50中所示的操作的计算机程序代码,这些编程语言包括诸如JAVA、SMALLTALK、C++等的面向对象的编程语言以及诸如“C”编程语言或类似编程语言的常规的过程编程语言。另外,逻辑指令可包括汇编程序指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、状态设置数据、用于集成电路的配置数据、使对于硬件(例如,主机处理器、中央处理单元/CPU、微控制器等)而言是原生的电子电路和/或其他结构组件个性化的状态信息。

所图示的处理框52提供检测源代码中的一个或多个局部变量,其中(多个)局部变量在源代码中的循环的迭代之间缺乏相关性。源代码可以与通信信道(例如,数据流图中的通信弧40(图3))相关联。在实施例中,框52包括自动解析和/或搜索源代码以查找具有固定大小的局部存储(例如,如图2A中所示)、运行时变化的局部存储(例如,如图2B中所示)、显式指定的私有变量(例如,如图2C中所示)、动态分配的局部变量(例如,如图2D中所示)等等的循环。此外,框52可以在源代码的注册之后进行。

框54(例如,响应于检测到一个或多个局部变量)自动地生成(多个)局部变量的流水线执行代码。如将更详细地讨论的,框54可以包括生成可执行指令以初始化(多个)局部变量的缓冲器存储池、定义流水线深度以及定义初始化的缓冲器存储池中的多个令牌化插槽。在一个示例中,初始化的缓冲器存储池大于对应于循环的单次迭代的局部存储量。此外,每个令牌化插槽可对应于循环的流水线化迭代。所图示的框56将流水线执行代码合并到编译器的输出中。所以,方法50通过实现包含私有数据的循环的流水线化而提高了性能,该流水线化提高了吞吐量。实际上,执行循环所需的总循环数可能大大小于静态循环数(例如,执行循环的一次迭代所需的循环数)和循环迭代次数的乘积。

图5示出了可实现已讨论的方法50(图4)的一个或多个方面的编译器60。另外,编译器60可容易地替代已讨论的源代码20(图1)。通常,编译器60实现包含局部变量的循环的流水线化执行,并且可以参考一段样本源代码和编译器生成的伪代码来解释。为了进一步参考,本公开的结尾包括在本文描述的主要编译器转换之前和之后针对相似样本使用LLVM编译器的实际中间表示(IR)结果。

以循环中动态分配的局部存储为例,为简单起见,选择恒定数组大小为100,可以假定编译器60为该循环选择两个工作者并为每个工作者循环选择三个流水线深度。

还可以实现OpenMP语言扩展,以允许对工作者创建和流水线深度的显式控制。此类扩展可以被认为是可选的。

OpenMP语言扩展为:

#pragma omp...

数据流([工作者_数[(<n>)]],

[静态[(<块大小>)]],

[流水线[(<深度>)]])

for循环

流水线(深度)子子句(sub-clause)指定允许并行执行多少个循环迭代。工作者_数(num_workers)和静态子句指定创建多少个工作者以及在这些工作者之间分布循环迭代的方式。也可以使用其他并行注释语言和/或API(应用编程接口),诸如OpenACC、OpenCL、SYCL等。

在流水线循环中正确处理私有变量的解决方案可以跨越编译器60中的多个通路。如图5中所示,转换在三个地方。

当局部存储来自OpenMP子句时,可以使用工作者创建级62。在实施例中,工作者创建级62用多个工作者的扩展替换OpenMP指令。工作者创建级62也可以使用动态分配来表示局部存储。下面提供工作者创建级62的伪代码。

Loop(循环):

b=alloca…

//该循环的主体引用了局部变量b

<内部j循环>

End-loop(结束-循环):

局部存储扩展级64处理本文所描述的转换的相对大部分。在一个示例中,局部存储扩展级64处理剩余的私有变量的分配和引用。所图示级64的通路相对晚进行,以允许其他编译器优化尽可能地注册局部变量。相应地,在级64中处理了否则无法注册的变量。如果循环具有一组S私有变量,则级64创建类型为S的数组,其维度为流水线深度,即进行中的迭代的动态计数。

数据流操作转换级66可以处理为每个循环创建的私有变量数组中各个插槽的管理。

工作者创建

工作者创建级62可以按照OpenMP指令的指示创建多个工作者。对于非OpenMP循环,工作者创建级62可以自动决定要生成的工作者的数量。类似地,OpenMP指令可以指定流水线深度,或者编译器60可以选择要生成的流水线化程度。为了讨论的目的,假设创建了两个工作者并且选择了三个流水线深度。

可以引入一对LLVM IR内部函数来支持循环局部存储:

r=pipeline.limited.entry(int id,int depth)

pipeline.limited.exit(r)

这些内在函数包含需要局部存储的循环。“入口(entry)”调用的参数指定流水线深度并标记封闭循环的分配发生的位置。“出口(exit)”标记释放点。该表示形式确保独立于生成的工作者数量,为循环执行单个分配/释放。

下面示出了在工作者创建级62之后的原始单循环的伪代码。在所图示的示例中,原始循环已被复制以形成两个工作者。此外,原始循环中的局部变量在每个新循环中均成为单独的局部变量。流水线尚未被考虑并且稍后在局部存储扩展级64中完成。由工作者创建级62处理之后的伪代码可能为:

局部存储扩展

在实施例中,局部存储扩展级64执行转换以考虑流水线化。使用令牌的概念来强制实施三个流水线的深度,并为每个工作者创建三个令牌值的池。在一个示例中,当可以从池中获得令牌时,迭代可以开始。通过调用“token.take(令牌.获取)”来建模该操作,仅当局部存储插槽变得可用时,该操作才能完成。当迭代完成,令牌返回到池。该返回通过调用“token.return(令牌.返回)”来建模。在一个示例中,由于仅存在三个不同的令牌值,因此在每个工作者中只能并行执行三个迭代。

局部存储扩展级64之后的伪代码可能是:

数据流操作转换

实现循环局部存储的最后级是在数据流操作转换级66期间,其将IR代码转换为数据流操作。内部函数token.take(令牌.获取)和token.return(令牌.返回)可以是分发固定数量的令牌的机制的抽象表示。在实施例中,该机制的物理实现使用CSA LIC。CSA LIC的基本属性是保存多个值,以在读取时从LIC的一端传递值,并且在写入时在LIC的另一端写入值。该属性可用于允许仅固定数量的值在循环主体内循环。在一个示例中,LIC的深度被选择为用户指定的流水线深度。另外,LIC中的值可以是为循环的私有变量分配的各个插槽的偏移。当循环的新迭代开始时,将从LIC中读取值并将其添加到基址,以生成循环的当前迭代的插槽地址。当迭代完成时,可以将偏移写入回LIC。由于LIC仅保存“深度”数值,因此只能并行执行深度数个迭代,每次迭代都使用单独的局部存储插槽。下面示出实现该方案的示例数据流操作。

在数据流机器中,指令在满足其输入相关性时执行。在下文中,“inord(输入序数)”是输入序数(例如,满足输入相关性的信号),并且当指令完成执行时,指令生成“outord(输出序数)”以指示结果现在可用。首先解释gate64、add64和mov指令,然后解释他们在实现token.take(令牌.获取)和token.return(令牌.返回)中的用法。

gate64结果,inord,值

该指令直到inord可用才执行。然后,“value(值)”作为结果可用。

add64结果,输入1,输入2

该指令直到输入1和输入2可用才执行。然后,“result(结果)作为”“input1(输入1)”和“input2(输入2)”的和变得可用。

mov0结果,inord,值

该指令直到“inord”可用才执行。然后,“value(值)”作为结果变得可用。

下面的伪代码是用于CSA实现的数据流操作转换级66的示例输出。

//每个循环迭代需要400字节的局部存储

//为原始循环创建2个工作者

//实现流水线深度为3

//总计局部存储=400*3*2字节=2400字节

//工作者0使用范围为字节0到字节1199的池

//工作者1使用范围为字节1200到字节2399的池

//在每个工作者的池中,3个插槽的偏移量为0、400、800

//使用偏移值初始化深度为3的LIC:

//(插槽0)的偏移、(插槽1)的偏移、(插槽2)的偏移

[email protected]%slot_offset

%slot_offset:ci64=init64 0

%slot_offset:ci64=init64 400

%slot_offset:ci64=init64 800

//在CSA上实现令牌_获取

//循环外的动态存储器分配生成池地址

pool=……//相当于CsaMemAlloc(Csa存储器分配)(2400)

//在循环中,当令牌_获取准备执行时

//使池地址可用于add64指令

gate64 pool_gated,token_take_inord,pool

//指派给该迭代的局部存储插槽的地址

//被计算

add64 slot_addr,slot_offsets,pool_gated

//在CSA上实现令牌_返回

//在循环中,当令牌_返回准备执行时

//在LIC的结束处写入回插槽_偏移

gate64 slot_offsets,token_return_inord,slot_offsets

//用该mov0表示令牌_返回的完成

mov0 token_return_outord,token_return_inord

以此方式,利用CSA LIC的数据流属性来实现并行循环的流水线化,同时确保有足够的局部存储可用于动态循环迭代。编译器60可以自动进行该转换,并且已经实现了原型OpenMP语言扩展以证明该解决方案的优点。

现在转向图6,示出了性能增强的计算系统151。系统151一般可以是具有计算功能(例如,个人数字助理/PDA、笔记本计算机、平板计算机、可转换平板、服务器)、通信功能(例如,智能电话)、成像功能(例如,相机、便携式摄像机)、媒体播放功能(例如,智能电视/TV)、可穿戴功能(例如,手表、眼部穿戴物、头戴物、脚部穿戴物、首饰)、车载功能(例如,汽车、卡车、摩托车)、机器人功能(例如,自主机器人)、物联网(IoT)功能等或其任何组合的电子设备/平台的部分。在所图示的示例中,系统151包括具有集成存储器控制器(IMC)155的主机处理器153(例如,中央处理单元/CPU),该IMC 155耦合至系统存储器157。

所图示的系统151还包括输入输出(IO)模块159,该IO模块159与主机处理器153和图形处理器161(例如,图形处理单元/GPU)一起在半导体管芯163上被实现为芯片上系统(SoC)。所图示的IO模块159与例如显示器165(例如,触摸屏、液晶显示器/LCD、发光二极管/LED显示器)、网络控制器167(例如,有线和/或无线)、以及大容量存储169(例如,硬盘驱动器/HDD、光盘、固态驱动器/SSD、闪存)进行通信。

在实施例中,主机处理器153、图形处理器161和/或IO模块159执行从系统存储器157和/或大容量存储169检取的指令171以执行已讨论的方法50(图4)的一个或多个方面。因此,所示的指令171的执行可以使计算系统151:检测源代码中的一个或多个局部变量,其中一个或多个局部变量在源代码中的循环的迭代之间缺乏相关性;自动生成一个或多个局部变量的流水线执行代码;以及将流水线执行代码合并到编译器的输出中。

在实施例中,流水线执行代码包括一个或多个局部变量的缓冲器存储的池的初始化。在此类情况下,初始化的缓冲器存储池可以大于对应于循环的单次迭代的局部存储量(例如,数倍)。此外,流水线化的执行代码可进一步包括在初始化的缓冲器存储池中的多个令牌化插槽的定义,其中每个令牌化插槽对应于循环的流水线化迭代。在实施例中,流水线化的执行代码进一步包括流水线深度定义。在一个示例中,在对源代码进行注册之后检测(多个)局部变量,并且将源代码与数据流图中的通信信道相关联。此外,可以响应于检测到(多个)局部变量来进行流水线执行代码的自动生成。

因此,所图示的系统151至少在一定程度上提高了性能,使得包含私有数据的循环的流水线改善了吞吐量。实际上,执行循环所需的总循环数可能大大小于静态循环数与循环迭代次数的乘积。

图7示出了半导体封装设备173。所图示的设备173包括一个或多个衬底175(例如,硅、蓝宝石、砷化镓)和耦合至(多个)衬底175的逻辑177(例如,晶体管阵列和其他集成电路/IC组件)。逻辑177可至少部分地被实现在可配置逻辑或固定功能逻辑硬件中。在一个示例中,逻辑177实现已讨论的方法50(图4)的一个或多个方面。因此,逻辑177可以:检测源代码中的一个或多个局部变量,其中(多个)局部变量在源代码中的循环的迭代之间缺乏相关性;自动生成(多个)局部变量的流水线执行代码;以及将流水线执行代码合并到编译器的输出中。因此,所图示的设备173至少在一定程度上提高了性能,使得包含私有数据的循环的流水线改善了吞吐量。实际上,执行循环所需的总循环数可能大大小于静态循环数与循环迭代次数的乘积。

在一个示例中,逻辑177包括定位(例如,嵌入)在(多个)衬底175内的晶体管通道区域。因此,逻辑177与(多个)衬底175之间的接口可以不是突变结。逻辑177还可被认为包括在(多个)衬底175的初始晶片上生长的外延层。

图8图示出根据一个实施例的处理器核200。处理器核200可以是用于任何类型的处理器的核,这些处理器诸如微处理器、嵌入式处理器、数字信号处理器(DSP)、网络处理器、或用于执行代码的其他设备。虽然图8中仅图示了一个处理器核200,但处理元件可替代地包括多于一个图8中所图示的处理器核200。处理器核200可以是单线程核,或对于至少一个实施例,处理器核200可以是多线程的,因为其每个核可包括多于一个的硬件线程上下文(或“逻辑处理器”)。

图8还图示出耦合至处理器核200的存储器270。存储器270可以是本领域技术人员已知的或以其他方式对本领域技术人员可用的各种各样的存储器(包括存储器层级结构的各个层)中的任何一种。存储器270可包括要由处理器核200执行的一条或多条代码213指令,其中代码213可实现已讨论的方法50(图4)的一个或多个方面。处理器核200遵循由代码213指示的指令的程序序列。每条指令可进入前端部分210并由一个或多个解码器220处理。解码器220可生成微操作(诸如采用预定义格式的固定宽度的微操作)作为其输出,或者可生成反映原始代码指令的其他指令、微指令或控制信号。所图示的前端部分210还包括寄存器重命名逻辑225和调度逻辑230,该调度逻辑230一般分配资源并将与供执行的转换指令相对应的操作进行排队。

处理器核200被示出为包括具有一组执行单元255-1至255-N的执行逻辑250。一些实施例可以包括专用于指定功能或功能组的大量执行单元。其他实施例可包括仅一个执行单元或可以执行特定功能的一个执行单元。所图示的执行逻辑250执行由代码指令指定的操作。

在完成执行由代码指令指定的操作之后,后端逻辑260对代码213的指令进行引退。在一个实施例中,处理器核200允许乱序执行但是要求指令的有序引退。引退逻辑265可采取如本领域技术人员已知的各种形式(例如,重排序缓冲器等等)。以此方式,至少根据由解码器生成的输出、由寄存器重命名逻辑225利用的硬件寄存器和表、以及由执行逻辑250修改的任何寄存器(未示出),处理器核200在代码213的执行期间被变换。

虽然未在图8中图示,但处理元件可包括与处理器核200一起在芯片上的其他元件。例如,处理元件可包括与处理器核200一起的存储器控制逻辑。处理元件可包括I/O控制逻辑和/或可包括与存储器控制逻辑一起被集成的I/O控制逻辑。处理元件还可包括一个或多个高速缓存。

现在参考图9,所示出的是根据实施例的计算系统1000实施例的框图。图9中所示出的是多处理器系统1000,其包括第一处理元件1070和第二处理元件1080。尽管示出了两个处理元件1070和1080,但是要理解,系统1000的实施例还可包括仅一个此类处理元件。

系统1000被图示为点对点互连系统,其中第一处理元件1070和第二处理元件1080经由点对点互连1050耦合。应当理解,图9中所图示的互连中的任何或全部可被实现为多分支总线而不是点对点互连。

如图9中所示,处理元件1070和1080中的每个处理元件可以是包括第一和第二处理器核(即,处理器核1074a和1074b以及处理器核1084a和1084b)的多核处理器。此类核1074a、1074b、1084a、1084b可被配置成用于以与上文结合图8所讨论的方式类似的方式来执行指令代码。

每个处理元件1070、1080可包括至少一个共享高速缓存1896a、1896b。共享高速缓存1896a、1896b可存储分别由处理器的一个或多个组件(诸如核1074a、1074b以及1084a、1084b)利用的数据(例如,指令)。例如,共享高速缓存1896a、1896b可本地地对存储器1032、1034中所存储的数据进行高速缓存以供处理器的组件的更快速访问。在一个或多个实施例中,共享高速缓存1896a、1896b可包括一个或多个中间级别高速缓存(诸如第2级(L2)、第3级(L3)、第4级(L4)、或其他级别的高速缓存)、末级高速缓存(LLC)和/或其组合。

虽然被示出为具有仅两个处理元件1070、1080,但要理解,实施例的范围并不限于此。在其他实施例中,在给定的处理器中可存在一个或多个附加处理元件。替代地,处理元件1070、1080中的一者或多者可以是除处理器之外的元件,诸如加速器或现场可编程门阵列。例如,(多个)附加处理元件可包括与第一处理器1070相同的(多个)附加处理器、与第一处理器1070异构或不对称的(多个)附加处理器、加速器(诸如例如,图形加速器或数字信号处理(DSP)单元)、现场可编程门阵列、或任何其他处理元件。在包括架构、微架构、热、功耗特性等等一系列品质度量方面,处理元件1070、1080之间可存在各种差异。这些差异自身可有效地表现为处理元件1070、1080之中的不对称性和异构性。对于至少一个实施例,各处理元件1070、1080可驻留在同一管芯封装中。

第一处理元件1070可进一步包括存储器控制器逻辑(MC)1072以及点对点(P-P)接口1076和1078。类似地,第二处理元件1080可包括MC 1082以及P-P接口1086和1088。如图9中所示,MC 1072和1082将处理器耦合至相应的存储器,即存储器1032和存储器1034,这些存储器可以是本地附连到相应处理器的主存储器的部分。尽管MC 1072和MC 1082被图示为被集成到处理元件1070、1080中,但对于替代实施例,MC逻辑可以是处理元件1070、1080外部的分立逻辑,而不是被集成于其中。

第一处理元件1070和第二处理元件1080可分别经由P-P互连1076、1086耦合至I/O子系统1090。如图9中所示,I/O子系统1090包括P-P接口1094和1098。此外,I/O子系统1090包括将I/O子系统1090与高性能图形引擎1038耦合的接口1092。在一个实施例中,可使用总线1049将图形引擎1038耦合至I/O子系统1090。替代地,点对点互连可耦合这些组件。

进而,I/O子系统1090可经由接口1096耦合至第一总线1016。在一个实施例中,第一总线1016可以是外围组件互连(PCI)总线,或诸如PCI快速(PCI Express)总线或另一第三代I/O互连总线之类的总线,但是实施例的范围不限于此。

如图9中所示,各种I/O设备1014(例如,生物计量扫描仪、扬声器、相机、传感器)可与总线桥1018一起耦合至第一总线1016,该总线桥1018可将第一总线1016耦合至第二总线1020。在一个实施例中,第二总线1020可以是低引脚计数(LPC)总线。各种设备可耦合到第二总线1020,这些设备包括例如键盘/鼠标1012、(多个)通信设备1026、以及数据存储单元1019(诸如在一个实施例中可包括代码1030的盘驱动器或其他大容量存储设备)。所图示的代码1030可实现已讨论的方法50(图4)的一个或多个方面。进一步地,音频I/O 1024可耦合至第二总线1020,并且电池1010可向计算系统1000供给功率。

注意,构想了其他实施例。例如,系统可实现多分支总线或者另一此类通信拓扑,而不是图9的点对点架构。而且,可替代地使用比图9中所示的更多或更少的集成芯片来对图9的元件进行分区。

附加说明和示例:

示例1包括性能增强的计算系统,该计算系统包括:网络控制器;耦合到网络控制器的处理器;以及耦合到处理器的存储器,该存储器包括一组可执行程序指令,当该指令由处理器执行时,使得处理器:检测源代码中的一个或多个局部变量,其中一个或多个局部变量在源代码中的循环的迭代之间缺乏相关性;自动地生成一个或多个局部变量的流水线执行代码;以及将流水线执行代码合并到编译器的输出。

示例2包括示例1的计算系统,其中流水线执行代码包括一个或多个局部变量的缓冲器存储池的初始化。

示例3包括示例2的计算系统,其中初始化的缓冲器存储池大于对应于循环的单次迭代的局部存储量。

示例4包括示例2的计算系统,其中流水线执行代码进一步包括在初始化的缓冲器存储池中的多个令牌化插槽的定义,并且其中每个令牌化插槽对应于循环的流水线化迭代。

示例5包括示例1的计算系统,其中流水线执行代码包括流水线深度定义。

示例6包括示例1至5中任一项的计算系统,其中,在源代码的注册之后检测一个或多个局部变量,流水线执行代码的自动生成响应于对一个或多个局部变量的检测,并且源代码与数据流图中的通信信道相关联。

示例7包括一种半导体设备,该半导体设备包括:一个或多个衬底、以及耦合至该一个或多个衬底的逻辑,其中该逻辑至少部分地在能配置的逻辑或固定功能硬件逻辑中的一者或多者中实现,耦合至一个或多个衬底的逻辑用于:检测源代码中的一个或多个局部变量,其中一个或多个局部变量在源代码中的循环的迭代之间缺乏相关性;自动地生成一个或多个局部变量的流水线执行代码;以及将流水线执行代码合并到编译器的输出。

示例8包括示例7的半导体设备,其中流水线执行代码包括一个或多个局部变量的缓冲器存储池的初始化。

示例9包括示例8的半导体设备,其中初始化的缓冲器存储池大于对应于循环的单次迭代的局部存储量。

示例10包括示例8的半导体设备,其中流水线执行代码进一步包括在初始化的缓冲器存储池中的多个令牌化插槽的定义,并且其中每个令牌化插槽对应于循环的流水线化迭代。

示例11包括示例7的半导体设备,其中流水线执行代码包括流水线深度定义。

示例12包括示例7至11中任一项的半导体设备,其中,在源代码的注册之后检测一个或多个局部变量,流水线执行代码的自动生成响应于对一个或多个局部变量的检测,并且源代码与数据流图中的通信信道相关联。

示例13包括如示例7至12中任一项的半导体设备,其中耦合至该一个或多个衬底的逻辑包括位于该一个或多个衬底内的晶体管沟道区。

示例14包括至少一种计算机可读存储器介质,包括一组指令,这些指令在由计算系统执行时,使得计算系统用于:检测源代码中的一个或多个局部变量,其中一个或多个局部变量在源代码中的循环的迭代之间缺乏相关性;自动地生成一个或多个局部变量的流水线执行代码;以及将流水线执行代码合并到编译器的输出。

示例15包括示例14的至少一种计算机可读存储器介质,其中流水线执行代码包括一个或多个局部变量的缓冲器存储池的初始化。

示例16包括示例15的至少一种计算机可读存储器介质,其中初始化的缓冲器存储池大于对应于循环的单次迭代的局部存储量。

示例17包括示例15的至少一种计算机可读存储器介质,其中流水线执行代码进一步包括在初始化的缓冲器存储池中的多个令牌化插槽的定义,并且其中每个令牌化插槽对应于循环的流水线化迭代。

示例18包括示例14的至少一种计算机可读存储介质,其中,流水线执行代码包括流水线深度定义。

示例19包括示例14至18中任一项的至少一种计算机可读存储介质,其中,在源代码的注册之后检测一个或多个局部变量,流水线执行代码的自动生成响应于对一个或多个局部变量的检测,并且源代码与数据流图中的通信信道相关联。

示例20包括一种操作编译器的方法,该方法包括:检测源代码中的一个或多个局部变量,其中一个或多个局部变量在源代码中的循环的迭代之间缺乏相关性;自动生成一个或多个局部变量的流水线执行代码;以及将流水线执行代码合并到编译器的输出中。

示例21包括示例20的方法,其中流水线执行代码包括一个或多个局部变量的缓冲器存储池的初始化。

示例22包括示例21的方法,其中初始化的缓冲器存储池大于对应于循环的单次迭代的局部存储量。

示例23包括示例21的方法,其中流水线执行代码进一步包括在初始化的缓冲器存储池中的多个令牌化插槽的定义,并且其中每个令牌化插槽对应于循环的流水线化迭代。

示例24包括示例20的方法,其中流水线执行代码包括流水线深度定义。

示例25包括示例20至24中任一项的方法,其中,在源代码的注册之后检测一个或多个局部变量,流水线执行代码的自动生成响应于对一个或多个局部变量的检测,并且源代码与数据流图中的通信信道相关联。

示例26包括用于执行如示例20至25中任一项所述的方法的装置。

因此,本文所描述的技术可以包括自动编译器转换,该自动编译器转换可以将具有某种形式的局部循环存储的循环作为输入,并使用数据流架构(诸如CSA)的一个或多个工作者对循环进行动态流水线化。编译器可以在注册后检测循环中剩余的局部存储,并分配足够的存储器以保存以下各项的私有变量:a)每个工作者,以及b)每个工作者的并发执行。随着每个工作者主体开始执行,可以为工作者主体指派已分配的私有存储中的唯一插槽。当工作者完成迭代的执行时,与工作者相关联的局部存储插槽可以自动回收以供下次迭代使用。

诸如例如SPGemm(稀疏矩阵-矩阵乘法)和先验(Apriori)基准之类的若干应用/基准可以受益于本文所述的转换技术。

实施例适用于与所有类型的半导体集成电路(“IC”)芯片一起使用。这些IC芯片的示例包括但不限于处理器、控制器、芯片组组件、可编程逻辑阵列(PLA)、存储器芯片、网络芯片、芯片上系统(SoC)、SSD/NAND控制器ASIC等等。另外,在一些附图中,信号导线用线表示。一些线可以是不同的以指示更具构成性的信号路径,可具有数字标号以指示构成性信号路径的数目,和/或可在一端或多端具有箭头以指示主要信息流向。然而,这不应以限制性方式来解释。相反,此类增加的细节可与一个或多个示例性实施例结合使用以促进更容易地理解电路。任何所表示的信号线,不管是否具有附加信息,实际上都可包括一个或多个信号,这一个或多个信号可在多个方向上行进,并且可用任何适合类型的信号方案来实现,例如利用差分对来实现的数字或模拟线路、光纤线路、和/或单端线路。

示例尺寸/模型/值/范围可能已经被给出,但是实施例不限于此。随着制造技术(例如,光刻法)随时间变得成熟,预料到能制造出更小尺寸的设备。另外,为了说明和讨论的简单并且为了不使实施例的某些方面模糊,到IC芯片和其他组件的公知的功率/接地连接可在附图内示出也可不示出。此外,各种布置可以框图形式示出以避免模糊各实施例,并且这也鉴于关于此类框图布置的实现的具体细节高度依赖于实现实施例的平台这一事实,即这些具体细节应当落在本领域内技术人员的学识范围内。在阐述具体细节(例如电路)以描述示例实施例的情况下,对本领域内技术人员应显而易见的是,没有这些具体细节或对这些具体细节作出变型也可实践各实施例。描述因此被视为是说明性的而不是限制性的。

术语“耦合的”在本文中可被用于表示所讨论的组件之间的任何类型的直接或间接关系,且可应用于电气的、机械的、流体的、光学的、电磁的、机电的或其他连接。另外,术语“第一”、“第二”等在本文中可仅用于便于讨论,并且不带有特定时间的或按时间顺序的意义,除非另有陈述。

如在本申请和权利要求书中所使用的,由术语“……中的一个或多个”联接的项列表可意指所列项的任何组合。例如,短语“A、B或C中的一个或多个”可意指A;B;C;A和B;A和C;B和C;或A、B和C。

本领域技术人员从前面的描述将领会,实施例的广泛技术能以各种形式来实现。因此,尽管已结合其特定示例描述了实施例,但实施例的真实范围不应当限于此,因为在研究附图、说明书和所附权利要求书之后,其他修改对于本领域技术人员将变得显而易见。

25页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种编译数据处理方法、装置、电子设备及存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!