针对具有多个功能单元的处理器调度循环的方法转让专利

申请号 : CN201410678024.2

文献号 : CN104657210B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李莲福梁镐朴永焕凯沙瓦·普拉萨德

申请人 : 三星电子株式会社

摘要 :

一种针对具有多个功能单元的处理器调度循环的方法。提供一种循环调度方法,所述方法包括:使用执行单元调度第一循环;使用作为调度第一循环的结果而可用的执行单元来调度第二循环。与第(n‑1)循环类似,可使用调度第(n‑1)循环的结果来调度第n循环(n>2)。第一循环可以是高于第二循环的较高优先级循环。

权利要求 :

1.一种循环调度方法,包括:

使用多个执行单元调度第一循环;

使用所述多个执行单元之中的在调度第一循环之后可用的剩余的执行单元来调度第二循环,其中,第一循环的优先级高于第二循环的优先级,其中,所述方法还包括:

响应于使用所述可用的剩余的执行单元未成功调度第二循环,展开对第一循环调度的结果;

使用通过展开对第一循环调度的结果而获得的结果来调度第二循环。

2.如权利要求1所述的方法,其中,调度第二循环的步骤包括:使用在第一循环被调度的周期中还未被分配给第一循环的执行单元来调度第二循环的至少一部分。

3.如权利要求1所述的方法,其中,调度第一循环的步骤包括:从在源代码中包括的循环之中选择独立的多个循环;

确定所选择的多个循环的优先级。

4.如权利要求1所述的方法,其中,循环的优先级基于以下项中的至少一个被计算:循环的迭代计数和用于循环的单次迭代的周期数。

5.如权利要求1所述的方法,其中,调度第二循环的步骤包括:基于在第二循环中包括的指令之间的数据依赖性,将所述指令分配给在第一循环被调度的周期中的可用的执行单元。

6.如权利要求1所述的方法,其中,调度第二循环的步骤包括:确定将被用于调度第二循环的执行单元;

验证所确定的执行单元是否可用于第二循环被调度的周期中。

7.如权利要求1所述的方法,其中,调度第一循环的步骤包括:基于在第一循环中包括的指令之间的数据依赖性,将所述指令分配给在周期中的执行单元。

8.如权利要求1所述的方法,其中,所述展开步骤包括:基于针对展开计数的阈值和针对被展开的调度结果的周期数的阈值中的至少一个,确定是否将展开调度第一循环的结果。

9.如权利要求1所述的方法,其中,调度第二循环的步骤包括:响应于第一循环的迭代计数大于第二循环的迭代计数,在第二循环被迭代之后,使用声明防护来限制第二循环的执行。

10.如权利要求1所述的方法,调度第二循环的步骤包括:响应于第一循环的迭代计数小于第二循环的迭代计数,在第一循环被迭代之后,调度第二循环以迭代第二循环的剩余部分。

11.如权利要求10所述的方法,还包括:在第一循环被迭代之后,调度用于存储第二循环的中间数据的指令。

12.一种控制器,包括:

选择器,被配置为从在源代码中包括的多个循环中选择独立的多个循环;

检测器,被配置为在所选择的多个循环之中确定第一循环和第二循环;

调度器,被配置为使用多个执行单元调度第一循环,并使用所述多个执行单元之中的在调度第一循环之后可用的剩余的执行单元来调度第二循环;

产生器,被配置为产生包括对第一循环调度的结果和对第二循环调度的结果的目标代码,其中,第一循环的优先级高于第二循环的优先级,其中,调度器还被配置为调度第二循环以进行以下操作:响应于第一循环的迭代计数小于第二循环的迭代计数,迭代第二循环的剩余部分,并且响应于第一循环的迭代计数大于第二循环的迭代计数,在第二循环被迭代之后,使用声明防护来限制第二循环的执行。

说明书 :

针对具有多个功能单元的处理器调度循环的方法

技术领域

[0001] 以下描述涉及一种循环调度方法。

背景技术

[0002] 超长指令字(VLIW)处理器或粗粒度可重构阵列(CGRA)处理器使用多个功能单元(FU)。为了使FU相互通信,FU可通过数据路径相互连接。
[0003] 在处理器中选择数据路径和FU的配置中,若干组合是可能的。

发明内容

