[0038] 在图6(c)中,推测防护a[b[i]]=data_guard_maybe_false(a[i])假定:阵列引用a[i]和a[b[i]]是不可能依赖的。针对迭代i的误推测指代下面情形:a[i]和a[b[j]]存取相同的内存地址,其中在该情况下,表达式条件0<=i,j
[0039] 此外,图6(d)中的推测防护e[i]=data_guard_false(a[b[i]])假定:表达式a[b[i]]不可能与表达式e[i]混淆。由于表达式a[b[i]]是存储操作,因此编译器可以检查形式为a[b[i]]=…的所有存储语句是否被标记为稀疏阵列简化。如果不是,则根据一些实施例,编译器对针对多版本循环的条件表达式进行重置,循环并行化将放弃该循环。否则,编译器生成一个循环,以便收集针对引用a[b[i]]的所有限制信息。可以根据循环下限和上限,导出用于引用c[i]的阵列限制信息。如果阵列段a和c彼此之间重叠,则将误推测标志设置为true。
[0040] 图6(e)示出了根据一个实施例的另一种情形,其中在该情形下,将表达式a[b[i]]假定为与c[d[i]]混淆。如果稀疏阵列简化分析检测到表达式a[b[i]]和c[d[i]]都是阵列简化候选,则编译器可以简单地在检查代码生成中检查它们的结构(alignment)是否是相同,以替代生成一个循环来检测这些阵列段是否彼此之间重叠。随后,其对误推测标志进行更新,使得当该推测是成功时,可以执行推测并行化代码。
[0041] 参照误推测驱动的循环分割,根据一个实施例,当确定要对推测的版本进行并行化,并允许少量的误推测时,编译器生成用于进行进一步循环分割的第三版本,如图7中所示。如果误推测的数量低于某个门限T,则编译器假定推测的循环并行化是有益的。由于误推测表中的每一个元素的值指示该推测在相应的迭代是否成功,因此可以基于误推测表,对循环进行简单地分割。在一个实施例中,将循环分割成多个不相交循环,这些不相交的循环具有更小的索引集。因此,在运行时不具有误推测的这些更小循环被安全地并行化。根据一个实施例,图8示出了编译器如何生成用于对图7中的循环(版本3)进行分割的代码。在图8中,编译器构造穿越误推测表中的每一个元素的循环,计算不具有误推测的间隔。如果存在不具有误推测的间隔,并且该间隔长度大于某个门限T1,则可以对用于该相应的索引集的循环进行推测性的并行化。因此,编译器构造了具有该索引集的如图8中所示的更小循环函数1,并从版本1(推测版本)中复制循环主体。否则,编译器从版本2(原始版本)中复制循环主体,用于该更小循环函数2,如图8中所示。
[0042] 参照基于索引阵列的循环优化,实施例使用一种新方法来打破循环中的控制和数据流依赖,例如为循环优化或自动并行化产生更多机会。如本申请所讨论的,索引阵列是通过选择迭代集所构造的循环的迭代空间的一个子集,其中所选定的迭代集拥有下面两种属性中的一种:(1)对于该给定的迭代集,循环中的if条件始终是TRUE,而其它迭代集不是;或者(2)对于该给定的迭代集,在循环中存在流或者逆向流依赖边缘,而其它迭代集不是。
此外,针对拥有属性1的迭代所构造的索引阵列,帮助打破循环中的控制流依赖,而针对拥有属性2的迭代所构造的索引阵列,帮助打破循环中的数据流依赖。在这两种情况下,可以通过基于索引阵列对迭代空间进行划分(以及可能的重新排序),将原始循环转换成两个或更多循环(下文的子循环),使得可以对一个或多个子循环进行并行化。这进而可以允许:(i)通过打破控制流和数据流依赖来实现更多的并行化,和/或帮助其它循环优化(例如,软件管道化和冗余消除),而无需简档信息;(ii)最小运行时开销;(iii)无需特殊的硬件支持。
[0043] 由于控制或数据流依赖通常禁止并行化,因此一些实施例提供了在真实应用和基准中频繁遇到的循环结构。例如,在循环中存在IF条件,则产生控制流依赖,其禁止循环优化。下面是spec2006/462.libquantum中的热点循环的简化版本:
[0044]
[0045] 由于(j=j+1;B[j]=C[i]..)是依赖于条件(A[i]!=0)的控制,因此该循环不能并行化。一种克服该问题的方法是使用控制/数据流推测。但是,在一些实现中,控制/数据流推测通常是不适用/无益的:若要转换是适用的/有益的,if条件应当大部分情况下为TRUE或者大部分情况下为FALSE(在大多情况下,始终为TRUE或者始终为FALSE)。此外,其依赖于简档信息,而后者是非常受限的。但是,针对(A[i]!=0)为TRUE的迭代空间的子集,是可并行化的。为此,实施例尝试识别和划分出该迭代子集。
[0046] 参照禁止并行化的数据流依赖,下面是spec2006/482.sphinx3中的热点循环的简化版本:
[0047]
[0048] 由于在A[i]和A[B[i]]之间存在数据依赖边缘,因此该循环不能并行化。应当注意,range(B[i])<=range(i),其中range(k)是k可以采用的值的集合,迭代空间的子集(range(i)-range(B[i]))是可并行化的。在一个实施例中,使用索引阵列来识别和并行化该迭代子集。致
力于打破循环中的一个或多个控制流和数据流依赖的索引阵列,用于实现更多的并行化。在一个或多个实施例中,可以使用下面的项目:
[0049] I.当可以时,对用于打破控制流依赖的索引阵列进行构造的机制;
[0050] II.(使用索引阵列)对循环迭代空间进行划分(以及可能的重新排序),以便打破控制流依赖的机制,其导致子循环的生成;
[0051] III.当可以时,对用于打破数据流依赖的索引阵列进行构造的机制;和/或[0052] IV.(使用索引阵列)对循环迭代空间进行划分(以及可能的重新排序),以便打破数据流依赖的机制,其导致子循环的生成。
[0053] 参照使用机制I、II、III、IV所获得的循环转换,根据一个实施例,下面的伪代码旨在呈现该方法的高层级梗概,故省略了实际实现中所需要的众多细节和合法性检验:
[0054]
[0055]
[0056] 当发现具有单一分支的if条件(其使得if条件的预测依赖于循环索引变量)负责控制依赖时,可以触发用于控制流优化的索引阵列方法。
[0057] 在 一 个 实 施 例 中,机 制 1(generate_controlflow_indexarray_loop(if_cond,tripcount(loop),&index_array))针对索引阵列的构造,生成下面的预计算循环:
[0058]
[0059]
[0060] 因此,索引阵列可以存储if条件为TRUE的索引的集合。由于if条件评估为FALSE的迭代的集合,不影响该循环之内的计算,因此可以对它们进行丢弃。在一个实施例中,迭代空间的仅仅一个子集(如索引阵列中所存储的)需要进行迭代。该子集是没有控制依赖的,并且可以并行化。
[0061] 在 一 个 实 施 例 中, 机 制 2(generate_controlflow_loop_transformation(loop,index_array))通过使用相应的索引阵列元素替换索引变量的一个或多个出现,去除if条件,使用索引阵列的大小来替换次数计数,来生成原始循环的一个子循环。所获得的子循环在索引阵列(其是原始迭代空间的一个子集)的元素之上进行迭代,该子循环是没有控制依赖的。
[0062] 在一个实施例中,使用所述伪代码(机制1和2),将循环1转换成下面代码:
[0063]
[0064] 当发现形式A[i]和A[B[i]]的阵列
访问之间的数据依赖禁止并行化时,可以触发用于数据流优化的索引阵列方法。B可以是调用的内部阵列。B[i]是i的迭代空间的一个子集。该子集是存在数据依赖的迭代空间的子集。剩余的迭代是可以变成没有数据依赖的,并可以并行化。随后,索引阵列可以对B[i]获得的值进行存储。
[0065] 在 一 个 实 施 例 中,机 制 3(generate_dataflow_indexarray_loop(inner_array,tripcount,&index_array))针对索引阵列的构造,生成下面的两个预计算循环:
[0066]
[0067] 在 一 个 实 施 例 中, 机 制 4(generate_dataflow_loop_transformation(loop,index_array))将原始的循环转换成两级的循环嵌套,其可以被认识为是可并行化子循环的集合。外部循环在索引阵列的元素上进行迭代,而内部循环在两个连续的索引阵列元素之间的间隔上进行迭代,其后跟着与索引阵列的元素相对应的单一迭代。两个连续的索引阵列元素之间的每一个间隔是没有数据依赖的,并可以并行化。此外,使用所述伪代码(机制3和4),将循环2转换成下面代码:
[0068]
[0069]
[0070] 因此,一些实施例具有最小的运行时开销。在一个实施例中,可以通过对循环次数计数值进行运行时检查,来保护基于索引阵列的转换。仅当循环次数计数值与某个门限相比更高时,才执行转换的代码。如果在编译时已知循环次数计数值,则编译时检查是足够的。关于索引阵列的大小的运行时检查,可以用于进一步提高该方法的利益率。此外,如果简档信息是可用的,则该方法可以仅应用于热点循环。
[0071] 另外,可以将该伪代码推广到也处理具有两个分支的条件语句。例如,如果两个分支在它们之间不具有数据依赖边缘,则可以将原始循环分布到两个循环中,一个循环包含if条件和then分支的主体,另一个循环包含该if条件的余集和else分支的主体。随后,如本申请所描述的伪代码可以单独地应用于这两个循环,以便产生可并行化的子循环。此外,还可以将该伪代码推广到处理多个if条件语句以及同一循环之中的多个数据依赖。这涉及构造多个索引阵列,以及具有可能的一些显著运行时开销的复杂转换。
[0072] 图9示出了计算系统900的实施例的框图。在各个实施例中,可以在各种
电子设备中提供系统900的组件中的一个或多个,其能够执行本申请参照本发明的一些实施例所讨论的操作中的一个或多个。例如,系统900的组件中的一个或多个可以用于执行参照图1-8所讨论的操作,例如,通过根据本申请所讨论的操作来处理指令、执行子例程等等。此外,本申请(例如,参照图9和/或10)所讨论的各种存储设备可以用于存储数据、运算结果等等。
[0073] 具体而言、计算系统900可以包括:通过互连网络(或总线)904进行通信的一个或多个中央处理单元(CPU)902或者处理器。因此,在一些实施例中,本申请所讨论的各种操作可以由CPU来执行。此外,处理器902可以包括通用处理器、网络处理器(其对通过
计算机网络903传输的数据进行处理)或者其它类型的处理器(其包括精简指令集计算机(RISC)处理器或复杂指令集计算机(CISC))。此外,处理器902可以具有单核或多核设计。具有多核设计的处理器902可以将不同类型的处理器核集成到同一集成电路(IC)芯片上。
此外,可以将具有多核设计的处理器902实现成对称或非对称多处理器。此外,参照图1-8所讨论的操作可以由系统900的一个或多个组件执行。
[0074] 芯片集906还与互连网络904进行通信。芯片集906可以包括图形和内存控制中枢(GMCH)908。GMCH 908可以包括与
存储器912进行通信的存储器
控制器910。存储器912可以对数据进行存储,其中数据包括由CPU 902或者计算系统900中所包括的任何其它设备执行的指令序列。在一个实施例中,存储器912可以存储
编码器913,后者与参照图1-8所讨论的编译器相同或者类似。可以将相同的数据(其包括指令)或者该数据的至少一部分存储在磁盘
驱动器928和/或处理器902之内的一个或多个高速缓存中。在本发明的一个实施例中,存储器912可以包括一个或多个易失性存贮(或存储器)设备,例如,
随机存取存储器(RAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、静态RAM(SRAM)或者其它类型的存贮设备。此外,还可以使用诸如
硬盘之类的
非易失性存储器。另外的设备(例如,多个CPU和/或多个系统存储器)可以通过互连网络904进行通信。
[0075] GMCH 908还可以包括与显示器916进行通信的图形
接口914。在本发明的一个实施例中,图形接口914可以通过
加速图形端口(AGP)与显示器916进行通信。在本发明的一个实施例中,显示器916可以是通过例如
信号转换器与图形接口914进行通信的平板显示器,其中信号转换器将诸如视频存储器或系统存储器之类的存贮设备中保存的图像的数字表示,转换成由显示器916进行解释和显示的显示信号。接口914所产生的显示信号可以在由显示器916进行解释并随后显示之前,穿过各种控制设备。在一些实施例中,处理器902和一个或多个其它组件(例如,存储器控制器910、图形接口914、GMCH 908、ICH 920、外围桥接924、芯片集906等等)可以提供在同一IC芯片上。
[0076] 中
枢接口918使GMCH 908和输入/输出控制中枢(ICH)920能够进行通信。ICH920可以向与计算系统900进行通信的I/O设备提供接口。ICH920可以通过诸如外围组件互连(PCI)桥、通用
串行总线(USB)控制器、或者其它类型外围桥或控制器之类的外围桥(或者控制器)924与总线922进行通信。桥924可以在CPU 902和
外围设备之间提供数据路径。也可以使用其它类型的拓扑。此外,多个总线可以例如通过多个桥或控制器与ICH920进行通信。此外,在本发明的各个实施例中,与ICH 920通信的其它外围设备可以包括集成驱动电子器件(IDE)或者小型
计算机系统接口(SCSI)硬盘驱动器、USB端口、
键盘、
鼠标、并口、串口、
软盘驱动器、数字输出支持(例如,数字视频接口(DVI))或其它设备。
[0077] 总线922可以与音频设备926、一个或多个磁盘驱动器928以及网络接口设备930进行通信,其中网络接口设备930可以与计算机网络903进行通信。在一个实施例中,设备930可以是能无线通信的NIC。其它设备可以通过总线922进行通信。此外,在本发明的一些实施例中,各个组件(例如,网络接口设备930)可以与GMCH 908进行通信。此外,可以对处理器902、GMCH 908和/或图形接口914进行组合,以形成单一芯片。
[0078] 此外,计算系统900可以包括易失性和/或非易失性存储器(或者存贮设备)。例如,非易失性存储器可以包括下面中的一个或多个:
只读存储器(ROM)、可编程ROM(PROM)、可擦除PROM(EPROM)、电EPROM(EEPROM)、磁盘驱动器(例如,928)、软盘、紧致碟ROM(CD-ROM)、数字多用途光碟(DVD)、闪存、磁光碟、或者能够存储电子数据(例如,其包括指令)的其它类型的非易失性机器可读介质。在一个实施例中,系统900的组件可以用点对点(PtP)配置进行布置,例如,参照图10所讨论的。例如,可以通过多个点对点接口,对处理器、存储器和/或输入/输出设备进行互连。
[0079] 具体而言,图10示出了根据本发明的一个实施例用点对点(PtP)配置进行布置的计算系统1000。具体而言,图10示出了通过多个点对点接口,对处理器、存储器和/或输入/输出设备进行互连的系统。参照图1-9所讨论的操作可以由系统1000的一个或多个组件执行。
[0080] 如图10中所示,系统1000包括一些处理器,为了清楚说明起见,仅示出了其中的两个处理器1002和1004。处理器1002和1004均可以包括本地内存控制器中枢(MCH)1006和1008(在一些实施例中,它们可以与图9的GMCH 908相同或者类似),以便与存储器1010和1012相耦合。存储器1010和/或1012可以存储各种数据,例如参照图9的存储器912所讨论的那些。
[0081] 处理器1002和1004可以是任何适当的处理器,例如参照图10的处理器1002所讨论的那些。处理器1002和1004可以分别使用点对点(PtP)接口电路1016和1018,通过PtP接口1014来交换数据。处理器1002和1004均可以使用点对点接口电路1026、1028、1030和1032,通过各自PtP接口1022和1024与芯片集1020交换数据。此外,芯片集1020还可以使用PtP接口电路1037,通过高性能图形接口1036与高性能图形电路1034交换数据。
[0082] 可以通过使用处理器1002和1004来提供本发明的至少一个实施例。例如,处理器1002和/或1004可以执行图1-9的操作中的一个或多个。但是,本发明的其它实施例可以存在于图10的系统1000之内的其它电路、逻辑单元或设备中。此外,本发明的其它实施例可以分布在图10中所示的一些电路、逻辑单元或设备之中。
[0083] 芯片集1020可以使用PtP接口电路1041耦接到总线1040。总线1040可以具有耦接到其的一个或多个设备,例如,总线桥1042和I/O设备1043。通过总线1044,总线桥1043可以耦接到其它设备,例如,键盘/鼠标1045、参照图10所讨论的网络接口设备1030(例如,可以耦接到计算机网络903的
调制解调器、网络接口卡(NIC)等等)、音频I/O设备和/或数据存贮设备1048。数据存贮设备1048可以存储由处理器1002和/或1004执行的代码1049。
[0084] 在本发明的各个实施例中,本申请所讨论的操作(例如,参照图1-10所讨论的操作)可以实现成硬件(例如,
逻辑电路)、软件(例如,其包括对处理器(例如,本申请所讨论的处理器)的操作进行控制的微代码)、
固件或者其组合,其中它们可以被提供成
计算机程序产品,例如其包括有形(例如,非临时性)机器可读介质或计算机可读介质,而这些介质存储有用于对计算机(例如,计算设备的处理器或其它逻辑)进行编程以执行本申请所讨论的操作的指令(或者软件过程)。所述机器可读介质可以包括存贮设备,例如本申请所讨论的那些。
[0085] 贯穿本
说明书对于“一个实施例”或者“某个实施例”的引用意味着,结合该实施例描述的具体特征、结构或特性包括在至少一个实现中。在贯穿本说明书的各个地方中出现的短语“在一个实施例中”,可以全部指代同一实施例,也可以并不都指代同一实施例。
[0086] 此外,在说明书和
权利要求书中,可以使用术语“耦接”和“连接”连同它们的派生词。在本发明的一些实施例中,“连接”用于指示两个或更多元件彼此之间直接地物理
接触或者电接触。“耦接”可以意味着两个或更多元件处于直接地物理接触或电接触。但是,“耦接”也可以意味着两个或更多元件可以不处于彼此之间的直接接触,但彼此之间仍然能进行协作或交互。
[0087] 另外,可以将这种计算机可读介质作为计算机程序产品进行下载,其中所述程序可以通过数据信号的方式,例如通过载波
波形或者其它传播介质,经由通信链路(例如,总线、调制解调器或者网络连接),从远程计算机(例如,
服务器)传送给
请求的计算机(例如,客户端)。
[0088] 因此,虽然本发明的实施例用特定于结构特征和/或方法动作的语言进行了描述,但应当理解的是,本申请所要求保护的主题并不限于所描述的特定特征或动作。相反,只是将这些特定特征和动作公开成用于实现所要求保护的主题的示例形式。