[0004] 提供本发明内容以按简化形式介绍对构思的选择,其中,所述构思在以下的具体实施方式中被进一步描述。本发明内容不意图确定被要求权利的主题的关键特征或显著特征,也不意图用作对确定被要求保护的主题的范围的帮助。
[0005] 在一个总的方面,一种循环调度方法包括:使用执行单元调度较高优先级循环;使用作为调度较高优先级循环的结果而可用的执行单元来调度较低优先级循环。
[0006] 调度较高优先级循环的步骤可包括:使用执行单元调度最高优先级循环。
[0007] 调度较低优先级循环的步骤可包括:使用在较高优先级循环被调度的周期中未被分配给较高优先级循环的执行单元来调度较低优先级循环的至少一部分。
[0008] 调度较高优先级循环的步骤可包括:从在源代码中包括的循环中选择独立的多个循环;确定被选择的多个循环的优先级。
[0009] 较高优先级循环的优先级可高于较低优先级循环的优先级,并且循环的优先级可基于以下项中的至少一个被计算:循环的迭代计数和用于循环的单次迭代的周期数。
[0010] 调度较低优先级循环的步骤可包括:基于在较低优先级循环中包括的指令之间的数据依赖性,将所述指令分配给在较高优先级循环被调度的周期中的可用执行单元。
[0011] 调度较低优先级循环的步骤可包括:确定将被用于调度较低优先级循环的执行单元;验证被确定的执行单元是否可用于较低优先级循环被调度的周期中。
[0012] 调度较高优先级循环的步骤可包括:基于在最高优先级循环中包括的指令之间的数据依赖性,将所述指令分配给在周期中的执行单元。
[0013] 所述方法还可包括:响应于较低优先级循环未使用可用执行单元被调度,展开调度较高优先级循环的结果;使用作为被展开的调度结果而可用的执行单元来调度较低优先级循环。
[0014] 所述展开步骤可包括:基于用于展开计数的阈值和用于被展开的调度结果的周期数的阈值中的至少一个,确定是否将展开调度较高优先级循环的结果。
[0015] 调度较低优先级循环的步骤可包括:响应于较高优先级循环的迭代计数大于较低优先级循环的迭代计数,在较低优先级循环被迭代之后,使用声明防护来限制较低优先级循环的执行。
[0016] 所述方法还可包括:响应于较高优先级循环的迭代计数小于较低优先级循环的迭代计数,在较高优先级循环被迭代之后,调度较低优先级循环以迭代较低优先级循环的剩余部分。
[0017] 所述方法还可包括:在较高优先权循环被迭代之后,调度用于存储较低优先级循环的中间数据的指令。
[0018] 执行单元可包括在粗粒度可重构阵列(CGRA)处理器或超长指令字(VLIW)处理器中。
[0019] 执行单元可包括标量功能单元(FU)、打包/解包FU、矢量加载/存储FU和矢量FU,其中,标量FU被配置为处理标量数据操作,打包/解包FU被配置为处理标量数据和矢量数据之间的转换,矢量加载/存储FU被配置为处理对矢量数据的加载和存储,矢量FU被配置为处理对矢量数据的操作。
[0020] 在另一总的方面,一种循环调度方法包括:使用执行单元调度第一循环;使用作为调度第一循环的结果而可用的执行单元来调度第二循环。
[0021] 调度第二循环的步骤可包括:使用在第一循环被调度的周期中未被分配给第一循环的执行单元来调度第二循环的至少一部分。
[0022] 所述方法还可包括:从在源代码中包括的循环中选择两个独立的循环;将能够使可用执行单元的数量增加的被选择的循环确定为第一循环,并将剩余的被选择的循环确定为第二循环。
[0023] 第一循环的优先级可高于第二循环的优先级,并且循环的优先级可基于以下项中的至少一个被计算:循环的迭代计数和用于循环的单次迭代的周期数。
[0024] 调度第二循环的步骤可包括:基于在第二循环中包括的指令之间的数据依赖性,将所述指令分配给在第一循环被调度的周期中的可用执行单元。
[0025] 调度第二循环的步骤可包括:确定将被用于调度第二循环的执行单元;验证被确定的执行单元是否可用于第二循环被调度的周期中。
[0026] 调度第一循环的步骤可包括:基于在第一循环中包括的指令之间的数据依赖性,将所述指令分配给在周期中的执行单元。
[0027] 所述方法还可包括:响应于第二循环未使用可用执行单元被调度,展开调度第一循环的结果;使用作为被展开的调度结果而可用的执行单元来调度第二循环。
[0028] 所述展开步骤可包括:基于用于展开计数的阈值和用于被展开的调度结果的周期数的阈值中的至少一个,确定是否将展开调度第一循环的结果。
[0029] 调度第二循环的步骤可包括:响应于第一循环的迭代计数大于第二循环的迭代计数,在第二循环被迭代之后,使用声明防护来限制第二循环的执行。
[0030] 所述方法还可包括:响应于第一循环的迭代计数小于第二循环的迭代计数,在第一循环被迭代之后,调度第二循环以迭代第二循环的剩余部分。
[0031] 所述方法还可包括:在第一循环被迭代之后,调度用于存储第二循环的中间数据的指令。
[0032] 在另一总的方面,提供一种存储用于循环调度的程序的非暂时性计算机可读存储介质,所述程序包括用于使计算机执行以上所述的第一个方法的指令。
[0033] 在另一总的方面,一种控制器包括:选择器,被配置为从在源代码中包括的多个循环中选择独立的多个循环;检测器,被配置为在被选择的多个循环中确定具有较高优先级的第一循环和具有较低优先级的第二循环;调度器,被配置为使用执行单元调度第一循环,并使用作为调度第一循环的结果而可用的执行单元来调度第二循环;产生器,被配置为产生包括调度第一循环的结果和调度第二循环的结果的目标代码。
[0034] 调度第二循环的步骤可包括:使用在第一循环被调度的周期中未被分配给第一循环的执行单元来调度第二循环的至少一部分。
[0035] 所述确定步骤可包括:基于以下项中的至少一个来计算第一循环的优先级和第二循环的优先级:循环的迭代计数和用于循环的单次迭代的周期数。
[0036] 调度第二循环的步骤可包括:将第二循环的数据流图(DFG)映射到在第二循环被调度的周期中可用的执行单元。
[0037] 调度第二循环的步骤可包括:确定将被用于调度第二循环的执行单元;验证被确定的执行单元是否可用于第二循环被调度的周期中。
[0038] 调度第一循环的步骤可包括:在周期中将第一循环的数据流图(DFG)调度至执行单元。
[0039] 调度器还可被配置为:响应于第二循环未使用可用执行单元被调度,展开调度第二循环的结果;使用作为被展开的调度结果而可用的执行单元来调度第二循环。
[0040] 调度第二循环的步骤可包括:在第一循环的迭代计数大于第二循环的迭代计数的情况下,在第二循环被迭代之后,使用声明防护来限制第二循环的执行。
[0041] 调度器还可被配置为:响应于第一循环的迭代计数小于第二循环的迭代计数,调度第二循环以迭代第二循环的剩余部分。
[0042] 在另一总的方面,一种循环调度方法包括:使用执行单元调度较高优先级循环;使用作为调度较高优先级循环的结果而可用的执行单元来调度较低优先级循环。
[0043] 调度较高优先级循环的步骤可包括:使用执行单元调度最高优先级循环。
[0044] 调度较低优先级循环的步骤可包括:使用在较高优先级循环被调度的周期中未被分配给较高优先级循环的执行单元来调度较低优先级循环的至少一部分。
[0045] 调度较高优先级循环的步骤可包括:从在源代码中包括的循环中选择独立的多个循环;确定被选择的多个循环的优先级。
[0046] 调度较低优先级循环的步骤可包括:基于在较低优先级循环中包括的指令之间的数据依赖性,将所述指令分配给在较高优先级循环被调度的周期中的可用执行单元。
[0047] 调度较低优先级循环的步骤可包括:确定将被用于调度较低优先级循环的执行单元;验证被确定的执行单元是否可用于较低优先级循环被调度的周期中。
[0048] 调度较高优先级循环的步骤可包括:基于在最高优先级循环中包括的指令之间的数据依赖性,将所述指令分配给在周期中的执行单元。
[0049] 其他特征和方面将从以下详细描述、附图和权利要求变得明显。

附图说明

[0050] 图1是示出循环调度方法的示例的流程图。
[0051] 图2A和图2B分别示出调度第一循环和第二循环的结果的示例。
[0052] 图3A和图3B示出调度单个循环的示例。
[0053] 图4A至图4F示出调度第一循环和第二循环的示例。
[0054] 图5和图6是示出通过展开调度第一循环的结果来调度第二循环的示例的流程图。
[0055] 图7、图8A、图8B、图9至图12示出优化的目标架构的示例。
[0056] 贯穿附图和具体实施方式,除非另有说明或规定,否则相同的附图标号将被理解为指示相同的元件、特征和结构。为了清晰、说明和方便起见,附图可不按比例绘制,并且可夸大附图中元件的相对尺寸、比例和描绘。

具体实施方式

[0057] 提供以下详细描述来帮助读者获得对在此描述的方法、设备和/或系统的全面理解。然而,在此描述的系统、设备和/或方法的各种改变、修改和等同形式对于本领域的普通技术人员将是明显的。描述的处理步骤和/或操作的进展是示例;然而,除了必须按照特定顺序发生的步骤和/或操作之外,操作的顺序和/或操作不限于在此阐述的内容,并可如本领域所公知的那样改变。此外,为了更加清晰和简明,可省略对于本领域的普通技术人员公知的功能和结构的描述。
[0058] 可以以不同形式来实施在此描述的特征,并且所述特征将不被解释为受限于在此描述的示例。相反,提供在此描述的示例,使得本公开将是彻底和完整的,并将本公开的整个范围传达给本领域的普通技术人员。
[0059] 作为针对最高性能的设计,所有FU可被配置为处理所有指令,并且数据路径可被配置为将所有FU相互连接。数据路径可具有在由处理器支持的矢量数据类型之中最宽的比特宽度。
[0060] 图1是示出循环调度方法的示例的流程图。
[0061] 参照图1,循环调度方法包括调度第一循环的操作110和调度第二循环的操作120。例如,在操作110,使用多个执行单元来调度第一循环。执行单元是指被配置为执行指令的单元。在示例中,执行单元是在超长指令字(VLIW)处理器或粗粒度可重构阵列(CGRA)处理器中包括的功能单元(FU)。在操作110,在第一循环中包括的多个指令被分配给多个执行单元。参照图7至图12进一步描述所述多个执行单元。在此示例中,在操作120,使用在调度第一循环之后可用的如以上讨论的执行单元来调度第二循环。因此,在第二操作120,使用在调度第一循环之后未使用的执行单元来调度在第二循环中包括的多个指令。
[0062] 示例可适用于调度两个循环的情况和调度至少三个循环的另一情况。例如,按优先级调度第一循环。在按优先级调度第一循环之后,在示例中,使用剩余的硬件(HW)资源来调度第二循环。另外,使用在调度第一循环和第二循环之后剩余的HW资源来调度第三循环。示例也适用于调度将被同时执行的至少四个循环的情况。然而,为了便于描述,调度第一循环和第二循环的示例情况被用作示意性示例。
[0063] 参照表1的示例,用于无线电核心的源代码包括多个循环,例如,循环1(loop1)和循环2(loop2)。在此示例中,源代码中的loop1与在操作110调度的第一循环相应,源代码中的loop2与在操作120调度的第二循环相应。
[0064] 表1
[0065]
[0066]
[0067] 参照表2,loop1在其循环体中包括多个指令。在操作110,使用多个执行单元来调度loop1。例如,参照图2A的示例,在每个周期220中,在loop1中包括的多个指令被分配给多个执行单元210。由于HW资源的限制和loop1中的指令之间的依赖性,在此示例中,难以并行地调度循环loop1中的所有指令。在此示例中,在调度loop1中的指令之后,可能存在未使用的执行单元。因此,未使用的执行单元被描述为NOP(未操作)执行单元。在图2A的示例中,与填满的块230相应的执行单元FU03处理被分配给相应周期cycle3的指令S32_SAT_CMUL。然而,与图2A中的空白块240相应的执行单元FU04在相应周期cycle3中不处理任何指令,在没有完成任何处理任务的情况下浪费操作周期。
[0068] 表2
[0069]
[0070] 在表2中,S32_LD_1()是用于矢量加载操作的指令。S32_SAT_CCMUL()是用于矢量乘法操作的指令。S32_INSERT_ALL()是用于矢量替换操作的指令,S32_COMP_HIGH()是用于矢量较高位比较操作的指令,S32_COMP_LOW()是用于矢量较低位比较操作的指令。S32_SAT_CMUL()是用于矢量乘法操作的指令,S32_SAT_ADD()是用于矢量加法操作的指令,S32_ST_0()是用于矢量存储操作的指令。
[0071] 参照表3,loop2在其循环体中包括多个指令。如上所讨论的,在示例中,在操作120,使用在调度loop1之后未使用的执行单元来调度loop2。例如,参照图2B的示例,在loop2中包括的多个指令被分配给在调度loop1之后仍为空白的块。通过调度loop2,用于loop2的指令cga_add 250被分配给在调度loop1之后仍为空白的块240。因此,指令级并行(ILP)增强,并且未使用的执行单元的数量减少。因此,处理器的性能增强。另外,将被消耗的操作周期的数量可能减少,并且处理器的功耗可减少。
[0072] 表3
[0073]
[0074] 在表3中,I_S32_LD_1()是用于矢量加载操作的指令。S32_SAT_CCMUL()是用于矢量乘法操作的指令。S32_INSERT_ALL是用于矢量替换操作的指令。S32_COMP_HIGH()是用于矢量较高位比较操作的指令,S32_COMP_LOW()是用于矢量较低位比较操作的指令。S32_SAT_CMUL()是用于矢量乘法操作的指令,S32_SAT_ADD()是用于矢量加法操作的指令,I_S32_ST_0()是用于矢量存储操作的指令。
[0075] 在下文中,针对图3A和图3B描述调度单个循环的示例,针对图4A和图4B进一步描述使用调度第一循环的结果来调度第二循环的示例。
[0076] 图3A和图3B示出调度单个循环的示例。在描述图3A和图3B之前,描述根据示例的由调度器采用的调度方法。调度器调度循环来并行执行在所述循环的循环体中包括的指令。例如,调度器调度循环来并行执行最内部循环的迭代。在下文中,术语“迭代”是指在任意迭代时间点执行一次循环体的操作。因此,调度器执行循环调度或编译。调度器基于其被如何实现也被称为循环调度设备或编译设备。在示例中,调度器包括硬件模块,例如,硬件加速器(HWA)。
[0077] 在示例中,调度器使用流水线方法来调度循环。例如,调度器使用模(modulo)调度方法来调度循环。模调度方法是指这样的方法:调度循环以按照规则间距来迭代地执行所述循环的循环体。在示例中,规则间距包括多个周期。规则间距是指在循环中的两个连续的迭代开始的时间点之间的差。规则间距也可被称为启动间距(II)。例如,在图2A的调度结果和图2B的调度结果中,II与五(5)个周期(包括周期0、1、2、3和4)相应。
[0078] 参照图3A的示例,调度器将循环的数据流图(DFG)310映射到目标架构320。调度器确定将执行循环中包括的多个指令的执行单元和周期。另外,调度器确定数据路径,其中,作为实施执行的结果而获得的数据将沿所述数据路径被传输。可选地,调度器考虑迭代内的数据关联、迭代之间的数据关联以及HW资源的限制。例如,调度器使用指示数据关联的DFG 310和目标架构320。
[0079] 参照图3A的DFG 310,指令n2和n3在指令n1执行之后被执行。指令n4在指令n2和n3两者执行之后被执行。参照图3A的目标架构320,执行单元fu1与执行单元fu2和执行单元fu3交换数据。执行单元fu2与执行单元fu1和执行单元fu4交换数据。执行单元fu3与执行单元fu1和执行单元fu4交换数据。执行单元fu4与执行单元fu2和执行单元fu3交换数据。然而,如图3A中所示,执行单元fu1和执行单元fu4彼此并不直接交换数据。
[0080] 参照图3B的示例,调度器在第一周期(当t=1时)中将指令n1分配给执行单元fu2,这样t指示次数。参照DFG 310,直到执行了指令n1,才执行其他指令。因此,在第一周期t=1中,不分配其他指令。在第二周期t=2中,执行指令n2和n3。由于被分配了指令n1的执行单元fu2能够与执行单元fu1和fu4交换数据,因此在此示例中,指令n2被分配给执行单元fu1,并且指令n3被分配给执行单元fu4。在第三周期t=3中,执行指令n4,并且在此示例中,指令n4被分配给与执行单元fu1和fu4交换数据的执行单元fu3。因此,由调度器基于可用执行单元和与所述可用执行单元进行通信的其他功能单元进行通信的能力,来对所述可用执行单元分配指令以进行操作。
[0081] 当不存在迭代之间的数据依赖性时,可在执行第一迭代i1之前启动第二迭代i2。如果存在依赖性,则必需等待迭代终止,因为如果存在依赖性,则第二迭代i2缺少其进行所需的信息。然而,当不存在依赖性时,可并行进行和处理多个迭代,因为在这种情况下所述多个迭代不相互作用。
[0082] 然而,在示例中,由于HW资源的限制,第二迭代i2不与第一迭代i1同时启动,而在第二周期t=2中启动。然后,与调度第一迭代i1的方式类似,调度器调度第二迭代i2。在下文中,n#(i##)是指针对第##迭代的指令n#,#和##指示特定指令和迭代。
[0083] 在图3B的示例中,调度器在第二周期t=2中将n1(i2)分配给执行单元fu2。参照DFG 310,直到执行了指令n1之后,才执行其他指令。因此,在第二周期t=2中,不分配针对第二迭代i2的其他指令。在第三周期t=3中,执行n2(i2)和n3(i2)。由于被分配n1(i2)的执行单元fu2能够与执行单元fu1和fu4交换数据,因此n2(i2)被分配给执行单元fu1,并且n3(i2)被分配给执行单元fu4。在第四周期t=4中,执行n4(i2),并且n4(i2)被分配给与执行单元fu1和fu4交换数据的执行单元fu3。
[0084] 通过若干次调度循环,在此示例中,调度器获得图3B的结果,其中,所述若干次与所述循环的迭代计数N相应。图3B的结果被分类为三个时间段。第一时间段330与序言(prologue)(循环的早期迭代被执行的时间段)相应。第二时间段340与核心341处于稳定状态的时间段相应。在第二时间段340中,相同指令可被分配给多个执行单元。如图3B的示例中所示,在第三周期t=3中,指令n2被分配给执行单元fu1,指令n1被分配给执行单元fu2,指令n4被分配给执行单元fu3,指令n3被分配给执行单元fu4。类似地,在第四周期t=4中,指令n2被分配给执行单元fu1,指令n1被分配给执行单元fu2,指令n4被分配给执行单元fu3,指令n3被分配给执行单元fu4。一直到第二时间段340结束的第N周期t=N,相同指令被分配给多个执行单元。在示例中,核心是指在第二时间段340中被重复的分配结果。第三时间段350与尾声(epilogue)(循环的后续迭代被执行的时间段)相应。
[0085] 形成核心的若干周期可大体上与以上描述的启动间距相同。例如,在图3B的第二时间段340中,在第三迭代i3启动的时间点和第四迭代i4启动的时间点之间的周期差是1个周期的差,因此启动间距是1个周期。因此,在图3B的第二时间段340中,以单个周期形成核心341。
[0086] 在图3B的示例中,在核心341中使用所有执行单元。然而,如所讨论的,由于源代码中的关联之间的任何数据依赖性以及HW资源的限制,在实践中可能难以执行调度使得在每个周期中利用所有执行单元。为了解决此问题,调度器使用作为调度单个循环的结果而在每个周期中未使用的HW资源来调度另一循环的迭代的一部分和所述另一循环的整个迭代。因此,调度器提供减少执行周期的总数和功耗的技术。另外,如以下进一步描述的,即使使用作为调度第一循环的结果而可用的剩余HW资源,调度器仍然可能不能调度第二循环。在这种示例中,调度器通过展开(unroll)调度第一循环的结果、另外地获得可用HW资源和尝试调度第二循环来使调度期大体上延长为与II相同。基于调度方法,在编译时确定调度,进而防止额外的硬件资源的使用。
[0087] 图4A至图4F示出调度第一循环和第二循环的示例。
[0088] 参照图4A的示例,使用DFG 410来表示第一循环的数据依赖性。在DFG410中,指令s1在指令s2和s3之前。指令s2在指令p1之前,指令s3在指令p2之前。指令p1在指令m1和m2之前,指令p2在指令m4和m5之前。指令m1、m2、m4和m5分别在指令v2、v3、v4和v5之前。指令v2和v3在指令m3之前,指令v4和v5在指令m6之前。
[0089] 参照图4B的示例,目标架构415包括多个执行单元SC1、SC2、SC3、PU1、PU2、PU3、MM1、MM2、VEC1、VEC2、VEC3和VEC4。图4B的示例中的多个执行单元以网格的形式相互交换数据。
[0090] 参照图4C的示例,调度器通过将图4A的DFG 410映射到图4B的目标架构415来获取调度第一循环的结果420。在示例中,调度第一循环的结果420仅包括核心,但省略了序言和尾声。针对图3A和图3B提供的描述可适用于调度器将图4A的DFG 410映射到图4B的目标架构415的操作,因此为了简便起见,省略重复的描述。
[0091] 参照图4D的示例,使用DFG 430来表示第二循环的数据依赖性。在图4D的示例中,指令s1在指令s2之前,指令s2在指令s3之前,指令s3在指令s4之前。
[0092] 参照图4E的示例,在第一循环和第二循环被分开调度的情况下,获取调度第二循环的结果440。结果440示出调度结果。在第一周期中,调度s1和s3,在第二周期中,调度s2和s4。
[0093] 例如,使用等式II*(SC+(N-1))来计算用于执行循环的周期的总数。在等式中,II指示启动间距,SC指示段数,N指示迭代计数。在此示例中,循环的每个迭代被划分成SC个包括多个II(周期)的段。参照图4C,第一循环的II与4个周期相应,并且单个迭代通过两个段被执行。因此,第一循环的SC与“2”相应。参照图4E,第二循环的II与2个周期相应,并且单个迭代通过2个段被执行。因此,在此示例中,第二循环的SC与“2”相应。
[0094] 在此示例中,当第一循环的迭代计数与“100”相应并且第二循环的迭代计数与“200”相应时,将用于执行第一循环和第二循环的周期的总数可分别如以下等式所示被计算。
[0095] loop1=II*(SC+(N-1))=4*(2+(100-1))=404个周期
[0096] loop2=II*(SC+(N-1))=2*(2+(200-1))=402个周期
[0097] 因此,在此示例中,将用于执行第一循环和第二循环两者的周期的总数为806个周期。
[0098] 参照图4F的示例,调度器使用作为调度第一循环的结果而可用的执行单元来调度第二循环。调度器使用在图4C的调度第一循环的结果420中的第二周期的SC1和SC3以及第四周期的SC2和SC3来调度第二循环。在图4F中,在正执行第一循环的同时,调度器使用在每个周期中未使用的执行单元来调度将被执行的第二循环。例如,调度器基于被分配给执行单元的标志位来验证执行单元是否可用。调度器通过在表中管理HW资源的可用性来验证执行单元是否可用。为了执行调度,调度器将第二循环的DFG映射到目标架构。作为映射的结果,调度器确定将用于调度第二循环的执行单元。在各种示例中,调度器通过确认被确定的执行单元的标志位或通过在表中验证被确定的执行单元是否被用于第一循环,来验证被确定的执行单元是否可用于调度第二循环。在被确定的执行单元可用的情况下,调度器使用被确定的执行单元来调度第二循环。当被确定的执行单元已用于调度第一循环时,调度器检测另一执行单元。在第二循环被成功调度的情况下,调度器获取调度结果450。在此示例中,第一循环和第二循环彼此独立地运行。在其他示例中,第一循环和第二循环彼此仅具有少量的依赖性。在调度结果450中,圆括号中的数字指示各个循环,其中,(1)是指第一循环,(2)是指第二循环。
[0099] 在第一循环的迭代计数与“100”相应并且第二循环的迭代计数与“200”相应的情况下,在第一循环被同时迭代100次的同时,执行第二循环的100次迭代。基于图4E的调度结果440,执行第二循环的剩余的100次迭代。分别使用如通过以下等式表示的此调度方法减少将用于执行第一循环和第二循环的周期的总数。
[0100] (1)loop1(100次迭代)+loop2(100次迭代)=404个周期
[0101] (2)loop2(100次迭代)=2*(2+(100-1))=202个周期
[0102] 在此示例中,通过使用此可选的调度方法把将用于执行第一循环和第二循环两者的周期的总数减少至404+202=606个周期。
[0103] 例如,调度器从在源代码中包括的多个循环中选择两个独立的循环,并确定选择的这两个循环的优先级。调度器可基于各种标准来确定两个循环的优先级。例如,调度器将在调度结果中包括更多可用HW资源的循环确定为第一循环,将剩余循环确定为第二循环。在下文中,第一循环被称为具有较高优先级的循环,第二循环被称为具有较低优先级的循环。例如,为了获取这些优先级,调度器将具有相对较大迭代计数的循环确定为第一循环,并将具有相对较小迭代计数的循环确定为第二循环。表4中示出了调度器如何基于标准确定第一循环和第二循环的以上示例。
[0104] 表4
[0105]
[0106] 在表4中,M指示用户指定的阈值。基于表4的标准,在II的差大于M的情况下的情况(a)和情况(c)中,调度器将具有较大II的循环确定为第一循环。在II的差小于或等于M的情况下的情况(b)和情况(d)中,调度器将具有较大迭代计数的循环确定为第一循环。
[0107] 由于来自调度第一循环的结果的限制条件,调度器使用在每个周期中被映射的HW资源来调度第二循环。在示例中,调度器采用用于CGRA结构的目标架构的模调度方法。例如,调度器采用Bing Mei的算法。Bing Mei的算法通过随机地将DFG上的指令分配给执行单元进行操作,所述算法从最小的II开始直到调度被完成。各种随机化技术被用于产生在Bing Mei的算法中用来分配指令的随机或伪随机值。
[0108] 在示例中,在第二循环未在第一循环的周期中的II中被调度的情况下,调度器可选地展开调度第一循环的结果。在展开调度第一循环的结果的情况下,更多的执行单元可变成对于调度第二循环可用。因此,调度第二循环的成功的概率可增加。例如,在展开图4C的调度结果420的情况下,调度结果类似于通过复制调度结果420并将复制的调度结果420粘贴在调度结果420下方而获得的结果。在此情况下,由于当与原始调度结果420相比时,在被展开的调度结果中存在双倍的可用HW资源,因此调度第二循环的成功的概率可能增加。参照图5和图6进一步详细地描述对第一循环的展开。
[0109] 在情况(b)和情况(d)中,第一循环的迭代计数大于第二循环的迭代计数。在第二循环的所有迭代在第一循环正被执行的同时被执行的情况下,调度器阻止第二循环在后续的周期中被执行。例如,在第二循环被迭代之后,调度器使用声明防护(predication guarding)来阻止第二循环在后续的周期中被执行。所述声明防护可以是动态控制执行单元是否执行指令的方案。在这种示例中,调度器在每个周期中设置用于指示第二循环的周期是否被完成的推断位。用于第二循环的执行单元基于推断位的值确定被分配的指令是否将被执行。
[0110] 在情况(a)和情况(c)中,第一循环的迭代计数小于第二循环的迭代计数。在这种示例中,调度器调度第二循环,以在第一循环的执行时间段中执行第二循环的迭代的一部分,并在第一循环的执行被终止之后重新执行第二循环的剩余迭代。然后,调度器以与调度第一循环类似的方式来调度第二循环的剩余迭代。在示例中,当调度第二循环的剩余迭代时,调度器不考虑第一循环。在此示例中,在第一循环的执行被终止之后,第二循环的剩余迭代基于仅包括第二循环的调度信息被执行。在用于先前迭代的数据将用于第二循环的剩余迭代的情况下,调度器将相应数据存储在缓存器中。例如,在第一循环的执行被终止时,调度器另外地调度用于将第二循环的中间数据存储在缓存器中的指令。在源代码中可能不存在上述指令。然而,调度器可自动添加上述指令。
[0111] 图5和图6是示出通过展开调度第一循环的结果来调度第二循环的示例的流程图。
[0112] 参照图5,在操作510,方法选择第一循环和第二循环。例如,调度器选择第一循环和第二循环。在操作520,所述方法调度第一循环和第二循环。例如,调度器调度第一循环,并使用在第一循环被调度之后剩余的HW资源来调度第二循环。在操作530,所述方法将用于对展开计数进行计数的变量N设置为“0”。例如,调度器将用于对展开计数进行计数的变量N设置为“0”。在操作540,所述方法验证第二循环是否被成功调度。例如,调度器验证第二循环是否被成功调度。在调度第二循环失败的情况下,所述方法在操作550验证当前的展开计数是否大于预定阈值。例如,调度器验证当前的展开计数是否大于预定阈值。在当前的展开计数小于或等于阈值的情况下,所述方法在操作560展开调度第一循环的结果。例如,调度器展开调度第一循环的结果。另外,在操作560,调度器可增加展开计数。在操作570,所述方法使用被展开的调度第一循环的结果来调度第二循环。例如,调度器使用被展开的调度第一循环的结果来调度第二循环。为了执行所述方法,调度器这样反复地执行操作540、550、560和570。在操作550验证了展开计数大于预定阈值的情况下,所述方法在操作580通常调度第二循环。在操作580,所述方法调度第二循环。例如,调度器与第一循环分开地调度第二循环。另外,调度器阻止被用于调度循环的时间量增加到大于或等于预定值。因此,当与应用上述示例循环调度方法之前相比时,调度器阻止了调度结果的ILP性能的恶化。
[0113] 参照图6,在操作610,该方法将第二循环的II(II_loop2)设置为预定的最小值II(MinII_loop2)。例如,调度器将第二循环的II(II_loop2)设置为预定的最小值II(MinII_loop2)。调度器将展开计数(Unroll_count)设置为“0”,并将第一循环的II(II_loop1_new)设置为在未展开状态下的第一循环的II(II_loop1)。在操作620,所述方法基于第二循环的II来调度第二循环。例如,调度器基于第二循环的II来调度第二循环。在这种示例中,当预定的最小值II与“2”相应时,调度器在2个周期内调度第二循环。在操作630,所述方法验证第二循环是否被成功调度。例如,调度器验证第二循环是否被成功调度。当第二循环未被成功调度时,所述方法在操作640增加第二循环的II。例如,调度器增加第二循环的II。在操作650,所述方法验证第二循环的II是否在第一循环的II内。例如,调度器验证第二循环的II是否在第一循环的II内。为了执行所述方法,调度器这样反复地执行操作620、630、640和
650。在操作650验证了增加后的第二循环的II大于或等于第一循环的II的情况下,所述方法在操作660验证第一循环的II是否小于预定阈值。例如,调度器验证第一循环的II是否小于或等于预定阈值。在第一循环的II小于或等于预定阈值的情况下,所述方法在操作670展开调度第一循环的结果。例如,调度器展开调度第一循环的结果。在这种示例中,调度器选择满足“第一循环的相关迭代计数%m=0”的值m(其中,“%”是模运算符),并按照因子m来展开调度第一循环的结果。例如,当第一循环的迭代计数与“300”相应并且选择的m与“3”相应时,调度器可将调度第一循环的结果展开至增加三倍。在此示例中,被展开的第一循环的迭代计数被更新为“100”,其中,“100”与目前的第一循环的迭代计数的1/m相应。因此,调度器通过将m与目前的迭代计数相加来更新展开计数,并用II_loop1*unroll_count来更新第一循环的II。调度器返回到操作620以使用被展开的调度第一循环的结果来调度第二循环。
为了执行所述方法,调度器这样反复地执行操作620、630、640、650、660和670。
[0114] 图7、图8A、图8B和图9至图12示出了优化的目标架构的示例。示例循环调度方法适用于各种目标架构。在示例中,循环调度方法适用于图7的包括CGRA配置710的处理器700。使用循环调度方法,产生使处理器700的ILP性能优化的目标代码。CGRA配置710仅被提供为示例,并且被可选地修改为包括以下项中的一个或更多个:任意数量的FU阵列、任意互连、共享的寄存器文件、本地寄存器文件(LRF)、配置存储器、指令存储器和数据存储器。每个FU可执行任意数量的操作,或可用于数据路由。FU从寄存器文件或另一FU的输出端口接收输入数据,并将输出数据发送到寄存器文件或另一FU的输入端口。另外,在示例中,支持断言操作以控制尾声或序言或者执行条件分支。例如,配置存储器存储CGRA配置信息。在这种示例中,由配置提取/解码单元对在配置存储器中存储的CGRA配置信息进行解码以产生用于控制寄存器文件、FU、复用器(MUX)和互连的信号。
[0115] 示例循环调度方法也适用于图8A的处理器800。在图8A的示例中,循环调度方法将第一循环的DFG或第二循环的DFG映射到处理器800的目标架构。使用循环调度方法所产生的调度结果被存储在配置存储器870中。处理器800在CGA(粗粒度阵列)模式下使用在配置存储器870中存储的结果来并行处理第一循环和第二循环。CGA模式在以上被讨论为CGRA模式。现在进一步描述处理器800的目标架构。
[0116] 参照图8A,处理器800包括控制器810、指令存储器820、标量存储器830、中央寄存器文件840、微型核、矢量存储器和配置存储器870。在图8A中,微型核包括MC0850-1、MC1850-2和MC2850-3。MC0850-1、MC1850-2和MC2850-3中的每一个与单个微型核900相应。矢量存储器包括第一矢量存储器860-1和第二矢量存储器860-2。控制器810也可选地控制处理器800的其他构成元件。在示例中,控制器810控制微型核。作为控制微型核的部件,控制器810暂停部分或全部微型核的操作。因此,控制器810执行与微型核的操作、线程执行和矢量FU的连接相关地描述的处理器800的功能。指令存储器820和配置存储器870存储将由处理器800或微型核执行的指令。标量存储器830存储标量数据。中央寄存器文件840存储寄存器。
[0117] 图8B示出控制器810的示例架构。控制器810包括选择器811、确定器812、调度器813和产生器814,其中,选择器811从在源代码中包括的循环中选择独立的循环,确定器812在选择的循环中确定具有较高优先级的第一循环和具有较低优先级的第二循环,调度器
813被配置为使用执行单元调度第一循环并使用作为调度第一循环的结果而可用的执行单元来调度第二循环,产生器814被配置为产生包括调度第一循环的结果和调度第二循环的结果的目标代码。例如,选择器811、确定器812、调度器813和产生器814被实现为这样的硬件装置:所述硬件装置是控制器810的组件,并具有与选择器811、确定器812、调度器813和产生器814执行的操作相应的结构。在示例中,控制器810从指令存储器820和/或矢量存储器830接收作为对选择器811的输入的数据。此外,在示例中,控制器将作为来自产生器的输出的数据输出到中央寄存器文件840和微型核850。
[0118] 在示例中,处理器800在VLIW模式和CGRA模式下进行操作。在VLIW模式下,处理器800处理标量数据或执行控制操作。在CGRA模式下,处理器800处理在要求加速和/或并行处理的代码中包括的循环的操作。在此示例中,循环与递归循环相应。在所述循环内的操作会要求大量矢量处理。然而,在示例中,与控制相关的指令仅在VLIW模式下可用,并且矢量指令仅在CGRA模式下可用。指令在两个模式之间的严格分离简化了处理器800的设计,并增加了处理器800的功率效率。
[0119] 在图8A的示例中,在VLIW模式下,指令被从指令存储器820提取。提取的指令由多个微型核的标量FU执行。在CGRA模式下,指令被从配置存储器870提取。提取的指令可由多个微型核的所有FU执行。在多个微型核的FU之中,标量FU被用于VLIW模式和CGRA模式两者中。因此,标量FU在VLIW模式和CGRA模式中共享。例如,在图8A中,当在VLIW模式下操作时,处理器800同时操作微型核的FU中的三个标量FU 850-1、850-2和850-3。在这种示例中,当处理器800的操作模式从VLIW模式切换到CGRA模式时,处理器操作多个微型核的所有FU。当处理器800在CGRA模式下操作时,处理器800操作多个微型核的所有FU以支持加速处理。因此,当处理器800在VLIW模式下操作时,除了多个微型核的FU中的标量FU之外,处理器800暂停非必要的剩余FU的操作,从而在功率节省模式下操作。其他的剩余FU被设计为用于与加速或并行处理更加相关的目的。在图8A中示出的剩余FU的示例包括打包/解包FU、矢量加载/存储(LD/ST)FU和矢量FU。然而,在其他示例中使用其他类型的FU。通过经由共同FU传输将在两个模式下使用的参数,处理器800快速地切换操作模式,并且在VLIW模式和CGRA模式之间的数据复制被阻止。
[0120] 在多个微型核的FU中,只有标量FU能够访问中央寄存器文件840。通过限制标量FU对中央寄存器文件840的访问,进而不包括宽寄存器文件。例如,多个微型核中的每个微型核具有针对中央寄存器文件840的读访问权限,并且只有微型核的标量FU中的每个标量FU具有针对中央寄存器文件840的写访问权限。多个微型核中的每个微型核使用多个矢量存储器之一。例如,多个微型核中的每个微型核包括多个矢量存储器之一。在图8A中,MC0850-1使用第一矢量存储器860-1,MC2850-3使用第二矢量存储器860-2。通过向多个微型核中的每个微型核提供单独的矢量存储器,不需要用于共享矢量存储器的类似于队列的复杂结构。被单独提供给每个微型核的存储器也简化了存储器访问逻辑。所讨论的对复杂结构的排除可简化处理器800的设计,并在功能和面积方面对处理器带来益处。
[0121] 图9至图12示出在图8A和图8B的处理器800中包括的微型核的示例。
[0122] 参照图9,循环调度方法使用在微型核900中包括的多个FU来调度第一循环和第二循环。当微型核900的结构(例如,FU的配置)和微型核900中的FU之间的连接改变时,循环调度方法的目标架构也改变。在下文中,进一步描述微型核900的目标架构。
[0123] 微型核900是指被配置为组合多个FU的单元核。微型核900包括标量域单元910和矢量域单元960。在图9的示例中,标量域单元910对标量数据执行操作。矢量域单元960对矢量数据执行操作。例如,标量域单元910包括用于对标量数据进行操作的FU。在图9的示例中,标量域单元910包括标量FU 920和打包/解包FU 950。矢量域单元960包括用于对矢量数据进行操作的FU。矢量域单元960包括打包/解包FU 950、矢量LD/ST FU 970和矢量FU 980。因此,微型核900包括标量FU 910、打包/解包FU 950、矢量LD/STFU 970和矢量FU 980。上述FU的类型和数量仅是示例,在其他示例中使用其他类型和数量的FU。在各种示例中提供标量FU 920、打包/解包FU 950、矢量LD/ST FU 970和矢量FU 980。标量FU 920处理对标量数据和与控制相关的代码或指令的操作。在此示例中,与控制相关的代码或指令是指与比较操作或分支操作相关的代码或指令。标量FU 920处理对标量数据的加载和存储。在示例中,标量FU 920还处理通常被使用的单周期指令。标量数据相应于最小操作单位的数据,而不是数据项的组合。通常,以下基本的原始数据类型被认为是标量数据的类型。第一,布尔数据类型。第二,数值类型(例如,“int”、“short int”、“float”和“double”)。第三,字符类型(例如,“char”和“string”)。
[0124] 标量FU 920被用于单个数据类型,因此,标量FU 920通常使用相对低的比特宽度的数据路径。矢量LD/ST FU 970处理对矢量数据的加载和存储。矢量LD/ST FU 970从矢量存储器加载数据,将数据存储在矢量存储器中。仅由矢量LD/ST FU 970来执行对矢量数据的加载和存储。矢量FU 980可处理对矢量数据的操作。在示例中,矢量FU 980使用单指令多数据(SIMD)技术处理对矢量数据的操作。对矢量数据的操作可包括例如矢量算术操作、移位操作、乘法操作、比较操作和数据重排操作。此外,在稍后将进一步描述的VFU(矢量FU)模式下,可支持用于软解映射(soft-demapping)的若干特定指令。
[0125] SIMD方法是指使用单个指令同时处理多个数据项的并行方法。在SIMD方法中,多个操作装置通过同时将相同操作应用于多个数据项来同时处理所述多个数据项。SIMD方法被用于例如矢量处理器。在此示例中,矢量数据是指包括多个同一类型的标量数据项的数据。在一个示例中,矢量数据是多个标量数据项被组合成的操作单位的数据。例如,在开放计算语言(OpenCL)中,定义了矢量数据的类型,例如,“charn”、“ucharn”、“shortn”、“ushortn”、“intn”、“longn”、“ulongn”和“floatn”。对于这些类型,n指示标量数据项的数量。例如,n的值大于或等于“2”。通常,2、4、8或16被用作n的值。由于矢量数据与被组合的数据项相应,因此矢量FU 980需要相对高的比特宽度的数据路径。矢量FU 980是被配置为并行处理多个数据项的单元。因此,在此示例中,矢量FU 980的尺寸大于其他FU的尺寸,并占据微型核900内的大部分面积。
[0126] 打包/解包FU 950针对标量域单元910和矢量域单元960之间的数据传输来处理数据变换。在图9的示例中,打包/解包FU 950是标量域单元910和矢量域单元960的共同FU。例如,在标量域单元910和矢量域单元960之间共享打包/解包FU 950。在此示例中,打包/解包FU 950将多个标量数据项转换成矢量数据。打包/解包FU 950通过组合多个标量数据项产生矢量数据。此外,在另一示例中,打包/解包FU 950通过将标量数据插入到矢量数据的预定位置产生或更新矢量数据。打包/解包FU 950将矢量数据转换成单个标量数据项或多个标量数据项。打包/解包FU 950也可通过划分矢量数据来产生多个标量数据项。打包/解包FU 950也可通过从矢量数据的位置或预定位置提取元素来产生标量数据。矢量数据的元素可与标量数据相应。打包/解包FU 950可位于标量域和矢量域之间,并充当标量域和矢量域之间的桥梁。在标量域和矢量域之间的数据交换可在由充当标量域和矢量域之间的桥梁的打包/解包FU 950执行数据类型转换之后被执行。
[0127] 通过如上所述的对FU的组合,微型核900处理将由处理器处理的所有指令。因此,虽然只有单个微型核900独立地存在于处理器中或在处理器中进行操作,但是处理器可进行操作以执行单个微型核900的操作。如上所述,FU被分类成多个类型的核FU(例如,标量FU 920、打包/解包FU 950、矢量LD/ST FU 970和矢量FU 980),并且核FU可构成微型核900。通过对微型核900的扩展来代替各种FU的任意组合,简化了处理器中的逻辑。另外,通过对微型核900的扩展,可显著减少在设计空间探索(DSE)中设计的若干情况。
[0128] 图10示出在图9的微型核900中的数据路径的示例。
[0129] 参照图10,数据路径存在于标量域单元910的FU之间。例如,微型核900包括在标量FU 920和打包/解包FU 950之间的数据路径。数据路径存在于矢量域单元960的多个FU之间。例如,微型核900包括在打包/解包FU 950、矢量LD/ST FU 970和矢量FU 980中的每一对FU之间的数据路径。
[0130] 如图10中所示,除了打包/解包FU 950之外,可不存在直接将标量域单元910的FU和矢量域单元960的FU相互连接的数据路径。因此,在标量域单元910和矢量域单元960之间的交互经过打包/解包FU 950。在标量域单元910和矢量域单元960之间的数据传输在由打包/解包FU 950执行了类型转换之后被执行。在示例中,类型转换包括从标量数据到矢量数据的转换以及从矢量数据到标量数据的转换。然而,在同一域中的FU具有完全的数据连接。另外,数据路径的宽度针对每个域可能不同。
[0131] 作为刚讨论的结构的例外,在示例中,由标量FU 920计算的用于加载或存储的消息地址的值被传输到矢量LD/ST FU 970。因此,在此示例中,微型核900包括被用来将用于加载或存储的存储器地址从标量FU 920传输到矢量LD/ST FU 970的数据路径。在此示例中,用于传输存储器地址的数据路径是相对窄的数据路径。类似地,在此示例中,将用于传输数据的数据路径是相对宽的数据路径。
[0132] 在示例中,在微型核之间存在两种类型的将用于数据传输的通道。这两种类型的通道包括标量数据通道和矢量数据通道。微型核900通过标量数据通道将标量数据传输到另一微型核和从另一微型核接收标量数据。例如,标量数据通道连接到标量域单元910的FU。微型核900通过矢量数据通道将矢量数据发送到另一微型核和从另一微型核接收矢量数据。矢量数据通道连接到矢量域单元960的FU。微型核900可具有用于将标量数据分别发送到其他微型核的与若干其他微型核相应的标量数据通道。在这种情况下,标量数据通道可分别连接到其他微型核。针对多路径操作,微型核900具有大于其他微型核的数量的标量数据通道。因此,微型核900通过标量数据通道与另一微型核交换标量数据。
[0133] 在另一示例中,微型核900还具有用于将矢量数据分别发送到其他微型核的与若干其他微型核相应的矢量数据通道。在此示例中,矢量数据通道分别连接到其他微型核。针对多路径操作,微型核900具有大于其他微型核的数量的矢量数据通道。因此,微型核900通过多个矢量数据通道与另一微型核交换矢量数据。通过如上所述的数据通道的配置,从微型核和处理器中排除对于成功操作非必需的连接的在FU之间的数据路径。通过从FU之间的数据路径消除这种非必需的数据路径,微型核900或处理器内的连接被最少化。例如,这种非必需的数据路径可以是标量FU 920和矢量FU 980之间的数据路径。通过向微型核900提供标量数据通道和矢量数据通道,微型核之间的数据传输被简化并且性能得到提高。
[0134] 微型核900还包括矢量存储器1010。在此示例中,矢量存储器1010是专用于矢量LD/ST FU 970的存储器。图10的微型核900还进一步包括将用于矢量LD/ST FU 970对矢量存储器1010的访问的访问端口。通过经由访问端口对矢量存储器1010的访问,矢量存储器1010不被除了矢量LD/ST FU 970之外的FU共享。由于矢量存储器1010不被共享,因此端口的数量减少,这是因为如果矢量存储器被共享,则将需要另外的端口。此外,可简化与对矢量存储器1010的访问相关的访问逻辑。端口数量的减少和访问逻辑的简化在处理器的功耗和微型核900的面积方面会是有益的。
[0135] 图11示出微型核的容易的扩展性的示例。
[0136] 参照图11的示例,处理器1100包括一个或更多个微型核。一个或更多个微型核中的每个微型核与参照图9描述的微型核900类似。在图11中,一个或更多个微型核包括MC01110-1、MC11110-2、MC21110-3…和MCm 1110-4。MC01110-1、MC11110-2、MC21110-3…和MCm 1110-4中的每一个与微型核900类似。处理器1100包括m+1个微型核。在每个微型核中包括的FU被示出。在图11中,每个微型核的FU被表示为FU0、FU1、…和FUn。每个微型核包括n+1个FU。在示例中,每个FU与标量FU 920、打包/解包FU 950、矢量LD/ST FU 970和矢量FU 980之一相应。在一个或更多个微型核中,在示例中,第一微型核MC01110-1与图9的微型核
900相应。如参照图9的描述,单个微型核900可处理将由处理器处理的所有指令。当应用由处理器1100执行时,应用所需的若干操作针对每个应用可不同。因此,处理器1100针对简单的应用使用单个微型核900来处理由应用所需的若干操作。处理器1100调整将用于处理由需要大量操作的应用所需的若干操作的微型核900的数量。通过有效地扩展被配置的微型核,处理器1100被容易设计和简化。
[0137] 参照图12的示例,图8A和图8B的处理器800可提供两种类型的寄存器文件。通常,图8A和图8B的中央寄存器文件840用于在VLIW模式和CGRA模式之间的数据传输。CGRA模式的live-in变量和live-out变量保持在中央寄存器文件840中。图9的微型核900还包括用于标量FU 920的第一LRF1210和用于矢量FU 980的第二LRF 1220。当在若干周期完成之后标量FU 920请求标量数据时,第一LRF 1210暂时存储标量数据。当在若干周期完成之后矢量FU 980请求矢量数据时,第二LRF 1220暂时存储矢量数据。基于以上描述的示例,与多个FU的组合相应的微型核900被配置为处理数据。数据路径的结构(例如,FU之间的连接和FU)通过根据示例的微型核900被简化。通过调整微型核的数量,处理器具有容易处理若干所需操作的可扩展性。根据示例的微型核900和处理器具有使它们将适合在使用DLP(数据级并行性)的多媒体领域和通信领域中的广泛使用的特征。
[0138] 可使用硬件组件来实现在此描述的设备和单元。硬件组件可包括例如控制器、传感器、处理器、产生器、驱动器和其他等同的电子组件。可使用一个或更多个通用计算机或专用计算机来实现硬件组件,诸如处理器、控制器和算术逻辑单元、数字信号处理器、微型计算机、现场可编程阵列、可编程逻辑单元、微处理器或能够以定义的方式对指令进行响应和执行指令的任何其他装置。硬件组件可运行操作系统(OS)和在OS上运行的一个或更多个软件应用。硬件组件也可响应于软件的执行来访问、存储、操纵、处理和创建数据。为了简单起见,处理装置的描述被用作单数;然而,本领域的技术人员将理解,处理装置可包括多个处理元件和多种类型的处理元件。例如,硬件组件可包括多个处理器或处理器和控制器。另外,不同处理配置是可能,诸如并行处理器。
[0139] 以上描述的方法可编写为计算机程序、一段代码、指令或它们的一些组合,以独立地或共同指示或配置处理装置如期望的那样进行操作。软件和数据可永久性地或暂时地实现在任何类型的机器、组件、物理或虚拟装备、计算机存储介质或以下装置中:该装置能够向处理装置提供指令或数据或者能够提供由处理装置解释的指令或数据。软件也可分布在联网的计算机系统上,使得软件以分布式方式被存储和执行。更具体地讲,可由一个或更多个非暂时性计算机可读记录介质来存储软件和数据。介质也可单独地或与软件程序指令结合地包括数据文件、数据结构等。非暂时性计算机可读记录介质可包括可存储随后可由计算机系统或处理装置读取的数据的任何数据存储装置。非暂时性计算机可读记录介质的示例包括只读存储器(ROM)、随机存取存储器(RAM)、致密盘只读存储器(CD-ROM)、磁带、USB、软盘、硬盘、光记录介质(例如,CD-ROM或DVD)和PC接口(例如,PCI、PCI-express、WiFi等)。另外,用于实现在此公开的示例的功能程序、代码和代码段可由本领域的程序员基于在此提供的附图的流程图和框图及其相应描述来解释。
[0140] 仅作为非穷尽的说明,在此描述的终端/装置/单元可以是指移动装置(诸如,蜂窝电话、智能电话、可穿戴智能装置(诸如,指环、手表、一副眼镜、手镯、脚踝支架、皮带、项链、耳环、发带、头盔、嵌入在衣服中的装置等))、个人计算机(PC)、平板个人计算机(平板电脑)、平板手机、个人数据助理(PDA)、数字相机、便携式游戏控制台、MP3播放器、便携式/个人多媒体播放器(PMP)、掌上电子书、超级移动个人计算机(UMPC)、便携式桌上型PC、全球定位系统(GPS)导航和诸如高清晰度电视(HDTV)、光盘播放器、DVD播放器、蓝光播放器、机顶盒或能够进行与在此公开的内容一致的无线通信或网络通信的任何其它装置的装置。在非穷尽的示例中,可穿戴装置可自身安装在用户的身体上,诸如,眼镜或手镯。在另一非穷尽的示例中,可穿戴装置可通过帖附装置安装在用户的身体上,诸如,使用臂带将智能电话或平板电脑帖附在用户的手臂上,或使用挂带将可穿戴装置悬挂在用户的颈部周围。
[0141] 计算系统或计算机可包括电连接到总线的微处理器、用户接口和存储器控制器,还可包括闪存装置。闪存装置可经由存储器控制器来存储N比特数据。N比特数据可以是已被微处理器处理的和/或将被微处理器处理的数据,并且N可以是等于或大于1的整数。如果计算系统或计算机是移动装置,则可提供电池来供电以操作计算系统或计算机。对于本领域的普通技术人员将明显的是,计算系统或计算机还可包括应用芯片集、相机图像处理器、移动动态随机存取存储器(DRAM)以及对于本领域的普通技术人员来说已知的将包括在计算系统或计算机中的任何其他装置。存储器控制器和闪存装置可构成使用非易失性存储器存储数据的固态驱动器或盘(SSD)。
[0142] 虽然本公开包括特定示例,但是对于本领域的普通技术人员将明显的是,在不脱离权利要求及其等同物的精神和范围的情况下,可在这些示例中做出形式和细节上的各种改变。在此公开的示例将仅被解释为描述性意义,而不用于限制的目的。对每个示例中的特征或方面的描述将被认为适用于其它示例中的类似特征或方面。如果描述的技术以不同顺序执行,并且/或如果描述的系统、架构、装置或电路中的组件以不同方式组合和/或由其它组件及其等同物替代或补充,则可实现适当的结果。因此,本公开的范围不由具体实施方式来限定,而由权利要求及其等同物来限定,并且权利要求及其等同物的范围内的所有变化将被解释为包括在本公开中。