CN104969179B - 用于将具有循环承载的依赖的标量计算机程序循环向量化的方法和系统 - Google Patents

用于将具有循环承载的依赖的标量计算机程序循环向量化的方法和系统 Download PDF

Info

Publication number
CN104969179B
CN104969179B CN201380073078.XA CN201380073078A CN104969179B CN 104969179 B CN104969179 B CN 104969179B CN 201380073078 A CN201380073078 A CN 201380073078A CN 104969179 B CN104969179 B CN 104969179B
Authority
CN
China
Prior art keywords
vector
scalar
edge
computer program
predicate
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.)
Active
Application number
CN201380073078.XA
Other languages
English (en)
Other versions
CN104969179A (zh
Inventor
J.布哈拉瓦
N.瓦苏德范
A.哈托诺
S.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.)
Intel Corp
Original Assignee
Intel Corp
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 Intel Corp filed Critical Intel Corp
Publication of CN104969179A publication Critical patent/CN104969179A/zh
Application granted granted Critical
Publication of CN104969179B publication Critical patent/CN104969179B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • 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/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3838Dependency mechanisms, e.g. register scoreboarding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • 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
    • 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
    • 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/44Arrangements for executing specific programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Complex Calculations (AREA)

Abstract

公开了用于将具有循环承载的依赖的标量计算机程序循环转换为向量计算机程序循环的方法和系统。一种示例方法和系统生成与第一有条件执行的语句相关联的第一谓词集合。第一谓词集合包含使得在通过第一有条件执行的语句定义变量时或在此之前在标量计算机程序循环中定义该变量的谓词的第一集合。该方法和系统还生成与第一有条件执行的语句相关联的第二谓词集合。第二谓词集合包含使得在通过第一有条件执行的语句定义该变量时或在此之前在标量计算机程序循环中使用该变量的谓词的第二集合。该方法和系统确定第二谓词集合是否是第一谓词集合的子集,并且基于该确定,将该变量的向量的元素中的向量值传播给向量的随后元素。

Description

用于将具有循环承载的依赖的标量计算机程序循环向量化的 方法和系统
技术领域
一般来说,本公开涉及计算机系统,更具体来说,涉及用于将具有循环承载的依赖(loop-carried dependence)的标量计算机程序循环向量化的方法和系统。
背景技术
许多现代的计算机系统采用计算机程序向量化技术,例如优化计算机程序代码编译器以便将标量计算机程序向量化。向量化涉及将在代表单个数值的标量变量/操作数上操作的标量计算机程序循环转换成在代表数值集合的向量变量/操作数(例如,“k”个元素的向量包括“k”个值)上操作的向量计算机程序循环。常规编译器利用简单的变量扩展(即,用向量程序变量代替标量程序标量)来在不具有循环承载的依赖的标量计算机程序循环上执行向量化。
附图说明
图1A示出能够将标量计算机程序循环向量化的示例向量化系统的框图。
图1B示出能够将具有字典反向循环承载的依赖的标量计算机程序循环向量化的示例向量化系统的框图。
图1C示出能够将具有由递归循环操作引起的循环依赖的标量计算机程序循环向量化的示例向量化系统的框图。
图1D示出能够将具有交叉迭代存储器依赖的标量计算机程序循环向量化的示例向量化系统的框图。
图1E示出能够将具有由有条件执行的语句引起的循环承载的依赖的标量计算机程序循环向量化的示例向量化系统的框图。
图1F示出能够将具有由标量引用引起的循环承载的依赖的标量计算机程序循环向量化的示例向量化系统的框图。
图2示出代表具有包含字典反向循环承载的依赖的标量计算机程序循环的示例计算机程序的示例伪代码。
图3示出代表利用图1B的示例向量化系统创建的图2的示例标量计算机程序循环的示例向量化版本的示例伪代码。
图4示出代表具有由递归循环操作引起的循环承载的依赖的示例标量计算机程序循环的示例伪代码。
图5示出供示例代码生成器用于将具有由递归循环操作引起的循环承载的依赖的计算机程序循环向量化的示例伪代码。
图6示出代表利用图1C的示例向量化系统创建的图4的示例标量计算机程序循环的示例向量化版本的示例伪代码。
图7示出代表具有循环承载的交叉迭代存储器依赖的示例标量计算机程序的示例伪代码。
图8示出代表利用图1D的示例向量化系统创建的图7的示例标量计算机程序循环的示例向量化版本的示例伪代码。
图9示出代表具有由有条件执行的语句引起的循环承载的依赖的示例标量计算机程序的示例伪代码。
图10示出代表利用图1E的示例向量化系统创建的图9的示例标量计算机程序循环的示例向量化版本的示例伪代码。
图11示出代表具有由标量引用引起的循环承载的依赖的示例标量计算机程序的示例伪代码。
图12示出代表利用图1F的示例向量化系统创建的图11的计算机程序循环的示例向量化版本的示例伪代码。
图13示出代表由图1B的示例向量化系统执行以便将具有字典反向循环承载的依赖的标量计算机程序循环向量化的示例机器可读指令的示例流程图。
图14A和14B示出代表由图1B的示例向量化系统执行以便将具有字典反向循环承载的依赖的标量计算机程序循环向量化的示例机器可读指令的示例伪代码。
图15A-15C示出代表由图1C的示例向量化系统执行以便将具有由递归循环操作引起的循环承载的依赖的标量计算机程序循环向量化的示例机器可读指令的示例流程图。
图16A-16C示出代表由图1C的示例向量化系统执行以便将具有由递归循环操作引起的循环承载的依赖的标量计算机程序循环向量化的示例机器可读指令的示例伪代码。
图17A和17B示出代表由图1D的示例向量化系统执行以便将具有循环承载的交叉迭代存储器依赖的标量计算机程序循环向量化的示例机器可读指令的示例流程图。
图18A和18B示出代表由图1D的示例向量化系统执行以便将具有循环承载的交叉迭代存储器依赖的标量计算机程序循环向量化的示例机器可读指令的示例伪代码。
图19A和19B示出代表由图1E的示例向量化系统执行以便将具有由有条件执行的语句引起的循环承载的依赖的标量计算机程序循环向量化的示例机器可读指令的示例流程图。
图20A和20B示出代表由图1E的示例向量化系统执行以便将具有由有条件执行的语句引起的循环承载的依赖的标量计算机程序循环向量化的示例机器可读指令的示例伪代码。
图21A和21B示出代表由图1F的示例向量化系统执行以便将具有由标量引用引起的循环承载的依赖的标量计算机程序循环向量化的示例机器可读指令的示例流程图。
图22A和22B示出代表由图1F的示例向量化系统执行以便将具有由标量引用引起的循环承载的依赖的计算机程序循环向量化的示例机器可读指令的示例伪代码。
图23是可执行图13、14A-14B、15A-15C、16A-16B、17A-17B、18A-18B、19A-19B、20A-20B、21A-21B和22A-22B的示例机器可读指令以便实现图1A、1B、1C、1D、1E和1F的示例向量化系统的示例处理系统的框图。
在可能的情况下,附图和随附书面描述中将使用相同的参考数字来表示相同或类似部分。
具体实施方式
本文中所公开的示例设备、方法、系统和制品允许将具有循环承载的依赖的标量计算机循环向量化。在一些示例中,这些方法和系统使得能够通过利用计算机程序代码、应用和/或服务来进行这样的向量化,其中计算机程序代码、应用和/或服务包括与可在具有支持对具有运行时数据依赖的循环的推测性向量化的硬件/软件的体系结构(例如,MacroscalarTM或类似体系结构)中使用的计算机语言相关联的计算机代码。
向量化允许在同一时间执行标量计算机程序循环的多个迭代,从而提高速度和操作效率。为了使得能够进行并行循环迭代,将标量计算机程序循环中的每个标量变量转换成代表各自存储在不同向量元素中的数值的集合的向量变量(例如,具有“k”个元素的向量存储“k”个数值)。(以此方式转换这些变量有时称为标量扩展。)向量变量的每个向量元素对应于不同的循环迭代,从而使得第一向量元素包含在第一迭代期间计算的第一值,第二向量元素包含在第二迭代期间计算的第二值,等等。一般来说,倘若循环中的一个或多个指令不是以使得产生回路的方式取决于循环中的一个或多个其它指令,那么可以并行迭代标量计算机程序循环(即,将其向量化)。例如,当在循环的一个迭代中计算的变量的值取决于在循环的另一个或相同迭代中计算的变量的值时,存在计算机程序循环的两个指令或变量之间的依赖。在一个迭代中计算的变量值取决于在之前的不同迭代中计算的变量值时的情况下,依赖描述为“交叉”循环迭代(又称为循环承载的交叉迭代依赖)。在一个迭代中计算的变量值取决于在相同迭代中计算的变量值时的情况下,依赖称为循环承载的迭代内依赖。
除了表征为交叉迭代或内迭代之外,依赖还可以表征为以下两种一般类型之一:1)控制依赖,和2)数据依赖。当基于一个或多个有条件执行的语句时,存在控制依赖(又称为条件依赖)。例如,包含在一个循环迭代中有条件地定义、然后在相同或不同循环迭代中无条件地使用或由不同条件保护的标量的计算机程序循环是一种类型的条件依赖。
相比之下,当循环的一个语句或指令(在本文中可互换使用)必须相对于循环中的另一个语句按照特定顺序执行时,可能会出现两个循环迭代之间的数据依赖。如果这些语句不按该特定顺序执行,那么可能会错误地计算供循环使用的标量变量的值。例如,应当先通过写入语句定义在计算机程序循环中使用的标量变量,然后通过读取语句读取该变量。流依赖、逆依赖、输出依赖、存储器依赖和输入依赖是所有类型的数据依赖。将关于在第一语句“A”和第二语句“B”之间具有依赖的程序代码循环描述这些循环依赖的以下示例,其中语句“A”在字典上排在语句“B”之前。注意,本文中所使用的副词“在字典上(lexically)”是指指令出现在循环的实际程序代码中的顺序,但是不一定指基于循环操作执行语句的顺序(例如,循环条件可能会改变执行循环语句的顺序,而语句的字典顺序保持不变)。例如,如果语句“B”修改语句“A”所读取的存储器位置,并且在语句“A”之前执行语句“B”(例如,“在写入之后读取”),那么语句“A”和“B”之间存在流依赖。如果语句“A”修改语句“B”所读取的资源(例如,存储器位置),并且在语句“A”之前执行语句“B”(例如,“在读取之后写入”),那么语句“A”对语句“B”是逆依赖的。如果语句“B”和语句“A”修改相同资源,并且在执行时语句“B”在语句“A”之前(例如,“在写入之后写入”),那么语句“A”对语句“B”是输出依赖的。如果语句“B”和语句“A”读取相同的存储器位置,并且在语句“A”之前执行语句“B”(例如,“在读取之后读取”),那么语句“A”对语句“B”是输入依赖的。当在计算机程序循环中由不同指令/语句(例如,语句“A”和语句“B”)读取和/或写入到单个存储器位置时,产生基于存储器的依赖。如本文中所使用,术语“指令”和“语句”是等效的,并且两者均指设计/配置成使得计算机执行一个或多个操作的计算机语言构造。如本文中所使用,指令/语句是用于执行操作的工具。
循环承载的依赖还描述为具有方向。例如,如果在执行语句“A”的迭代之后的迭代中执行语句“B”,那么语句“B”和语句“A”之间的循环依赖沿正向流动,并用符号(<)表示。如果在执行语句“A”的迭代之前的迭代中执行语句“B”,那么语句“B”和语句“A”之间的循环依赖沿反向流动,并用符号(>)表示。如果在循环的相同迭代中执行依赖语句“A”和“B”,那么语句“A”和语句“B”之间的依赖称为迭代内依赖,并用符号(=)来表示方向。
一种用于将标量计算机程序循环向量化的技术包括使用依赖图,依赖图是利用例如本文中没有描述的常规技术生成的。依赖图代表计算机程序循环,并且用于标识存在于计算机程序循环中的循环承载的依赖和回路。在依赖图中将循环中的依赖语句或指令(在本文中可互换使用)表示为源节点和/或汇聚节点,并且彼此依赖的节点通过称为边缘的连接线连接。边缘的源节点取决于对应的汇聚节点。因此,每个边缘(在本文中又称为依赖边缘)代表一个依赖。在一些情况下,“边缘”在本文中称为“依赖边缘”,并且在这些情况下,应理解为等效于“边缘”。如本文中所使用,本文中使用以下格式“(E_R, W)”来表示依赖边缘,其中“E”是边缘名称,“R”是代表源节点的读取语句,而“W”是代表汇聚节点的写入语句。本文中还使用以下示例格式“(X_R, W)”来表示从源节点到汇聚节点的边缘,其中“X”表示与边缘相关联的依赖的类型,并且读取和写入语句“R”和“W”分别是边缘的源节点和汇聚节点。当边缘与逆依赖边缘相关联时,可以使用“A”来表示变量“X”;或者当边缘与流依赖相关联时,可以使用“F”来表示变量“X”,等等。
在一些情况下,依赖边缘连接形成路径。如果路径形成回路,那么对应的标量计算机程序循环不可利用常规技术(例如,用向量循环变量代替标量循环变量)来向量化,因为当在并行迭代中执行时,回路会造成标量循环的一个或多个结果出错。而是,必须从标量计算机程序循环中移除/打破存在于标量循环中的回路/路径,然后才可将标量计算机程序循环向量化。从计算机程序循环移除/打破循环承载的回路/路径涉及消除连接形成回路/路径的一个或多个边缘。边缘消除是指执行允许将循环向量化的操作。如果所有回路可以并且已经从循环中消除,那么循环是可向量化的。相反,如果无法消除代表标量计算机程序循环的图的所有回路,那么循环不是可向量化的。
利用距离向量来描述循环依赖如何与循环的不同迭代有关。例如,依赖距离指示可以并行执行的循环迭代的数量。例如,具有距离值2的循环依赖指示依赖出现两个正向迭代(即,当循环依赖的距离值为2时,可以并行执行2个连续迭代)。相反,不能并行迭代具有依赖距离1的循环的迭代。因此,依赖距离的值越大,越容易将循环向量化(即,可以并行执行的循环迭代的数量越大,而不会牺牲循环完整性)。
在一些示例中,本文中所公开的设备、系统、方法和制品通过具有向量化系统、代码提供器和代码执行器的计算机系统来执行。示例向量化系统包括分析器和代码生成器。在一些示例中,分析器创建与将向量化的计算机程序循环相关联的依赖图中的回路和/或相关联边缘的列表。在一些示例中,分析器执行各种操作以便处理与形成所标识的回路的边缘相关联的信息。分析器从根据依赖图标识的边缘/回路的列表中移除成功经过处理的回路和相关联的边缘。如果所标识的边缘/回路的列表为空(即,所有边缘都经过成功处理),那么分析器将边缘依赖信息提供给代码生成器,代码生成器进行操作以便采用使得计算机程序循环可向量化的方式补偿边缘/回路。在一些示例中,代码生成器利用由边缘分析器提供的信息将诸如硬件指令的指令插入到循环中。所插入的指令采用允许并行迭代循环的多个迭代而不会不利地影响循环完整性(例如,循环结果)的方式补偿由所移除的边缘造成的回路。通过本文中所公开的代码向量化设备、系统、方法和制品处理的循环承载的依赖包括例如:1)字典反向循环承载的依赖,2)由递归循环操作引起的循环承载的依赖,3)由交叉迭代存储器冲突引起的循环承载的依赖,4)由有条件执行的语句引起的循环承载的依赖,以及5)由标量引用引起的循环承载的依赖,等等。
如上所述,向量化循环在向量操作数上操作,并允许并行执行标量循环的多个迭代。取决于处理器的处理能力,每个向量操作数(例如,向量变量)包括具有例如8个或16个位的长度的向量。向量变量的每个元素代表一个循环迭代。例如,在具有八个元素的向量中,第一元素包含在标量计算机程序循环的第一迭代中计算的值,第二元素包含在标量循环的第二迭代中计算的值,依此类推。如本文中所使用,向量化循环的迭代称为向量迭代,并包括多个标量循环迭代的并行执行,并且循环迭代是指通过在向量化循环中所使用的向量中的位置之一表示的迭代中的各个迭代。因此,标量循环的循环控制变量(例如,循环变量“i”)控制由标量循环执行的循环迭代的数量(例如,“N”),并且每次执行循环时递增1。向量化循环的循环控制变量控制由向量化循环执行的向量迭代的数量(例如,“N-VL”),并且每次执行向量迭代时递增向量长度。
图1A中示出用于将包含依赖的计算机程序循环向量化的示例计算机系统100A的框图。图1的示例计算机系统100A包括耦合到示例代码提供器111A和示例代码执行器112A的示例向量化系统110A。向量化系统110A包括示例分析器115A和示例代码生成器120A。在一些示例中,分析器115A分析由示例代码提供器111A提供的计算机程序代码/指令,以便标识造成循环承载的依赖的指令。
如果示例分析器115A确定循环包含一个或多个类型的循环承载的依赖/回路,那么示例分析器115A执行一个或多个操作,以便收集关于回路的信息,稍后将该信息提供给代码生成器以用于采用允许将标量计算机程序循环向量化的方式补偿与回路相关联的边缘。在一些示例中,分析器115A生成对应于所处理的标量计算机程序循环的依赖图,然后对图进行分析以便标识存在于图中的依赖边缘。然后,分析器115A对这些边缘进行处理以便收集关于与这些边缘相关联的指令的信息。由于边缘是可稍后通过代码生成器补偿的类型,所以从由分析器标识的边缘列表移除边缘。倘若已经从边缘列表中移除使得在标量计算机程序循环中产生回路的所有边缘,那么将所收集的关于所移除的边缘的指令信息提供给代码生成器120A。将标量计算机程序循环和对应的边缘依赖指令信息传送给示例代码生成器120A,示例代码生成器120A利用边缘依赖信息来将循环向量化。在一些示例中,代码生成器120A通过基于边缘依赖信息插入硬件指令、从而补偿从边缘列表移除的边缘来将循环向量化。然后,可以通过示例代码执行器112A并行地执行向量化循环的迭代。在本文中所公开的示例中,通过分析器执行的边缘移除操作是指从与对应的依赖图相关联的边缘列表中移除边缘。然后,本文中所公开的代码生成器采用补偿由所移除的边缘造成的回路的方式转换对应的标量计算机程序循环,从而使得可以并行地执行标量计算机程序代码的多个迭代(即,可以将标量计算机程序循环向量化)。
具有由有条件定义的标量变量引起的循环承载的字典反向依赖的
循环的向量化
图1B是配置成将具有由于定义条件标量变量、然后无条件地使用该标量或通过不同的第二条件保护该标量引起的循环承载的字典反向依赖的循环向量化的示例向量化系统110B的框图。当例如读取语句读取标量变量并且写入语句随后写入该标量变量时,标量计算机程序循环中存在这种依赖。另外,读取语句基于第一条件执行,而写入语句基于第二条件执行。配置成包括以此方式排序并基于两个不同条件的读取和写入语句的循环在并行迭代时的结果将不同于按串行方式执行每个循环迭代时的结果。因此,循环包括必须通过分析器成功地处理(即,从由分析器创建的边缘列表中移除)才可将循环向量化的边缘/回路。
向量化系统110B包括经由通信总线122B与示例代码生成器120B通信的示例分析器115B。在一些示例中,示例分析器115B包括经由通信总线130B耦合到示例依赖图生成器135B、示例图分析器140B、示例谓词集合生成器145B、示例边缘移除器150B和示例依赖检查器155B的第一示例控制器125B。示例代码生成器120B包括经由通信总线165B耦合到示例代码转换器170B、示例传播器175B和示例选择器/广播器180B的第二示例控制器160B。在一些示例中,第一控制器125B和第二控制器160B可以根据需要存取存储器190B以便在操作期间存储和/或检索信息。
在一些示例中,示例分析器115B从示例代码提供器111A(见图1A)接收代表将向量化的标量循环的程序代码。然后,示例图生成器135B生成代表标量循环的依赖图。图生成器135B将图提供给示例图分析器140B,示例图分析器140B利用图来标识存在于图中的依赖/边缘。例如,图分析器140B创建基于依赖图标识的边缘的列表。
然后,示例谓词集合生成器145B创建将用向量谓词填充的集合。向量谓词包括各自对应于不同循环迭代并且各自控制是否在对应迭代中执行向量循环语句的向量值的集合。向量谓词定义成是控制标量循环中的对应循环语句的执行的条件。如下文所描述,稍后利用由谓词集合生成器145B创建的示例谓词向量集合来标识使得产生循环回路的循环语句(例如,在定义有条件定义的标量变量之前先使用/读取该相同标量变量以使得在并行执行循环的多个迭代时将不利地影响循环的结果的语句)。
如本文中所使用,放在向量语句之前(并且在伪代码中示出时用括号括起来)的谓词“p”指示,向量语句将作为屏蔽向量操作执行。屏蔽向量操作是只有当对应于迭代的谓词向量“p”的向量元素中的值为“真”时才在迭代中执行的操作,否则不执行该操作。因此,例如,用于屏蔽第一向量语句的谓词向量“p”将使得只有当对应于循环迭代的谓词向量元素中的值为“真”时才对该相同循环迭代执行第一向量语句。术语“谓词”在本文中又称为执行语句时的条件。当条件/谓词出现在标量计算机程序中时,它是标量谓词;并且当条件/谓词出现在谓词向量中时,它称为向量谓词。当在向量计算机程序内描述谓词的操作时,将了解,谓词是向量。同样地,当在标量计算机程序内描述谓词的操作时,将了解,谓词是标量。在一些情况下,当为了清楚起见而需要时,采用向量形式的谓词在本文中称为谓词向量。
在一些示例中,谓词集合生成器145B将两个示例谓词集合(例如,“PredDefSet(W,J)”和“PredUseSet(W, J)”)与定义标量的每个写入语句“W”相关联。“PredDefSet(W, J)”包含在为“真”时使得在相同标量迭代内在写入语句“W”处或之前定义标量“J”的每个谓词。“PredUseSet(W, J)”包含在为“真”时使得在相同标量迭代内在写入语句“W”处或之前使用标量“J”的每个谓词。“PredDefSet(W, J)”初始化为包含“pW”,其中“pW”控制写入语句“W”的执行;并且“PredUseSet(W, J)”初始化为NULL(空)集合。
接着,示例边缘移除器 150B从由边缘分析器135B生成的边缘列表中移除读取标量变量“J”的读取语句“R”和写入标量变量“J”的写入语句“W”之间的每个循环承载的字典反向逆依赖边缘,然后将谓词“pR”添加到集合“PredUseSet(W, J)” 中(即,集合PredUseSet(W, J)等于“PredUseSet(W, J)”和谓词“pR”的并集),其中“pR”控制读取语句“R”的执行。
边缘移除器150B还从由边缘分析器135B生成的边缘列表中移除例如两个写入语句“W1”和“W2”之间的每个字典反向输出依赖边缘(例如,从标量“J”的第二写入语句“W2”到第一写入语句“W1”的依赖),前提条件是第二写入语句“W2”不是递归操作。一旦移除依赖,边缘移除器150B便将谓词“pW1”添加到集合“PredDefSet(W2, J)”中(例如,集合“PredDefSet(W2, J)”等于“PredDefSet(W2, J)”和“pW1”的并集),其中“pW1”控制写入语句“W1”的执行(注意,递归操作可以采用“T=fn(T, Z)”的形式,其中输入和输出“T”是对相同存储器位置的标量或数组引用。尽管这里没有描述,但是下文将关于图4、5、6、15A、15B、15C、16A、16B和16C详细描述用于将具有递归操作的循环向量化的技术。)。如下文所描述,对与上文所描述的依赖类型相关联的边缘进行处理以便允许从由边缘分析器140B生成的边缘列表中移除边缘,因为代码生成器120B稍后对与所移除的边缘有关的信息(例如,集合“PredDefSet”和“PredUseSet”)进行处理,以便补偿使得在循环中存在回路/路径的任何边缘。
除了执行上文所描述的操作之外,边缘移除器150B还尝试利用其它技术(包括本文中所公开的任何技术)来处理由边缘分析器135B标识的边缘列表中剩余的任何其它边缘。例如,尝试适用于所处理的边缘类型的边缘处理技术(即,将使得能够通过代码生成器将循环向量化的任何技术)。在边缘移除器150B完成操作之后,示例依赖检查器155B确定在由边缘分析器135B标识的边缘列表中是否剩余任何边缘。如果剩余任何回路,那么循环不是可向量化的,并且向量化系统110B停止操作。如果依赖检查器155B确定正在向量化的计算机程序循环中没有剩余任何边缘,那么示例分析器115B将现在可向量化的计算机程序循环提供给代码生成器120B的代码转换器170B。
当在示例代码生成器120B处接收可向量化的代码时,示例代码转换器170B将通过诸如下列的方法将由示例分析器115B提供的标量计算机程序语句转换成向量语句:1)用对标量变量的向量版本的引用代替对标量变量的引用,2)将标量计算机程序循环中的条件语句换成谓词语句“p”,3)将有条件执行的语句转换成屏蔽谓词操作,4)用向量迭代控制变量代替标量迭代控制变量,等等。如本文中所使用,将前缀“v”添加到标量变量以指示标量变量的向量形式(标量扩展)。例如,使用“vj”来表示标量变量“J”的向量形式。
接着,传播器175B确定是否存在包含在“PredUseSet(W, J)”中但没有包含在对应“PredDefSet(W, J)”中的任何向量谓词。如果包含在“PredUseSet(W, J)”中的向量谓词不是包含在对应“PredDefSet(W, J)”中的谓词的子集,那么写入语句“W”与依赖回路相关联。作为响应,示例传播器175B采用有效地使得打破/消除回路的方式执行传播操作以便补偿依赖回路。
例如,传播器175B使得标量变量“J”的有条件定义的向量“vj”的元素从一个循环迭代传播到随后执行的循环迭代,从而防止执行其中使用但没有定义该标量的迭代。在操作中,传播器175B将来自向量“vj”的向量元素的值(其中对应的谓词向量元素为“真”)传播给向量“vj”的随后向量元素(其中对应的谓词向量元素为“假”)。在一些示例中,传播器175B通过例如在所标识的有条件执行的写入语句(例如,W1、W2…等)之后插入指令(例如,传播指令)来执行该传播操作。
在一些示例中,选择器/广播器180B接着选择在当前向量迭代中计算的向量“j”的最后的值,并将该值广播给向量“vj”的所有元素。示例选择器/广播器180B和广播器170B可以通过例如在正在进行向量化的循环的底部插入指令(例如,选择和/或广播指令)来这么做。一般来说,选择和/或广播指令进行操作以便选择驻存在在第一向量迭代中计算的向量“vj”的最后的向量元素处的值并将该值广播给向量“vj”的所有元素,以便在执行第二向量迭代时使用。例如,如上文所描述,如果每个向量是十六个元素长,那么并行执行十六个迭代的第一集合,然后并行执行十六个迭代的第二集合,依此类推,直到达到期望的迭代数量为止。当使用选择和/或广播指令时,将在第一迭代集合期间为“vj[i]”的最后的向量元素计算的值传播给向量“vj[i+1]”的每个元素,以便在执行第二迭代集合时使用,依此类推。因此,选择在第一迭代向量“vj[i]”中计算的“vj”的最后的元素并将它广播给向量“vj[i+1]”的元素以便在第二迭代向量“vj[i+1]”中使用确保了在执行之前正确地初始化向量“vj[i+1]”。
在一些示例中,图生成器135B、图分析器140B、谓词集合生成器145B、边缘移除器150B和依赖检查器155B在第一控制器125B的控制下操作。同样地,在一些示例中,代码转换器170B、传播器175B和选择器/广播器180B在控制器160B的控制下操作。
还可参考利用图2中示出的伪代码进行说明的示例标量计算机程序循环200来进一步理解图1B的示例向量化系统110B的操作。计算机程序循环200包含由有条件定义的标量变量引起的循环承载的字典反向逆依赖和输出依赖(如下文所描述)。在描述示例循环200的操作之后再接着描述示例向量化系统110B如何进行操作以便将循环200向量化。
当将标量“j”初始化为等于“a[0]”时,示例计算机程序循环200开始。(见行202。)接着,进入由计时器“i”控制的循环(见行204),并执行第一条件或第一谓词“p1”的测试,其中p1等于“a[i]<b[i]”(见行206)。如果满足第一谓词“p1”,那么通过将标量“j”设置成等于“a[i]”来执行第一写入语句“W1”(见行208)。如果不满足第一谓词“p1”,那么执行第二条件或谓词“p2”的测试,其中“p2”为“c[i]<b[i]”(见行212)。如果满足第二谓词“p2”,那么通过设置“j= c[i]”来执行第二写入语句“W2”(见行214)。如果不满足第二谓词“p2”,那么程序200测试第四条件或谓词“p4”,其中“p4”为“b[i]>0”(见行218)。如果满足第四谓词“p4”,那么执行读取语句“R1”,在此处读取“b[i]”的值以作为标量“j”的值(见行220)。如果不满足第四谓词“p4”,那么返回“j”的值(见行226)。(注意,第三谓词“p3”将关于图3中示出的向量化计算机程序循环300进行定义和描述。)
因此,示例计算机程序循环200包含到标量变量“j”的两个条件写入语句“W1”和“W2”(见行208、214)以及标量变量“j”的一个条件读取语句“R1”(见行220)。执行这些指令的顺序造成:1)从“R1”到“W1”和“W2”的字典反向逆依赖,2)从第一写入语句“W1”到第二写入语句“W2”的输出依赖,以及3)从第二写入语句“W2”到第一写入语句“W1”的字典反向输出依赖。
写入语句“W1”基于谓词“p1”定义变量“j”,而写入语句“W2”基于“p2”定义变量“j”。如果“p1”和“p2”中的任一者或两者在当前迭代中为真,那么将在相同迭代中定义变量“j”,然后执行读取语句“R”。但是,如果“p1”和“p2”在当前迭代中均不为真,那么在相同迭代中执行读取语句“R”时,变量“j”将是未定义的。当读取语句“R”在当前迭代中定义了变量“j”之前执行时,将在当前迭代中读取在之前的迭代中所设置的变量“j”的值。因此,当“p1”和“p2”均不为真时,当前迭代的结果取决于之前的迭代(即,条件写入语句造成循环依赖),从而使得并行迭代标量计算机程序循环将在一个或多个迭代的结果中导致错误。
图3示出代表示例标量计算机程序代码200(见图2)的向量化版本的示例计算机程序代码300。在一些示例中,图1的向量化系统110B用于将图2的标量计算机程序循环200向量化,从而生成图3的向量化计算机程序循环300。首先,示例分析器115B标识和处理标量计算机程序循环200的边缘,以使得能够将循环向量化。为了执行该转换,图生成器135B生成循环200(见图2)的依赖图。然后,图分析器140B利用该图来标识和创建存在于标量计算机程序循环200(见图2)中的边缘的列表。存在于计算机程序循环200(见图2)中的边缘与如下依赖相关联:1)从“R1”到“W1”和“W2”的字典反向逆依赖,2)从第一写入语句“W1”到第二写入语句“W2”的输出依赖,以及3)从第二写入语句“W2”到第一写入语句“W1”的字典反向输出依赖。
接着,谓词集合生成器145B将两个谓词集合“PredDefSet(W, J)”和“PredUseSet(W, J)”与每个写入语句“W1”和“W2”相关联,以使得谓词集合生成器145B创建以下四个集合:1)“PredDefSet(W1, j={p1}”,2)“PredUseSet(W1, j)={}”,3)“PredDefSet(W2, j)={p2}”,以及4)“PredUseSet(W2, j)={}”。示例边缘移除器150B从由图分析器140B标识的边缘列表移除“R1”和“W1”之间的交叉迭代反向逆依赖边缘并将“PredUseSet(W1, j)”设置成等于“{p3}”,从由图分析器140B标识的边缘列表移除“R1”和“W2”之间的交叉迭代反向逆依赖边缘并将“PredUseSet(W2, j)”设置成等于“{p3}”。边缘移除器150B还移除“W2”至“W1”的交叉迭代输出依赖边缘,并将“PredDefSet(W2, j)”设置成等于“{p2|p1}”。在该示例中,“PredUseSet(W1, j)”不是“PredDefSet(W1, j)”的子集,从而指示写入语句“W1”与回路相关联。同样地,“PredUseSet(W2, j)”不是“PredDefSet(W2, j)”的子集,从而指示写入语句“W2”与回路相关联。
在边缘移除器150B停止操作之后,示例依赖检查器155B确定已经从由示例图分析器140B所标识的边缘列表移除所有循环依赖边缘,并使得将可向量化的循环提供给示例代码生成器120B。然后,示例代码生成器120B开始操作以便通过使得代码转换器170B将图2的标量循环200的有条件执行的语句转换成图3的循环300中的有条件执行的向量语句来创建图3的向量化代码300。例如,为了转换循环2中的写入语句“W1”(见图2的行208),代码转换器170B用将有条件定义的成谓词“p1=a[i:i+VL-1]<b[i:i+VL-1]”(见图3的行306)的语句来代替条件语句“if (a[i]<b[i])”(见图2的行206)。这里,使用第一谓词“p1”(见行308)作为用于执行第一写入语句“W1”的掩码向量,并使用第二谓词“p2”(见行312)作为用于执行第二写入语句“W2”的掩码向量(见314行)。在语句之前用括号括起来的谓词“p”指示该语句将作为屏蔽向量操作来执行。屏蔽向量操作是只有当用作向量掩码的谓词“p”的元素为“真”时才执行的操作,否则不执行该操作。因此,例如,关于图3的行308,使用第一谓词“p1”来屏蔽第一写入语句“W1”的操作,以使得取决于谓词掩码的对应向量元素是否为真而在向量“vj”的特定元素上执行第一写入操作“W1”。
在循环200的示例中,如上所述,只有当“p1”和“p2”均为真(即,“p1”和“p2”的并集)时才执行读取指令“R”。因此,示例代码转换器还定义等于“p1”和“p2”的并集(例如,“p1|p2”)的第三谓词“p3”(见行316)以便控制读取语句“R”的执行。
如上所述,“PredUseSet(W1, j)”不是“PredDefSet(W1, j)”的子集,并且“PredUseSet(W2, j)”不是“PredDefSet(W2, j)”的子集。因此,示例传播器175B在第一写入语句“W1”之后插入由谓词“p1”屏蔽的第一示例传播指令(例如,“PropagatePostTrue”指令)(见行310),并在第二写入语句“W2”之后插入由谓词“p2”屏蔽的第二示例传播指令(例如,“PropagatePostTrue”指令)(见行318)。如上所述,行318的“PropagatePostTrue”指令使得将在“p3”为真的循环迭代中计算的“vj”的向量元素的值传播给在“p3”为假的随后循环迭代中计算的向量元素。该操作使得在“p1”和“p2”均不为“真”的任何迭代(即,在读取之前没有定义“j”的迭代)中计算的变量“j”的值等于在上一次定义“j”的值的迭代中计算的变量“j”的值。在该示例中,在“p1”和/或“p2”为“真”的之前最近一次迭代中最后定义“j”的值。因此,传播指令(见行318)补偿由在给定迭代中定义循环变量之前在相同迭代中使用该循环变量的循环语句造成的循环依赖,从而允许并行执行循环的多个迭代(即,将其向量化)。
然后,选择器/广播器170B在循环的底部(即,末端)插入示例选择指令(例如,“SelectLast”操作),以便基于谓词“TRUE_Predicate”选择在每个循环迭代中计算的“j”的最后的值并将该值广播给向量“vj”的所有元素,其中“TRUE_Predicate”中的所有值均为真(见行324)。
注意,行310的“PropagatePostTrue”指令旨在补偿由有条件执行的写入语句“W1”造成的循环依赖。但是,通过定义谓词“p3”以便考虑“p1”和“p2”均不为真的情况,图3的行318处的“PropagatePostTrue”指令补偿了其中读取指令“R”尝试读取之前没有在相同循环迭代中定义的“j”值的两个示例。因此,行310的“PropagatePostTrue”指令从不操作并且可以移除,而不会对循环操作造成影响。
具有由递归操作引起的循环依赖的循环的向量化
图1C是配置成将具有因使用递归操作而引起的循环依赖的循环向量化的示例向量化系统110C的框图。递归操作可以采用“T=fn(T, Z)”的形式,其中输入和输出“T”是对相同存储器位置的标量或数组引用。一个示例递归指令可以采用写入语句“W”的形式,其中“W”等于“t=t+a[i]”,从而将“t”的值设置成等于“t”的之前定义的值加上加数“a[i]”。在之前执行的迭代中定义了将添加到“a[i]”的“t”的值的情况下,当前迭代“i”的结果取决于之前执行的循环迭代的结果,从而导致产生循环依赖。
在一些示例中,计算机程序循环包含读取语句“R”,读取语句“R”在变量“t”上操作,并在执行递归写入语句“W”之前,其中“W”的执行取决于条件“p”。在这类示例中,假设在进入计算机程序循环之前将“t”的值初始化为“tinitial”,那么在第四个循环迭代处执行写入语句“W”之后,“t”的值将等于“tinitial+a[1]+a[2]+a[3]+a[4]”,前提条件是在这四个循环迭代的每个循环迭代中均满足谓词条件“p”。相反,如果在前三个循环迭代中满足谓词条件“p”,但是在第四个循环迭代中不满足谓词条件“p”,那么第四个循环迭代处的“t”的值将等于“tinitial+a[1]+a[2]+a[3]”。因此,在每个循环迭代中读取的“t”的值将等于“tinital”加上与其中满足对应谓词条件“p”的更早循环迭代相关联的“a”的值。
在图1C的所示示例中,向量化系统110C包括经由示例通信总线122C与示例代码生成器120C通信的示例分析器115C。示例分析器115C进行操作以便标识和处理由递归操作引起的循环依赖边缘,从而使得计算机程序循环可向量化,并且示例代码生成器120C进行操作以便将代码向量化。在一些示例中,如下所述,示例分析器115C通过以下方法来执行依赖边缘移除操作:创建循环的依赖图,利用该图来标识循环依赖,然后从图移除边缘。代码生成器120C进行操作以便通过以下方法来将包含在计算机程序循环中的递归指令向量化:取决于谓词向量的值,使得将第一向量的一个或多个元素添加到第二向量的一个或多个元素。在一些示例中,利用创建代表递归指令的“加数”的向量的元素的运行和的指令来添加第一和第二向量的元素,这将在下文更详细地描述。
在一些示例中,分析器115C包括经由通信总线130C耦合到示例图生成器135C、示例图分析器140C、示例递归指令标识器145C、示例边缘标识器150C、示例边缘移除器152C和示例部分向量化工具155C的第一示例控制器125C。在一些示例中,图1C的代码生成器120C包括经由通信总线165C耦合到示例向量代码转换器170C、示例选择器/广播器175C、示例向量重命名工具180C和示例递归加法器185C的第二示例控制器160C。示例第一控制器125C和示例第二控制器160C可以根据需要存取存储器190C以便在操作期间存储和/或检索信息。
在一些示例中,示例分析器115C从示例代码提供器111A(见图1A)接收代表将向量化的标量循环的程序代码。然后,示例图生成器135C生成代表标量循环的依赖图。图生成器135C将图提供给示例图分析器140C,示例图分析器140C利用图来标识和创建存在于依赖图中的边缘的列表。
然后,递归指令标识器145C用“S”标记在例如变量“t”上操作的每个递归指令。在一些示例中,递归指令“S”是采用“t=t+加数”的形式或“t=t-加数”的形式的写入语句“W”(前提条件是,变量“加数”是常数或是不取决于变量“t”的变量表达式)。如果加数不是常数或是取决于变量“t”的变量表达式,那么代码不是可向量化的,并且向量化系统110C停止操作。这里,变量“t”可以是标量变量、数组变量或存储器存取,其中递归操作中的循环承载的流依赖距离为1。流依赖距离为1指示,在循环的当前迭代中读取在循环的之前的迭代中写入的值。如上所述,具有依赖距离1的循环的迭代不可并行执行。
除了用“S”标记递归指令/语句之外,示例递归指令标识器145C还创建称为例如“RecurrenceSet(t)”的示例指令集合以便存储递归指令/语句,并用以“S”标记的指令填充该集合。
然后,示例分析器115C的示例边缘标识器150C创建称为“EdgesToRemove(t)”的初始为空的集合,稍后将用将从由图分析器140C生成的边缘列表移除的边缘来填充该集合。示例边缘标识器150C将每个操作数“t”上从循环中的读取语句“R”延伸到循环中的写入语句“W”之一的每个迭代内逆依赖边缘(例如,“A” )添加到“EdgesToRemove(t)”集合,前提条件是写入语句“W”是递归指令“S”,而读取语句“R”不是递归指令“S”(例如,“RecurrenceSet(t)”集合包含写入语句“W”,但不包含读取语句“R”)(如果不满足该条件,那么向量化系统110C无法将代码向量化,并停止操作。)。在一些示例中,递归指令标识器145C还创建对应于每个读取语句“R”的称为例如“PreAdd(R)”的初始为空的指令集合。如下文所描述,稍后将用在由读取语句“R”操作的相同变量(例如,“t”)上操作的递归写入指令“W”来填充对应于每个读取语句“R”的 “PreAdd(R)”集合。
接着,示例部分向量化工具155C选择剩余在“EdgesToRemove(t)”中的从读取指令“R”延伸到写入指令“W”的具有方向(=)的逆依赖边缘(例如,“A” ),并应用部分向量化技术以便采用将允许循环的向量化的方式补偿该边缘。当部分向量化技术的应用将使得能够将循环向量化(例如,将导致消除依赖图中从读取语句“R”到写入语句“W”的一个或多个回路)时,并且进一步地,倘若存在利用不经过“EdgesToRemove(t)”集合中的边缘的迭代内依赖边缘构造的从读取语句“R”到写入语句“W”的路径,那么示例部分向量化工具155C应用部分向量化技术。部分向量化技术可以包括例如下文关于图11、14和21描述的部分向量化技术。
如果无法利用部分向量化技术来处理一个或多个边缘(例如,应用部分向量化将不能使得通过代码生成器120C将循环向量化),那么示例边缘移除器152C从“RecurrentSet(t)”集合移除递归指令“W”,然后从“EdgesToRemove(t)”集合移除所有边缘。如下文所描述,当部分向量化技术没有成功从由示例图分析器140C生成的边缘列表移除一个或多个边缘(即,应用部分向量化将不能使得向量化)时,稍后应用其它边缘处理技术,以便尝试移除由这些边缘造成的回路并且从而使得能够进行循环向量化。
倘若“RecurrenceSet(t)”集合不为空(即,“RecurrenceSet(t)”集合包含一个或多个其它递归写入指令/语句,例如第二写入语句“W2”),那么部分向量化工具155C选择第二写入语句“W2”,将相关联的逆依赖边缘添加到“EdgesToRemove(t)”,并采用上文所描述的方式继续进行操作,以便尝试利用部分向量化技术来处理边缘依赖图。在一些示例中,部分向量化工具155C与代码生成器120C而不是与代码分析器115C相关联。
如果示例部分向量化工具155C成功允许移除与递归指令(例如,“W”)相关联的一个或多个这样的边缘,那么示例递归指令标识器145C将写入指令“W1”添加到为每个对应的读取语句“R”创建的“PreAdd(R)”集合(例如,“PreAdd(R)”)。在一些示例中,示例递归指令标识器145C通过将“PreAdd(R)”设置成等于“PreAdd(R)”和“W”的并集来将写入语句“W1”添加到“PreAdd(R)”集合。接着,示例边缘移除器152C从依赖图(即,从由边缘分析器135C创建的边缘列表)移除具有包含在“RecurrenceSet(t)”集合中的汇聚节点的循环承载的逆依赖边缘,并从依赖图移除出现在两个递归指令/语句之间(例如,从第一写入语句“W1”到第二写入语句“W2”)的循环承载的流或输出依赖边缘,其中这两个递归指令/语句均包含在“RecurrenceSet(t)”中。如果“RecurrenceSet(t)”中剩余额外递归指令,那么对于剩余的每个递归指令重复上述操作。
如果依赖图中剩余的一个或多个边缘连接形成依赖回路,那么通过例如图1B、1D、1E和1F的分析器执行的一个或多个其它技术可部署成尝试处理这些剩余边缘。例如,尝试适用于将处理的边缘类型的技术(即,尝试将允许通过代码生成器将循环向量化的技术)。如果没有成功处理这些边缘和相关联的回路,那么无法将循环向量化,并且编译器110A停止操作。相反,如果成功处理/从由图分析器140B创建的边缘列表移除这些边缘和相关联的回路,那么循环现在是可向量化的,并由示例分析器115B提供给示例代码生成器160C以用于向量化。
当在示例代码生成器120C处接收可向量化的代码时,示例代码转换器170C通过诸如下列的方法将由示例分析器115C提供的标量计算机程序循环指令转换成向量程序指令:1)用对标量变量的向量版本的引用代替对标量变量的引用,2)用谓词语句“p”代替标量代码中的条件语句,3)将有条件地执行的语句转换成屏蔽谓词操作,4)用向量迭代控制变量代替标量迭代控制变量,等等。
接着,示例递归加法器185C递归地使用第一运行和操作和/或第二运行和操作,以便添加对应于每个循环迭代的“加数”值(例如,“a[i]、a[i+1]、a[i+2]、a[i+3]等”),并且从而形成加数值的第一运行和的第一向量(例如,“vsal”)和加数值的第二运行和的第二向量(例如,“vsa2”)。第一和第二运行和(例如,“vsa1”和“vsa2”)中的每个元素代表聚集直到期望循环迭代(例如,“i”或“ [i-1]”)的加数值的运行和。在一些示例中,递归加法器185C通过以下方法形成第一和第二运行和向量(例如,“vsa1”和“vsa2”):1)使得将加数值的向量(例如,“va”)的元素添加到另一个向量(例如,向量“v1”)的元素,2)使得将加数向量“va”的元素加在一起,和/或3)将加数向量“va”的元素传播给“vsa”的随后元素。通过递归加法器185C执行的相加和传播操作基于谓词掩码条件向量“p”执行。谓词掩码条件“p”对应于标量循环中用于控制对应标量递归指令“t=t+v[a]”的操作的条件。
在一些示例中,示例递归加法器185C利用传播指令的示例集合(例如,分别利用“RunningPostAdd”指令和“RunningPreAdd”指令)来生成第一和第二运行和。例如,“RunningPostAdd”指令在“v1”、“va”和“p”上操作以便计算第一运行和(例如,“vsal”),并且采用“vsal=RunningPostAdd(v1, va, p)”的形式。例如,“RunningPreAdd”指令也在向量“v1”、向量“va”和谓词掩码向量“p”上操作以便计算第二运行和(例如,向量“vsa2”),并且采用“vsa2=RunningPreAdd(v1, va, p)”的形式。两个指令均从驻存在谓词掩码向量“p”的向量元素位置“0”处的向量元素开始遍历谓词掩码向量“p”的向量元素。将包含在第一向量“v1”中的每个向量元素值复制到第一和第二运行和向量(例如,“vsa1”和“vsa2”)中的对应元素位置“k”,直到遇到谓词掩码向量“p”的第一个“真”谓词元素。当遇到谓词掩码向量“p”的第一个“真”谓词元素时,将向量“va”的掩码启用元素的运行和(即,部分和)添加到向量“v1”的第一掩码启用元素,并作为驻存在第一运行和向量和第二运行和向量(例如,“vsa1”或“vsa2”)的对应位置“k”中的元素加以存储。当使用“RunningPostAdd”指令时,在向量“vsa1”的向量元素位置“k”处记录的值(即,“vsa1[k]”)包括添加驻存在向量“va”的向量元素位置“k”处的元素(即,第一运行和聚集直到位于位置“k”处的向量“va”的元素,并且包括该元素)。相比之下,对于“RunningPreAdd”,在向量“vsa2”的向量元素位置“k”处记录的向量值包括聚集直到驻存在向量元素位置“k”处的元素、但不包括该元素的向量“va”的元素的部分和(即,第二运行和聚集直到位于位置“k-1”处的向量“va”的元素)。注意,向量“v1”代表将添加到部分和(例如,“vsa1”或“vsa2”)的初始值。在一些示例中,递归加法器185C在循环的顶部初始化向量“v1”的元素。
利用图4的示例来示范当利用谓词“p”来在所示八元素向量“v1”和“va”上操作时“RunningPostAdd”和“RunningPreAdd”指令的操作,驻存在向量元素位置“k=0”处的“vsa1”的向量值等于驻存在向量元素位置“k=0”处的“v1”的向量值(例如,“vsa1[0]” =“v1[0]”)。同样地,“vsa1[1]”=“v1[1]”,因为驻存在向量元素位置“k=0”和“k=1”处的谓词向量“p”的前两个元素为“假”。“p”的第一个“真”值驻存在向量元素位置“k=2”处。因此,在向量元素位置“k=2”处开始计算运行和。从而,向量元素位置“k=2”处的“vsa1”的值等于“v1[2]+va[2]”,并且向量元素位置“k=2”处的“vsa2”的值等于“v1[2]”。同样地,由于“p[3]”为“真”,所以“k=3”处的“vsa1”的值等于“v1[2]+v2[2]+v2[3]”,并且“k=3”处的“vsa2”等于“v1[2]+v2[2]”。“vsa1”的值在k=4、5和6处保持不变,因为谓词“p”在这些向量元素位置处为“假”,并且“vsa1”的值在“k=7”处包括添加“v2[7]”。“vsa2”的值在k=4、5、6和7处保持不变,因为谓词“p”在这些向量元素位置处为“假”,并且“vsa2”的值在“k=7”处不包括添加“v2[7]”。
再次参考图1C,在插入生成第一运行和(例如,“vas1”)的指令之后,示例递归加法器185C通过插入将第一运行和添加到向量“vt”的向量递归操作来重新定义向量“vt”。因此,在一些示例中,示例递归加法器185C插入向量指令序列“{vsa1=RunningPostAdd(v1,va, p); vt=vt+vsa1}”,其中“S”是“t=t+a”的形式;或插入指令序列“{vsa1=RunningPostAdd(v0, va, p); vt=vt-vsa1}”,其中指令“S”是“t=t-a”的形式。
接着,为了区分由递归写入指令“W”写入、然后由读取指令“R”读取的向量“vt”和在计算机程序循环中的其它地方使用的其它形式的向量“vt”,示例重命名工具180C在向量“vt”上操作的每个读取指令“R”之前重命名向量“vt”。在一些示例中,示例重命名工具180C将由读取指令“R”操作的向量“vt”重命名为“vtk”,并用对向量“vtk”的引用代替对读取指令“R”中的向量“vt”的引用。
在一些示例中,对于包含在“PreAdd(R)”集合中的每个递归指令“S”(例如,每个写入指令“W”),递归加法器185C利用第二求和操作来生成与对应递归指令“S”相关联的聚集直到前一个迭代的加数的第二运行和。在一些示例中,利用指令“vsa2=RunningPreAdd(0,va, p1)”来实现第二求和操作。另外,递归加法器185C插入第二递归指令,第二递归指令将向量“vt”定义成等于向量“vt”和第二运行和之和(例如,取决于对应的标量递归操作采用“t=t+a”或“t=t-a”的形式,分别为“vtk=vtk+vya”或“vtk=vtk-vya”)。因此,示例递归加法器185C利用向量指令序列{“vya=RunningPreAdd(0, vz, p1); vtk=vtk+vya”或“vya=RunningPreAdd(0, vz, p1); vtk=vtk-vya”}来生成第二运行和与第二递归指令。
由递归加法器185C插入的指令序列补偿因从由图分析器140C(见图1C)创建的边缘列表移除的边缘造成的回路,以使得代码生成器120C可以将循环向量化(即,将标量循环转换成可并行迭代而不会对循环完整性造成不利影响的循环)。
在这一点,可以执行一个或多个优化技术,例如复制传播和公共子表达式消除或部分冗余度消除,以便进一步精细调谐/优化向量化代码。
示例选择器/广播器175C利用标量变量“t”的初始值来初始化向量“vt”中的每个元素(在进入向量循环之前)。在一些示例中,选择器/广播器175C通过插入例如“broadcast”指令(例如,“vt=Broadcast(t)”)来执行该操作。选择器/广播器175C对经受包含在计算机程序循环中的递归指令“S”的每个标量变量执行该初始化操作。示例选择器/广播器175C还插入向量“vt”的最后的掩码启用元素(在第一循环迭代的底部计算),该元素将在随后的向量迭代开始时插入到向量“vt”的每个元素。因此,在随后的向量迭代的输入处使用在初始向量迭代中计算的“vt”的最后的元素中的值(例如,利用在向量迭代的底部计算的向量“vt”的最后的元素来在下一个循环迭代的顶部处填充向量“vt”的每个元素)。在一些示例中,示例选择器/广播器175C通过插入“SelectLast”指令(例如,“vt=SelectLast(vt, p0)”)来选择向量“vt”的最后的值,其中“p0”是所有元素均设置成“真”的谓词掩码向量。在一些示例中,选择器/广播器175C还在进入循环之前插入广播指令,以便设置谓词掩码向量“p0”的元素。另外,在一些示例中,在进入循环之前,选择器/广播器175C设置向量“v1”的元素或将其清零。
在一些示例中,示例图生成器135C、示例图分析器140C、示例递归指令标识器145C、示例边缘标识器150C、示例边缘移除器152C和示例部分向量化工具155C在第一示例控制器125C的控制下操作。同样地,在一些示例中,示例向量代码转换器170C、示例选择器/广播器175C、示例向量重命名工具180C和示例递归加法器190C在第二控制器160C的控制下操作。
描述利用图5中示出的伪代码进行说明的示例计算机程序循环500,以便提供具有由递归操作/语句引起的循环依赖的循环的一个示例。在描述循环操作之后接着描述示例向量化系统110C如何进行操作以便将图5的计算机程序循环500向量化。
示例计算机程序循环500将变量“sum”设置成等于“0”(见行502),并定义循环迭代控制变量“i”(见行504)。一旦进入循环,在变量“sum”上执行第一读取指令“R1”(见行506)。如果等于“a[i]<K”的条件(例如,谓词“p1”)返回“真”(见行508),那么第一写入语句“W1”作为递归操作进行操作以便读取和写入到变量“sum”(见行510)(注意,在条件“p1”中使用的变量“K”与之前用于表示向量元素的“k”变量无关。)。否则,第二读取语句“R2”读取变量“sum”(见行514)。接着,如果等于“b[i]<K2”的谓词“p2”返回“真”(见行516),那么第二写入语句“W2”作为递归操作进行操作以便读取和写入变量“sum”(见行518)。最后,第三读取语句“R3”读取变量“sum”(见行522)。因此,如上所述,图5的循环500在语句“R1”处读取变量“sum”,然后在写入语句“W1”处基于谓词“p1”有条件地将第一值“a[i]”添加到变量“sum”,和/或在写入语句“W2”处基于谓词“p2”添加第二值“b[i]”。循环500还读取写入语句“W1”和写入语句“W2”的结果。因此,在循环500的一个迭代中计算的变量“sum”将在循环500的随后迭代中使用,并且用于计算变量“sum”的方法在每个循环中基于条件“p1”和“p2”改变。
利用图6的伪代码来说明代表图5的循环500的向量化版本的示例计算机程序循环600。在代码生成器120D创建向量化代码之前,示例分析器115D进行操作以便采用如上所述的方式转换代码。例如,图生成器生成图6的计算机程序循环的图,并且图分析器分析该图以便标识和创建循环边缘的列表。
如上所述,循环500在语句“W1”处将值有条件地添加到标量变量“sum”中,然后通过一个或多个语句“R1”、“W1”、“R2”、“W2”和“R3”在相同和/或随后循环迭代中读取该标量变量“sum”。因此,当在图5的程序循环500上操作时,图分析器140C在变量“sum”上标识从读取语句“R1”到写入语句“W1”的迭代内逆依赖边缘“A1_R1W1”,它规定语句“R1”在字典上排在写入语句“W1”之前。因此,变量“sum”上从写入语句“W1”到读取语句“R1”的流依赖边缘“F1_W1R1”是循环承载的字典反向流依赖。类似地,存在变量“sum”上从读取语句“R1”到写入语句“W1”以及从读取语句“R2”到写入语句“W2”的迭代内逆依赖边缘“A2_R1W2”、“A3_W1W2”、“A4_R2W2”,它们规定,读取语句“R1”、写入语句“W1”和读取语句“R2”在字典上排在写入语句“W2”之前。因此,变量“sum”上从写入语句“W2”到“R1”、“W1”和“R2”的流依赖边缘“F2_W2R1”、“F3_W2W1”和“F4_W2R2”的集合是循环承载的字典反向流依赖/边缘。这些流依赖和逆依赖“F1_W1R1”、“F2_W2R1”、“F3_W2W1”和“F4_W2R2”以及“A1_R1W1”、“A2_R1W2”、“A3_W1W2”和“A4_R2W2”共同在依赖图中造成回路。还存在由自流依赖以及递归操作“W1”和“W2”之间的流依赖造成的回路。另外,存在由“W1”和“W2”之间的输出依赖(称为“O1_W2W1”、“O2_W1W1”、“O3_W2W2”)造成的回路。常规编译器将不能将该循环向量化。
在图分析器140C标识和创建计算机程序循环500的依赖列表之后,示例递归指令标识器145C创建“RecurrenceSet(sum)”集合,并将该集合定义成包含递归指令/语句“{W1,W2}”。示例边缘标识器150C创建初始为空的将移除的边缘的集合“EdgesToRemove(sum)”。然后,倘若“RecurrenceSet(sum)”集合包含对应的写入语句“W1”和“W2”,但不包含对应的读取语句“R1”和“R2”,那么示例边缘标识器150C将操作数“sum”上从读取指令到写入语句的每个迭代内逆依赖边缘“A”添加到“EdgesToRemove(t)”集合。在循环500中,迭代内边缘“A1”、“A2”和“A4”分别对应于从“R1”到“W1”、从“R1”到“W2”以及从“R2”到“W2”的边缘,并且“RecurrenceSet(sum)”包含“W1”和“W2”,但不包含“R1”和“R2”。因此,边缘“A1”、“A2”和“A4”均添加到“EdgesToRemove(t)”集合。
如上所述,在一些示例中,边缘标识器150C创建初始为空的指令集合“PreAdd(R)”,以便包含读取语句“R”。为循环500中的每个读取指令“R”创建不同的“PreAdd(R)”集合(即,“PreAdd(R1)”和“PreAdd(R2)”)。示例边缘标识器150C将“W1”和“W2”添加到“PreAdd(R1)”,因为逆依赖迭代内边缘“A1_R1,W1”从“R1”延伸到“W1”,并且逆依赖迭代内边缘“(A2_R1,W2)”从“R1”延伸到“W2”。示例边缘标识器150C还将写入语句“W2”添加到“PreAdd(R2)”,因为逆依赖迭代内边缘“A4_R2,W2”从“R2”延伸到“W2”。
在图5的标量计算机程序循环500中,利用迭代内依赖边缘“A1”、“A2”和“A4”形成的每个路径经过“EdgesToRemove(sum)”集合中的边缘,从而使得部分向量化工具155C不应用部分向量化技术来移除这些边缘。
接着,边缘标识器150C从依赖图/边缘列表移除包含在“EdgesToRemove(t)”集合中的边缘,并且如果边缘的汇聚节点在“RecurrenceSet(t)”中,那么移除变量“sum”上的任何循环承载的逆依赖边缘。该操作导致从“EdgesToRemove(sum)”和边缘列表移除边缘“A1”、“A2”、“A3”和“A4”。
倘若语句“W1”和语句“W2”两者均在“RecurrenceSet(t)”中,那么示例边缘标识器120C还从依赖图/边缘列表移除变量”sum”上从语句“W1”到语句“W2”的每个循环承载的流和输出依赖边缘。该操作导致从依赖图/边缘列表中移除边缘“O1”、“O2”、“O3”、“F1”、“F2”、“F3”和“F4”。
由于循环中的所有回路由从边缘列表移除的一个或多个边缘形成,所以边缘标识器150C将标量计算机程序代码和边缘依赖信息提供给示例代码生成器120C以用于向量化。注意,在标量计算机程序循环500中存在额外边缘(依赖),这里不再论述。但是,这些边缘不会造成回路,从而不需要移除这些边缘来启用向量化。
参考图6,一旦接收到可向量化的代码,当示例代码转换器170C将标量循环变量转换成向量变量(例如,将“sum”转换成“vsum”,将“a[i]”转换成“vsa[i]”,并将“b[i]”转换成“vsb[i]”)时,示例代码生成器120C开始操作,初始化向量控制器迭代“i”以便控制向量化循环的迭代,并定义谓词“p1”和“p2”的集合以便代替控制第一写入语句“W1”和第二写入语句“W2”的执行的条件语句(见行608、610、612、614和616)。在进入循环之前,示例选择器/广播器175C初始化包括谓词向量“p0”的向量集合,并且通过递归加法器185C初始化向量“vzero”和向量“vsum”(见行602、604、606)。如图所示,将谓词“p0”的向量元素设置成“真”,并且选择器/广播器175C稍后使用谓词“p0”,如下文详细描述。还将向量“vzero”和“vsum”的元素设置成“假”,并且两者均在稍后供示例递归加法器185C使用以便确定变量“a[i]”和“b[i]”的运行和,这也将在下文更详细地描述。
为了确保正确的循环操作,示例重命名工具180C将在“R1”读取的向量“vsum”重命名为“vsum1”,并将在“R2”读取的向量“vsum”重命名为“vsum2”。在指令“R3”处读取的向量“vsum”的名称保持不变(见行624、632和638)。
在一些示例中,在示例代码转换器170C、示例选择器/广播器175C和示例重命名工具180C操作之后,示例递归加法器185C利用三个指令的序列(见行618-622)来计算由第一读取指令“R1”操作的向量“vsum1”(见行624)。序列中的第一个指令是“RunningPreAdd”指令(见行618),它在向量“va”和向量“vzero”上操作,以便计算聚集直到前一个迭代的向量“va”的掩码启用元素的运行和(即,“vsa”),其中掩码为“p1”。在每个向量迭代的第一循环迭代的执行期间,将聚集直到前一个迭代的 “va”的掩码启用元素的运行和 “vsa”设置成零,以使得在每个向量迭代中使用的“va”的第一个元素为零。
第二个示例指令是“RunningPreAdd”指令(见行620),它在向量“vb”和向量“vzero”上操作,以便计算聚集直到前一个迭代的向量“vb”的掩码启用元素的运行和(即,“vsb”),其中掩码为“p2”。注意,在每个向量迭代的第一循环迭代的执行期间,将聚集直到前一个迭代的“vb”的运行和设置成零,以使得在每个向量迭代中使用的“vb”的第一个元素为零(见行620)。
第二示例指令设置“vsum=vsum+vsa”(见行628),从而使得向量“vsum”中的值等于在前一个迭代的末端计算的向量“vsum”中的值加上在当前迭代中计算的向量“va”的屏蔽启用元素的运行和(即,“vsa”)。第三示例指令计算“vsum1”的值以等于为向量迭代的当前集合定义的向量“vsum”的值(向量迭代的初始集合见行606,并且向量迭代的稍后集合见行638、640)分别加上利用“RunningPreAdd”指令(见行622)计算的向量“va”和“vb”的掩码启用元素的运行和(即,“vas”和“vsb”)之和。注意,如上所述,递归加法器185C已经将在第一向量迭代期间使用的向量“vsum”的元素设置成零(见行606),并且在随后向量迭代中使用的向量“vsum”中的元素是从前一个向量迭代带过来的(见行622和640)。如上所述,示例递归加法器185C也将向量“vzero”的元素设置成零。这里,向量“vzero”代表在图4中所示的示例中描述的向量“v1”。
示例递归加法器185C还插入三个指令的第二序列(见行626-630)以便计算由第二读取指令“R2”操作的向量“vsum2”(见行632)。第二指令序列中的第一个指令是“RunningPostAdd”指令(见行626),它在向量“va”和向量“vzero”上操作,以便计算聚集直到当前迭代的向量“va”的掩码启用元素的运行和(例如,“vsa”),其中掩码为“p1”。
第二个示例指令设置“vsum=vsum+vsa”(见行628),从而使得向量“vsum”中的值等于在前一个迭代的末端计算的向量“vsum”中的值加上在当前迭代中计算的向量“va”的运行和(即,“vsa”)。第三个示例指令设置“vsum2=vsum+vsb”(见行630),从而使得向量“vsum2”中的值等于在前一个迭代的末端计算的向量“vsum”中的值加上在当前迭代中计算的向量“vb”的运行和。
示例递归加法器185C还插入两个指令的序列(见行634-636),以便计算在第三读取指令“R3”处读取的“vsum” 的值(见行638)。序列中的第一个指令是“RunningPostAdd”指令(见行634),它在向量“vsb”和向量“vzero”上操作,以便计算聚集直到当前迭代的向量“vb”的掩码启用元素的运行和,其中掩码为“p2”。
第二个示例指令(见行636)将“vsum”的值重新定义成等于“vsum”(在行630处定义)加上聚集直到当前迭代的向量“vb”的掩码启用元素的运行和(即,“vsb”)之和。
示例选择器/广播器在第三读取指令“R3”之后插入“SelectLast”指令(见行640),以便选择“vsum”的最后的掩码启用元素(如行636处定义)并将它广播给在下一个向量迭代中使用的向量“vsum”的每个元素。如上所述,在“SelectLast”指令中使用的谓词“p0”是启用所有位(即,所有元素均为“真”)的谓词掩码(见行602)。
具有交叉迭代存储器循环依赖的循环的向量化
图1D是配置成将具有交叉迭代存储器依赖的循环向量化的示例向量化系统110D的框图。当在循环的一个迭代中执行的存储器存取与在相同循环的前一个迭代中进行的存储器存取冲突时,存在交叉迭代存储器依赖。在一些示例中,示例分析器115D标识交叉迭代依赖边缘并从对应于循环的依赖图(例如,从利用依赖图创建的边缘列表)移除交叉迭代依赖边缘,并且示例代码生成器120D进行操作以便通过例如以下步骤来补偿所移除的边缘:执行存储器检查操作,以便标识可存取相同存储器(导致存储器冲突)的不同循环迭代;以及将向量循环分段或分区成可并行执行而不会导致不利循环结果的区块(例如,造成向量分区循环)。与利用执行固定次数的常规技术进行向量化的循环相比,向量分区循环基于循环中的动态变化的状况(例如,在循环中检测到存储器存取冲突)执行可变次数。在描述通过向量化系统110D执行的操作之前,如下简短描述向量分区循环如何操作。
例如,考虑这里示出的标量循环:
  for (i=0; i<N; i++)
      scalar_computation(i)
假设“scalar_computation”是可向量化的,那么可向量化的循环采用以下形式:
  for (i=0; i<N; i+=VL)
      vector_computation(i,min(i, i+VL-1))
在以上示例中,已经将“scalar_computation”转换成并行执行“scalar_computation”的多个迭代的“vector_computation”(并行执行的每个迭代集合称为向量迭代)。这里,基于与系统硬件相关联的向量长度“VL”的大小,并行执行的迭代数量(即,向量迭代的大小)是固定的。在每个向量迭代之后,标量迭代计数器“i”递增向量长度“VL-1”。
相比之下,部分向量化涉及通过引入称为向量分区循环(“VPL”)的内部循环来将单个向量迭代进一步动态地分区成可并行执行的更小部分(称为“区块”和/或“子分区”)。“VPL”可以采用以下形式:
for (i=0; i<N; i+=VL){
 start=i;
 do{//这是“VPL”循环
  divide=someRuntimeDependencyDetectionMechanism(some_input,…);
  //divide值是:start<=divide<=min(N, i+VL-1)
  vector(start, divide); //并行执行从位置start到divide的元素;
  start=divide+1;
 }while(start<min(N,i+VL));
}
在该示例中,将“VPL”表示为“do”循环,并且变量“divide”表示用于检测循环中由于依赖而无法并行执行迭代的点。在以上伪代码中,函数“someRuntimeDependencyDetectionMechanism (some_input,…)”用于(在运行时)检测无法并行执行的循环迭代。对于下文关于图7和8描述的示例向量化技术,依赖检测机制检测由存储器存取冲突造成的循环依赖。
在以上示例伪代码中,计算divide值导致标识意味着可并行执行的向量子分区元素的相连位置的点(由“start…divide”表示)。因此,如上所述,向量分区循环:1)将向量迭代划分(或分区)成由于彼此不依赖而可并行迭代的向量元素的子分区/区块,2)使得并行执行那些向量元素,3)更新起始位置以等于将并行执行的向量元素的下一个子分区/区块,以及4)继续进行以便通过分支回到“VPL”而并行执行向量元素的下一个区块。重复这些操作,直到不剩任何子分区。注意,包含“VPL”(内部循环)的外部循环将循环配置成执行固定数量的迭代,然后基于检测到循环依赖的迭代的数量执行“VPL”可变次数。因此,不同于处理固定数量的标量迭代或向量元素的传统向量化的循环,VPL处理可变数量的标量迭代。通过检查受到其它循环迭代的结果的不利影响的循环迭代来检测包含循环依赖的迭代数量。例如,具有可存取相同存储器位置的多个存储器存取指令的循环可能会导致在一个迭代中执行的存储器的存取和在另一个迭代中的相同存储器位置的存取之间的冲突。图1D的示例向量化系统通过在运行时期间针对存储器存取冲突检查循环操作来标识彼此依赖的迭代。在一些示例中,系统利用如下所述称为存储器检查指令的硬件指令来检查存储器存取冲突。
在一些示例中,图1D的示例向量化系统110D包括经由通信总线122D与示例代码生成器120D通信的示例分析器115D。在一些示例中,分析器115D包括经由通信总线130D耦合到示例图生成器135D、示例图分析器140D、示例边缘移除器145D和示例冲突标识器150D的示例第一控制器125D。在一些示例中,代码生成器120D包括经由通信总线165D耦合到示例代码转换器170D、示例循环分区器175D和示例冲突检查器180D的示例第二控制器160D。在一些示例中,第一控制器125B和第二控制器160D可以根据需要存取存储器190B以便在操作期间存储和/或检索信息。
示例分析器115D的组件执行操作以便将循环转换成可向量化的形式,然后将可向量化的代码提供给示例代码生成器120D。在一些示例中,示例分析器115D从示例代码提供器111A(见图1A)接收代表将向量化的标量循环的程序代码。为了将循环转换成可向量化的形式,分析器115D的示例图生成器135D生成代表将向量化的程序循环的依赖图,并且示例图分析器140D利用该图来标识和创建循环边缘的列表。然后,示例边缘移除器145D将程序循环标记为可向量化。对于依赖图中的每个依赖边缘“E”,示例边缘移除器145利用常规技术来确定边缘“E”是否是回路的一部分(即,循环依赖)。如果考虑中的边缘“E”不是回路的一部分,那么边缘移除器145D利用例如本文中所公开的其它技术中的任何技术来以将允许通过代码生成器120D将该边缘向量化的方式处理该边缘。所使用的技术基于例如将处理的边缘/依赖的类型来选择。
如果考虑中的边缘“E”是回路的一部分,并且边缘“E”是从语句“A”到语句“B”的具有单个方向(<)的存储器流、逆或输出依赖边缘,那么示例冲突标识器150D将语句“A”和“B”标识为是可使得在程序循环中出现冲突的指令/语句。在一些示例中,冲突标识器150D通过将语句“A”和语句“B”添加到冲突指令集合“C”中来执行该操作。接着,示例边缘移除器145D从由示例分析器135C标识的边缘列表移除该边缘“E”。对于包含在由示例图分析器140D标识的边缘列表中(即,存在于依赖图中)的其它边缘执行相同操作。然后,冲突标识器150D用符号“IN_VPL”来标记在通过移除任何边缘“E”而消除的回路中的所有程序指令。相反,如果无法消除/移除考虑中的依赖边缘“E”,那么示例边缘移除器145D确定循环不是可向量化的。在一些示例中,边缘移除器145D通过将循环标记为不可向量化来执行该操作。倘若循环是可向量化的(即,通过示例边缘移除器145D成功消除依赖边缘和相关联的回路),那么分析器115D将可向量化的代码提供给示例代码生成器120D。
当在代码生成器120D处接收可向量化的代码时,示例代码转换器170D通过诸如下列的方法将由示例分析器115D提供的标量计算机循环程序指令转换成向量指令:1)用对向量变量的引用代替对标量变量的引用,2)将标量代码中的条件语句换成谓词“p”,3)将有条件地执行的语句转换成屏蔽谓词操作,4)用向量迭代控制变量代替标量迭代控制变量,等等。
倘若循环是可向量化的(即,示例边缘移除器145D从对应的依赖图成功地消除与回路相关联的边缘),并且倘若由示例冲突标识器150D创建的冲突指令集合“C”不为空,那么示例循环分区器175D将循环分区,并将用符号“IN_VPL”标记到“VPL”中的指令放到分区中。
在一些示例中,示例冲突检查器180D接着在运行时分析可向量化的程序代码,以便标识将出现存储器冲突的循环迭代。例如,冲突检查器180D利用示例冲突检查指令来标识由于例如冲突存储器存取而取决于其它循环迭代的循环迭代。利用冲突检查指令的输出来控制分区的迭代。例如,如果冲突检查指令指示,可以在没有冲突的情况下执行循环迭代1、2和3的集合,而迭代4与迭代1冲突,那么冲突检查器180D将指示,下一个最早的冲突将出现在迭代4处。因此,循环分区器175D将使得“VPL”并行执行第一、第二和第三迭代。此外,如果冲突检查指令指示,第四和第五迭代可以并行执行,而第六迭代与第四迭代冲突,那么循环分区器175将使得“VPL”并行执行第四和第五迭代,依此类推。在一些示例中,利用冲突检查指令的输出作为谓词来控制“VPL”的操作,从而控制将通过“VPL”并行执行的迭代。
在一些示例中,示例冲突检查指令采用“CheckConflict(MemoryAddress(B),MemoryAddress(A), pB, pA)”的形式,其中“pA”是控制语句“A”的执行的谓词,而“pB”是控制语句“B”的执行的谓词。这里,语句“A”和语句“B”均是可存取相同存储器位置的存储器存取指令。“CheckConflict(MemoryAddress(B), MemoryAddress(A), pB, pA)”指令针对其中循环的不同迭代由于由语句“A”和语句“B”造成的存储器存取而冲突的示例检查程序循环。冲突检查器180D对于包含在冲突指令集合“C”中的每对指令(A, B)在“VPL”之前插入对应的“CheckConflict(MemoryAddress(B), MemoryAddress(A), pB, pA)”指令。
如果存在冲突存储器存取指令(例如,可存取相同存储器位置的存储器存取指令)的多于一个集合,那么示例冲突检查器180D插入冲突检查指令的集合,其中集合中的每个冲突检查指令对应于存取相同存储器位置的存储器存取指令集合之一。示例冲突检查器对包含在集合中的所有“CheckConflict”指令的结果执行逻辑“或”操作,以便动态地确定最早的下一个迭代冲突点,并利用逻辑“或”操作的输出作为谓词来控制“VPL”的执行。
在一些示例中,示例图生成器135D、示例图分析器140D、示例边缘移除器145D和示例冲突检查器150D在第一示例控制器125D的控制下操作。同样地,示例代码转换器170D、示例循环分区器175D和示例冲突检查器180D在第二控制器160D的控制下操作。
描述通过如图7所示的伪代码进行说明的示例计算机程序循环700,以便提供可如何利用图1D的示例向量化系统110D来将包含由存储器存取冲突引起的交叉迭代依赖的循环向量化的一个示例。在描述示例循环700如何操作之后接着描述图1D的示例向量化系统110D如何进行操作以便将计算机程序循环700向量化。
当将循环迭代的数量定义成受迭代计数器“i”控制时,示例计算机程序循环700开始(见行702)。如果谓词“p”(例如,(b[i]<FACTOR))为“真”(行704),那么执行读取语句“R”(见行706),然后执行写入语句W(见行708)。在该示例中,程序循环在标量“t”上具有从读取指令“R”到写入语句“W”的迭代内流和存储器依赖,并且存在从写入语句“W”到读取指令“R”的存储器流依赖(具有方向<)。因此,与示例计算机程序循环700相关联的依赖图具有将妨碍利用常规向量化技术(例如,如果没有更多的话,将标量变量转换成向量变量)来向量化的回路。
当示例图生成器135D生成代表计算机程序循环700的依赖图时,图1D的示例向量化系统110D开始将示例计算机程序700向量化。然后,示例图分析器140D利用该图来标识和创建包含标量变量“t”上从写入语句“W”到读取指令“R”的存储器流依赖边缘“F1”(具有方向<)的循环依赖(即,F1(W->R))与从读取语句“R”到写入语句“W”的迭代内流和存储器依赖(即,A(R->W)和F2(R->W))的列表。
示例边缘移除器145D将程序循环标记为可向量化。在图7的示例循环中,边缘F1是具有单个方向(<)的存储器流依赖边缘,并且是回路的一部分,从而使得示例冲突标识器150D将写入语句“W”和读取语句“R”标识为是可导致在程序循环中出现存储器存取冲突的语句,并使得将它们添加到冲突指令集合“C”中。接着,示例边缘移除器145D从由图分析器140D标识的边缘列表移除边缘“F1”。另外,示例冲突标识器150D用符号“IN_VPL”来标记在通过移除边缘“F1”而消除的回路中的指令(例如,“W”和“R”指令),以指示将把它们放到分好区的循环中。
现在,示例计算机程序循环700是可向量化的,并由示例分析器115D提供给示例代码生成器120D以便生成图8的向量化程序代码800。为了开始处理可向量化的代码,示例代码转换器170D通过诸如下列的方法将由示例分析器115D提供的计算机循环700的标量程序指令转换成向量指令:1)用对向量变量的引用代替对标量变量的引用,2)将标量代码中的条件语句换成谓词语句“p”,3)将有条件地执行的语句转换成屏蔽谓词操作,4)将标量循环迭代控制变量转换成向量循环控制迭代变量,等等。
示例循环分区器175D生成向量分区循环“VPL”,并将通过示例分析器115D用符号“IN_VPL”标记的指令放到“VPL”中(见行810-820)。这里,将读取语句“R”和写入语句“W”放在“VPL”中(见行814-815)。然后,冲突检查器180D在“VPL”之前插入“CheckConflict(b[i],I, p, p)”指令,其中谓词“p”等于“(b[i]<FACTOR)”(见行808-809)。利用CheckConflict指令的结果来标识存储器存取冲突的下一个最早示例,并利用下一个最早冲突点来生成“VPL”的屏蔽谓词(注意,在该示例中,只有一对指令可导致出现存储器存取冲突,从而使得在图8中表示的向量化程序代码中无需(并且没有)包含逻辑“或”操作。)。在图8的示例计算机程序循环800中,“divide=getNextDependence(dependences, start)”指令代表用于控制“VPL”的执行的屏蔽谓词。具体来说,(经由“VPL”)并行迭代来自跨越“start”到“divide”的范围的循环迭代,直到到达下一个冲突点,此时“VPL”的执行返回至“divide”指令(行812-813),并获得标识可并行执行的下一个迭代区块(即,“start+1”和“divide”之间的迭代)的信息,然后使得并行执行那些循环迭代。当“i”的值达到最大值时,退出“VPL”(见行804)。
具有由有条件执行的语句引起的交叉迭代循环依赖的
循环的向量化
图1E是配置成将具有从或到有条件执行的语句的循环承载的依赖(又称为动态交叉迭代依赖)的循环向量化的示例向量化系统110E的框图。当在一个迭代中执行的条件语句在随后执行的迭代中无条件地执行或者在随后执行的循环迭代中通过不同条件保护时,存在从/到有条件执行的语句的循环承载的依赖。
在一些示例中,示例向量化系统110E包括经由示例通信总线122E与示例代码生成器120E通信的示例分析器115E。示例分析器120E包括经由通信总线130E耦合到示例图生成器135E、示例图分析器140E、示例边缘移除器145E和示例边缘标识器150E的示例第一控制器125E。在一些示例中,代码生成器120E包括经由通信总线165E耦合到示例代码转换器170E、示例循环分区器175E、示例冲突检查器180E、示例传播器183E和示例选择器185E的示例第二控制器160E。在一些示例中,第一控制器125E和第二控制器160E可以根据需要存取存储器190E以便在操作期间存储和/或检索信息。
在一些示例中,示例分析器115B从示例代码提供器111A(见图1A)接收代表将向量化的标量循环的程序代码。分析器115E的示例图生成器135E生成依赖图,并且图分析器140E利用该图来标识和创建循环边缘的列表。然后,示例边缘移除器145E确定任何边缘是否是从语句“A”到语句“B”的具有单个方向(<)的流依赖边缘,其中在循环内有条件地执行依赖图的节点“A”和/或“B”的至少其中之一,并且移除边缘将从依赖图消除回路。如果示例边缘移除器145E确定循环中存在满足这些准则的边缘,那么示例边缘移除器145E从通过图分析器140E利用依赖图创建的边缘列表移除对应边缘,并且示例冲突标识器150D将与所消除的回路相关联的指令标识为冲突指令(例如,将与所消除的回路相关联的指令放到称为“IN_VPL”集合的指令集合中,该指令集合将放到向量分区中)。边缘移除器145E继续以所描述的方式处理循环中的边缘,直到处理完所有边缘为止。如果所有边缘均已处理完并且循环中不剩任何回路,那么将可向量化的代码提供给示例代码生成器120E以用于向量化。
如果通过示例边缘移除器145E处理的边缘“E”不满足上述准则,那么边缘移除器145E尝试利用其它边缘移除技术(适用时)(包括本文中所公开的任何技术)来处理边缘。如果所有这些技术均不成功,和/或如果在处理完所有边缘之后循环中还剩一个或多个回路,那么代码不是可向量化的,并且代码向量化系统110E停止操作。
当将可向量化的代码提供给代码生成器160E时,示例代码转换器170E通过诸如下列的方法将由示例分析器115E提供的标量计算机循环程序指令转换成向量指令:1)用对标量变量的向量版本的引用代替对标量变量的引用,2)将标量代码中的条件语句换成用于将包含在标量代码中的条件转换成向量谓词“p”的谓词语句,3)将有条件地执行的语句转换成屏蔽谓词操作,4)用向量循环控制变量代替标量循环控制变量“i”,等等。
示例循环分区器175E生成包含与所消除的回路相关联的所有语句(包括由边缘移除器145E标识的有条件执行的语句)(例如,放到IN_VPL中的指令“A”和“B”)的“VPL”。
然后,示例冲突检查器180E标识其中有条件执行的语句造成交叉迭代循环依赖的循环迭代。如上所述,有条件执行的语句由分析器115E的示例冲突标识器150E标识,并且可以包括有条件执行的语句“A”和有条件执行的语句“B”。条件冲突标识器180E可以使用例如硬件指令(例如,条件冲突标识指令)来标识可并行执行的迭代以及无法并行执行的迭代。在一些示例中,条件冲突标识指令采用“ConditionalPairStop(pB, pA)”指令的形式,其中通过谓词“pA”来控制语句“A”的执行,并通过谓词“pB”来控制语句“B”的执行。
在一些示例中,在定义谓词“pB”和“pA”之后,循环分区器175E放置条件冲突标识指令(例如,“ConditionalPairStop(pB, pA)”)。“ConditionalPairStop(pB, pA)”指令确定在有条件执行的语句“A”和“B”之间的实际动态交叉迭代依赖,并且在一些示例中,在将部分向量化的指令(例如,通过条件语句“A”和“B”有条件地控制的指令)之前将该指令放到对应“VPL”(例如,在条件语句“A”和“B”上操作的“VPL”)中。然后,示例分区器175E使用由条件冲突标识指令生成的输出来屏蔽有条件执行的语句(例如,语句“A”和/或语句“B”)。
在一些示例中,在分区器175E操作之后,倘若语句“A”有条件地执行,并且与语句“A”相关联的移除的边缘“E”在标量变量(例如,“r”)(或不取决于循环归纳标量的数组变量,其中循环归纳标量是在循环的每个迭代上增加或减小固定量的变量,或是另一个归纳变量的线性函数)上,那么示例传播器183E使得包含在向量“vr”中的“r”的值从其中谓词“pA”为“真”的向量元素到其中谓词“pA”为“假”的随后元素。另外,示例选择器185E选择向量“r”的最后的元素,并将该元素广播给整个向量。在一些示例中,传播器183E利用传播指令来引起传播操作,并且选择器185E利用“SelectLast”指令来选择将在下一个向量迭代中使用的值。利用传播器183E和选择器185E使得在一个向量迭代中计算的“r”的最后的值将在随后执行的向量迭代的每个循环迭代中用于初始化变量“r”。
在一些示例中,示例图生成器135E、示例图分析器140E、示例边缘移除器145E和示例冲突标识器150E在第一示例控制器125E的控制下操作。同样地,在一些示例中,示例代码转换器170E、示例循环分区器175E、示例条件冲突标识器180E、示例传播器183E和示例选择器185E在第二控制器160E的控制下操作。
还可参考利用图9中示出的伪代码进行说明的示例计算机程序循环900来进一步理解图1E的示例向量化系统110E的操作。计算机程序循环900包含由有条件执行的语句引起的循环依赖。在描述循环900的操作之后接着描述图1E的示例向量化系统110E如何将循环900向量化。
在图9的示例循环900中,定义计数器“i”以便控制对循环进行迭代的次数(见行902)。如果谓词为“真”(例如,(a[i]<FACTOR))(见行906),那么执行语句“A”(见行910)。如图9所示,语句“A”包括变量“r”(例如,“r=a[i+r]”)的读取“R”和写入“W”。因此,当执行时,如果对于循环的一个迭代“a[i]<FACTOR”适用,那么循环的这个迭代可以写入到变量“r”;并且如果条件“a[i]<FACTOR”适用,那么循环的随后执行的不同迭代可以读取“r”的该值(即,在第一个迭代中定义的“r”的值)。因此,在一个迭代中读取的“r”的值取决于在另一个迭代中定义(例如,写入)的“r”的值,从而造成使得至少一些迭代无法并行执行的交叉迭代依赖。在示例循环900中,交叉迭代依赖还是自流依赖,因为有条件执行的语句“A”取决于它本身(例如,在一些迭代中,语句“A”的执行与其它迭代中的语句“A”的执行冲突)。因此,对应依赖图中由循环承载的交叉迭代自流依赖造成的回路妨碍利用常规向量化技术(例如,如果没有更多的话,将标量变量转换成向量变量)来将这个(和类似的)循环向量化。
在一些示例中,向量化系统110E进行操作以便将图9的标量计算机程序循环900向量化,从而创建如图10所示的向量化循环1000。如上所述,示例分析器115E处理标量计算机程序循环900的边缘以使得能够将循环向量化,然后将可向量化的循环提供给示例向量代码生成器以用于向量化。
例如,示例图生成器135E创建依赖图,并且图分析器140E利用该图来标识和创建循环边缘的列表,该列表包括:1)从语句“A”到语句“A”的交叉迭代(<)流依赖边缘“F(W->W)),以及2)从语句“A”到语句“A”的迭代内和交叉迭代(<=)逆依赖边缘“A(R->W))”。这里,边缘“A(R->W))”是自逆依赖,并且因此可以忽略,因为向量操作默认地在写入它们的操作数的所有元素之前先读取所有这些元素,从而可以将代码向量化,而不管是否存在这种依赖。然后,示例边缘移除器145E从由图分析器140E标识的边缘列表移除边缘“F”。示例冲突标识器150E还向代码生成器标识作为将添加到“VPL”的指令的指令“A”。然后,示例分析器115E将可向量化的代码提供给示例代码生成器120E。
示例代码转换器170E将条件“if”语句(见图9的行906)转换成谓词语句“p”(见行1008),并将标量变量“r”转换成向量“vector(r)”(见行1008)。代码转换器170E还将标量迭代控制变量“i”转换成向量迭代控制变量(见行1002和1016)。示例分区器175E创建“VPL”(见行1006),并将有条件执行的语句“A”放到VPL中(见行1012)。示例分区器175E还将用于控制标量循环中的语句A的执行的谓词“p”放到向量循环1000中(见行1008)。然后,示例条件冲突标识器180E利用例如“ConditionalPairStop(p, p)”指令生成谓词(即,“divide”)(见行1010),并且分区器175利用该谓词来控制在每个向量迭代中并行执行的循环迭代的数量(见行1012和1013)。
在一些示例中,示例传播器183E利用水平传播指令来使得基于谓词“p”将有条件定义的向量“r”的向量元素传播给其它向量元素,并且示例选择器185E在循环的底部附近插入“SelectLast”指令(见行1014),以便选择在当前向量迭代中计算的“r”的最后的值并将该值广播给在随后向量迭代中使用的向量“vr”的所有元素。当例如在语句“A”中定义的变量“r”是标量变量时,示例传播器183E和选择器185E执行这些操作。
注意,在示例循环900中,语句“A”取决于它本身。因此,代替利用“ConditioanlPairStop(pA, pB)”形式的条件检查指令来标识冲突指令,冲突检查器180E利用“ConditionalPairStop(p, p)”形式的条件检查指令(见行1010),其中“p”是控制语句“A”的执行的谓词(见行906)。
具有由标量引用引起的迭代内逆依赖的循环的向量化
图1F是配置成将包含由标量引用引起的迭代内逆依赖的循环向量化的示例向量化系统110F的框图。如上所述,迭代内逆依赖是在相同迭代内操作的两个指令之间的依赖,其中第一指令取决于第二指令,并且第一指令在字典上排在第二指令之前。例如,在字典上在标量变量的读取语句之后紧跟相同标量变量的写入语句的循环具有来自读取语句和写入语句的迭代内逆依赖,因为较早执行的读取语句取决于稍后执行的写入语句。为了保持循环完整性,必须以使得写入标准在读取语句之前执行的方式将计算机程序向量化。在一些示例中,向量化系统110F包括经由通信总线122F与示例代码生成器120F通信的示例分析器115F。在一些示例中,示例分析器115F包括经由通信总线130F耦合到示例图生成器135F、示例图分析器140F和示例边缘移除器145F的第一示例控制器125F。在一些示例中,示例代码生成器120F包括经由通信总线165F耦合到示例代码转换器170F、示例指令复制器175F、示例重命名工具180F、示例传播器185F和示例选择器187F的示例第二控制器160F。在一些示例中,第一控制器125F和第二控制器160F可以根据需要存取存储器190F以便在操作期间存储和/或检索信息。
示例分析器115F从示例代码提供器111A(见图1A)接收代表将向量化的标量循环的标量计算机程序代码。分析器115F的示例图生成器135F创建标量循环的依赖图,并且示例图分析器140F利用该图来标识和创建与循环依赖相关联的边缘的列表。在一些示例中,边缘移除器145F创建称为“E”的集合,稍后将用来自由示例图分析器140F创建的依赖图/边缘列表的边缘来填充该集合“E”。当处理例如在标量变量“r”上具有从写入语句(例如,“W”)到一个或多个读取语句(例如,“R1”、“R2”、“R3”…“RN”)的流依赖的循环并且其中该循环还在变量“r”上具有从读取语句“R1”、“R2”、“R3”…“RN”到写入语句“W”的迭代内逆依赖时,边缘移除器145F将具有写入语句“W”作为汇聚节点的所有迭代内逆依赖循环边缘放到集合“E”中。边缘移除器145F还将包含在集合“E”中的边缘的所有源节点(例如,“R1”、“R2”…“RN”)放到称为“S”的节点/指令集合中。
示例边缘移除器145F确定正在处理的循环是否包含从写入语句“W”到第一读取语句“R1”的任何循环承载的流依赖边缘。如果不存在这样的依赖边缘,那么边缘移除器145F从节点集合“S”中移除第一读取语句“R1”,并且还从边缘集合“E”中移除从“R1”到“W”的对应边缘。边缘移除器145F对于包含在源节点集合“S”中的每个剩余源节点/指令(例如,“R2”、…、“RN”)重复这些操作。
然后,示例边缘移除器145F确定是否存在没有经过包含在集合“E”中的边缘的从源节点集合“S”中剩余的任何源节点到写入语句“W”的依赖路径。如果是,那么边缘移除器145F尝试利用任何其它技术(包括在本文中所描述的任何技术)以将允许向量化的方式在边缘中进行处理。如果没有一个边缘可成功消除,那么循环中剩余一个或多个回路,从而使得循环不是可向量化的,并且向量化系统110F停止操作。示例边缘移除器145F对于源节点/指令集合“S”中剩余的所有源节点/指令重复这些操作。
倘若循环是可向量化的(例如,可在所标识的每个依赖路径上成功地消除至少一个边缘),那么示例边缘移除器145F确定边缘集合“E”中是否剩余任何边缘。如果是,那么示例边缘移除器145F创建标识每个剩余边缘“E”、对应标量变量“r”、对应写入语句“W”和对应读取语句“R”的列表。示例边缘移除器145F将该列表提供给示例代码生成器120F以便在将标量计算机程序代码向量化时使用,如下所述。
代码生成器120F的示例复制器175F创建称为“Wcopy”的写入语句“W”的副本,并将“Wcopy”和“Wcopy”的依赖前身放置或升起在“R1”、“R2”、“R3”…“RN”语句上方。“Wcopy”的依赖前身是输出供语句“Wcopy”使用的值的语句。例如,用于有条件地控制“W”的执行的谓词“p”是语句“Wcopy”的依赖谓词,并且同样升起在语句“R1”、“R2”、“R3”…“RN”上方。如本文中所使用,术语“升起”是指选择指令/语句并将它们移动到或将它们放置在相对于其它循环指令/语句不同的位置的动作。创建“W”的副本并将“W”的副本(即,“Wcopy”)升起在读取指令“R1”、“R2”、“R3”…“RN”上方移除了“R”和“W”之间的逆依赖。
示例重命名工具180F将“Wcopy”的结果(即,循环变量“r”)重命名为“rcopy”,并用对“rcopy”的引用代替对“R1”、“R2”、“R3”…“RN”中的“r”的引用。然后,示例传播器185F使得基于控制“Wcopy”的执行的谓词传播“rcopy”的向量值。在一些示例中,传播器185F通过插入传播/移位指令(例如,“PropagateShift”指令)来传播“rcopy”的向量值。在一些示例中,“PropagateShift”指令采用“v2=PropagateShift(s, v1, p)”的形式,并且当谓词向量“p”的对应元素为“真”时将向量“v1”的元素向右移位一个位置,并且当谓词向量“p”的对应元素为“假”时,传播移位后的元素值。将标量“s”移位到所得向量的第一个元素中。举例来说,对于均包含八个元素的向量“v1”和“v2”,其中s=0,v1={1, 2, 3, 4, 5, 6, 7, 8},并且p={T, F, T, T, F, F, F, T},利用“PropagateShift”指令产生的向量“v2”包括元素{0, 1,1, 3, 4, 4, 4, 4}。因此,为了实现“rcopy”的传播和移位,传播器185F在“Wcopy”之后插入指令“rcopy=PropagateShift(lr, rcopy, p)”,其中“p”是用于执行传播移位操作的谓词掩码。
用“rcopy”代替对变量“r”的引用并且采用上述方式传播和移位“rcopy”的元素确保向量循环的对应读取语句读取在前一个循环迭代中定义的“r”的值,从而补偿存在于每个读取指令和写入指令之间的逆依赖。
另外,示例选择器187F选择当前迭代中的向量“r”的最后的元素(由谓词向量“p”确定),并且当利用“PropagateShift”指令时,使得利用所选择的元素作为将“移位到”向量“v1”中的值“s”。在一些示例中,示例选择器187F通过将指令“lr=SelectLastElement(r,p)”放在写入语句“W”之后来选择最后的元素。在一些示例中,选择器187F还在循环开始时初始化“r”的值(例如,设置“lr=r”)。
在一些示例中,示例图生成器135F、示例图分析器140F和示例边缘移除器145F在第一示例控制器125F的控制下操作。同样地,在一些示例中,示例指令复制器175F、示例重命名工具170F、示例传播器185F和示例选择器187F在第二控制器160F的控制下操作。
还可参考利用图11中示出的伪代码进行说明的示例计算机程序循环1100来进一步理解图1F的示例向量化系统110F的操作。计算机程序循环1100包含由循环1100内的标量引用引起的迭代内逆依赖。在描述循环1100的操作之后接着描述示例向量化系统110F如何进行操作以便将循环1100向量化。
图11的示例计算机程序循环1100通过将变量“last”设置成等于10(见行1102)、然后进入在变量“i”控制下迭代的循环(见行1104)而开始。在循环内,将变量“j”设置成等于变量“a[i]”(见行1106)。接着,当确定第一谓词p1(例如,“j<last”)保持为“真”时,执行变量“last”的第一读取操作“R1”(见行1108)。当基于谓词“p1”将变量“b[i]”的值设置成等于变量“last”的值时,执行变量“last”的第二读取操作“R2”(见行1110)。接着,定义第二谓词“p2”(例如,“(j<0)”)以便控制写入操作“W”的执行(见行1114)。取决于第二谓词“p2”是否保持为“真”,执行写入操作“W”(见行1116)。然后,返回“last”的值(见行1122)。因此,在当前循环迭代中在“R1”和“R2”处读取的标量变量“last”的值取决于在前一个循环迭代中在写入语句“W”处计算的标量变量“last”的值,从而在标量变量“last”上造成迭代内逆依赖。
将图11的计算机程序循环1100示为是利用图12中所示的伪代码的向量循环1200。当处理图11的循环1100时,示例图生成器135F为循环1100创建依赖图,并且示例图分析器140F利用该图来确定包括变量“last”上称为“A1”和“A2”的从“R1”到“W”和从“R2”到“W”的迭代内逆依赖边缘的循环边缘的列表。在该示例计算机程序循环1100中,读取语句“R1”和“R2”在字典上排在“W”之前。由图分析器140F创建的边缘列表还包括分别称为“F1”和“F2”的从“W”到“R1”和从“W”到“R2”的循环承载的字典反向流依赖。“F1”、“F2”、“A1”和“A2”共同在依赖图中造成无法利用常规向量化技术进行向量化的回路。
分析器115F的示例边缘移除器145F创建边缘集合“E”,用边缘“A1”和“A2”填充该集合,并将源节点“R1”和“R2”放到节点集合“S”中。然后,边缘移除器145F利用由示例图分析器140F标识的边缘列表来确定计算机程序循环1100是否包含从写入语句“W”到第一读取语句“R1”的任何循环承载的流依赖边缘。在该情形中,存在循环承载的流依赖边缘“F1”和“F2”,以使得示例边缘移除器145F继续进行以便确定是否存在不经过包含在集合“E”中的边缘的从集合“S”中剩余的任一源节点(例如,“R1”和“R2”)到写入语句“W”的依赖路径。在该情形中,不存在这样的依赖路径,从而使得示例边缘移除器145F创建标识边缘集合“E”中的每个边缘(例如,“A1”和“A2”)的列表,标识对应于每个边缘“E”的信息(例如,{“last”,“W”, “R1”, “A1”}和{“last”, “W”, “R1”, “A2”}),然后从依赖图移除这些边缘/从由图分析器140F创建的边缘列表移除这些边缘。计算机程序循环1100现在是可向量化的,并且示例边缘移除器145F将可向量化的循环1100和边缘列表提供给示例代码生成器120F。在一些示例中,在堆栈中将边缘列表和对应信息提供给代码生成器120F。
然后,代码生成器120F在现在可向量化的代码上操作,以便创建图12的向量化代码1200。在一些示例中,代码转换器170F将标量循环中的标量变量转换成向量变量(例如,将标量变量“j”转换成向量“vj”,将“a[i]”转换成向量,将“b[i]”转换成向量,将“last”转换成向量“vlast”,并将循环迭代控制变量“i”转换成向量迭代控制变量)(见行1204、1206、1216和1218)。另外,代码转换器170F将条件语句转换成谓词“p1”和“p2”(见行1208和1214)。在图11的标量计算机程序循环1100中,在进入循环之前,将标量变量“last”初始化为整数值“10”(见行1202)。因此,在向量计算机程序循环1200中,将标量变量初始化为整数值10(见行1202),因为没有通过示例代码生成器的代码转换器170F转换循环外部的计算机程序指令。
然后,示例复制器175F在读取指令“R1”和“R2”上方插入写入语句“W”的副本“Wcopy”(见行1210)。在该示例中,通过谓词向量“p2”来标记写入语句“W”。这里,通过将向量变量“vlast”设置成等于向量变量“vj”来构造写入语句的副本“Wcopy”,其中已经通过示例重命名工具180F将向量变量“vlast”重命名为“vlast1”(见行1210)。同样地,重命名工具180F将在标量循环110中由“R1”和“R2”读取的向量“vlast”重命名为向量循环1200中的向量“vlast1”,从而使得读取语句“R1”和“R2”(见行1214、1216)读取由“Wcopy”指令计算的重命名向量“vlast1”的值。此外,通过将“Wcopy”指令放在读取语句“R1”和“R2”上方,在读取语句之前,在当前循环迭代中定义由读取语句“R1”和“R2”读取的“vlast1”的向量值,从而消除写入语句“W1”与读取语句“R1”和“R2”之间的逆依赖。在“Wcopy”指令之后,示例传播器185F插入“PropagateShift”指令,以便基于谓词“p2”的值(以上述方式)移位或传播由写入语句的副本“Wcopy”计算的向量“vlast1”的元素(见行1212)。以此方式移位/传播“vlast1”的向量值使得为每个当前迭代计算(即,驻存在向量“vlast1”的每个元素/位置中)的“vlast1”的值等于在之前的迭代中计算的“vlast”的值。因此,由读取语句“R1”和“R2”读取的向量值是在之前的迭代中为“vj”计算的向量值。
最后,示例选择器187F在写入语句“W”之后插入“SelectLastElement”操作(见行1220),以便取决于谓词“p2”选择向量“vlast”的最后的元素,并使得在使用“PropagateShiftInstruction”时下一个迭代利用向量“vlast”的最后的元素作为将移位到“vlast1”的第一个元素中的标量值(见行1212)。另外,选择器在循环之前初始化“last”的值(见行1202)。
尽管图1A、1B、1C、1D、1E、1F中示出用于实现图1A的示例向量化系统110A的示例方式,但是图1A、1B、1C、1D、1E、1F中示出的一个或多个元件、进程和/或装置可以组合、划分、重新排列、省略、消除和/或以任何其它方式实现。此外,示例向量化系统110B、110C、110D、110E、110F、示例代码提供器111A、示例代码执行器112A、示例分析器115A、115B、115C、115D、115E、115F、示例代码生成器120A、120B、120C、120D、120E、120F、示例通信总线122B、122C、122D、122E、122F、130B、130C、130D、130E、130F、165B、165C、165D、165E、示例第一控制器125B、125C、125D、125E、125F、示例第二控制器160B、160C、160D、160E、160F、示例图生成器135B、135C、135D、135E、135F、示例图分析器140B、140C、140D、140E、140F、示例边缘移除器150B、152C、145D、145E、145F、示例代码转换器170B、170C、170D、170E、170F、示例谓词集合生成器145B、示例依赖检查器155B、示例递归指令标识器145C、示例部分向量化工具155C、示例边缘标识器150C、示例冲突标识器150D、150E、示例传播器175B、183E、185F、示例选择器/广播器175C、示例选择器185E、187F、示例递归加法器185C、示例重命名工具180C、180F、示例循环分区器、示例冲突检查器180D、180E、和/或示例复制器175F和/或更一般地图1A的示例向量化系统110A可以通过硬件、软件、固件和/或硬件、软件和/或固件的任意组合来实现。因此,例如,示例向量化系统110B、110C、110D、110E、110F、示例代码提供器111A、示例代码执行器112A、示例分析器115A、115B、115C、115D、115E、115F、示例代码生成器120A、120B、120C、120D、120E、120F、示例通信总线122B、122C、122D、122E、122F、130B、130C、130D、130E、130F、165B、165C、165D、165E、示例第一控制器125B、125C、125D、125E、125F、示例第二控制器160B、160C、160D、160E、160F、示例图生成器135B、135C、135D、135E、135F、示例图分析器140B、140C、140D、140E、140F、示例边缘移除器150B、152C、145D、145E、145F、示例代码转换器170B、170C、170D、170E、170F、示例谓词集合生成器145B、示例依赖检查器155B、示例递归指令标识器145C、示例部分向量化工具155C、示例边缘标识器150C、示例冲突标识器150D、150E、示例传播器175B、183E、185F、示例选择器/广播器175C、示例选择器185E、187F、示例递归加法器185C、示例重命名工具180C、180F、示例循环分区器175D、175E、示例冲突检查器180D、180E、和/或示例复制器175F和/或更一般地示例向量化系统110A中的任意一个都可以通过一个或多个模拟或数字电路、逻辑电路、可编程处理器、专用集成电路(ASIC)、可编程逻辑器件(PLD)和/或现场可编程逻辑器件(FPLD)来实现。当阅读本专利的任何设备或系统权利要求以便覆盖纯软件和/或固件实现时,示例向量化系统110A、110B、110C、110D、110E、110F、示例代码提供器111A、示例代码执行器112A、示例分析器115A、115B、115C、115D、115E、115F、示例代码生成器120A、120B、120C、120D、120E、120F、示例通信总线122B、122C、122D、122E、122F、130B、130C、130D、130E、130F、165B、165C、165D、165E、示例第一控制器125B、125C、125D、125E、125F、示例第二控制器160B、160C、160D、160E、160F、示例图生成器135B、135C、135D、135E、135F、示例图分析器140B、140C、140D、140E、140F、示例边缘移除器150B、152C、145D、145E、145F、示例代码转换器170B、170C、170D、170E、170F、示例谓词集合生成器145B、示例依赖检查器155B、示例递归指令标识器145C、示例部分向量化工具155C、示例边缘标识器150C、示例冲突标识器150D、150E、示例传播器175B、183E、185F、示例选择器/广播器175C、示例选择器185E、187F、示例递归加法器185C、示例重命名工具180C、180F、示例循环分区器175D、175E、示例冲突检查器180D、180E和/或示例复制器175F的至少其中之一由此明确地定义成包括用于存储软件和/或固件的有形计算机可读存储装置或存储盘,例如存储器、数字通用盘(DVD)、致密盘(CD)、蓝牙盘等。此外,除了或代替图1A、1B、1C、1D、1E和/或1F中示出的那些元件、过程和/或装置,图1A的示例向量化系统110A可以包括一个或多个元件、过程和/或装置,和/或可以包括多于一个所示的任何或所有元件、过程和装置。
图13、14A-14B、15A-15C、16A-16C、17A-17B、18A-18B、19A-19B、20A-20B、21A-21B和/或22A-22B中示出代表用于实现图1A、1B、1C、1D、1E和1F的向量化系统110A、110B、110C、110D、110E和110F的示例机器可读指令的流程图和伪代码。在该示例中,机器可读指令包括用于由处理器执行的程序,处理器可以是例如下文结合图23论述的示例处理器平台2300中示出的处理器2312。程序可以用存储在诸如CD-ROM、软盘、硬盘驱动器、数字通用盘(DVD)、蓝牙盘或与处理器2312相关联的存储器的有形计算机可读存储介质上的软件来实施,但是整个程序和/或其部分可以备选地通过处理器2312以外的装置来执行和/或在固件或专用硬件中实施。此外,尽管参考图13、14A-14B、15A-15C、16A-16C、17A-17B、18A-18B、19A-19B、20A-20B、21A-21B和22A-22B中示出的流程图和伪代码描述示例程序,但是可以备选地使用许多其它方法来实现示例向量化系统110A、110B、110C、110D、110E和110F。例如,这些框和/或伪代码行的执行顺序可以改变,和/或所描述的一些框可以改变、消除或组合。
如上所述,图13、14A-14B、15A-15C、16A-16C、17A-17B、18A-18B、19A-19B、20A-20B、21A-21B和22A-22B的示例过程可以利用存储在有形计算机可读存储介质上的编码指令(例如,计算机和/或机器可读指令)来实现,有形计算机可读存储介质可以是例如硬盘驱动器、闪速存储器、只读存储器(ROM)、致密盘(CD)、数字通用盘(DVD)、高速缓存、随机存取存储器(RAM)和/或其中存储信息历时任何持续时间(例如,延长的时间周期、永久地、短时间、用于临时缓冲和/或用于缓存信息)的任何其它存储装置或存储盘。如本文中所使用,术语“有形计算机可读存储介质”明确定义成包括任何类型的计算机可读存储装置和/或存储盘并排除传播信号。如本文中所使用,“有形计算机可读存储介质”和“有形机器可读存储介质”可互换使用。另外或备选地,图13、14A-14B、15A-15C、16A-16C、17A-17B、18A-18B、19A-19B、20A-20B、21A-21B和22A-22B的示例过程可以利用存储在非暂时性计算机和/或机器可读介质上的编码指令(例如,计算机和/或机器可读指令)来实现,非暂时性计算机和/或机器可读介质可以是例如硬盘驱动器、闪速存储器、只读存储器、致密盘、数字通用盘、高速缓存、随机存取存储器和/或其中存储信息历时任何持续时间(例如,延长的时间周期、永久地、短时间、用于临时缓冲和/或用于缓存信息)的任何其它存储装置或存储盘。如本文中所使用,术语“非暂时性计算机可读介质”明确地定义成包括任何类型的计算机可读装置或盘并排除传播信号。如本文中所使用,当使用短语“至少”作为权利要求的前序中的过渡项时,它以与术语“包括”为开放式的方式相同的方式为开放式。
可执行以便实现图1B的示例向量化系统110B的示例机器可读指令1300和1400由图13中示出的流程图1300以及图14A和14B中示出的伪代码1400表示。可以按间隔(例如,预定间隔)、基于事件(例如,预定事件)的发生等或其任意组合来执行示例机器可读指令1300和1400。在一些示例中,通过图1B的示例分析器115B和图1B的示例代码生成器120B执行的指令设计成使得能够通过以下方法来进行循环向量化:处理循环的造成回路的循环承载的逆和输出依赖边缘;然后通过对于与造成回路的依赖之一相关联的每个指令“S”(如下文所定义)插入水平传播指令来补偿所处理的边缘。
图13和14A-14B的示例机器可读指令1300和1400通过使得图1B的依赖图生成器135B生成依赖图开始,并且图1B的图分析器140B分析该图以便标识和创建循环边缘的列表(见图13的框1302)。在一些示例中,图1B的图分析器140B标识由有条件定义的标量变量引起的边缘。倘若存在任何这样的依赖边缘并且已经通过图1B的图分析器140B加以标识,那么谓词集合生成器145B将谓词集合与计算机程序循环中定义标量“J”的每个指令“S”相关联(见图13的框1304;图14A的行1406-1412)。在一些示例中,将谓词集合定义成“PredDefSet(S, J)”和“PredUseSet(S, J)”,并通过将“PredDefSet(S, J)”设置成等于“predicate(S)”而初始化,其中“predicate(S)”是控制对应指令“S”的执行的谓词。另外,将集合“PredUseSet(S, J)”初始化为空集合(见图13的框1304和图14A的行1406-1412)。
接着,图1B的示例边缘移除器150B从由图1B的示例图分析器130B标识的边缘列表移除与指令“S”相关联的边缘(见图13的框1306;图14A的行1418-1444)。在一些示例中,将向量化的循环包括基于第一谓词“p1”有条件地写入到标量变量“J”的写入语句“W1”和基于第二谓词“p2”有条件地写入到标量变量“J”的写入语句“W2”,并且还包括基于“p1”和“p2”执行的读取语句“R”。
对于这种类型的示例标量循环,图1B的边缘移除器150B进行操作以便从由图分析器140B标识的列表依赖边缘移除作为回路的一部分并且对标量逆依赖的每个循环承载的字典反向依赖边缘(例如,对于作为边缘“E”的汇聚的每个写入语句“W”和对于作为边缘“E”的源的每个读取指令“R”)。然后,图1B的边缘移除器150B将控制语句“R”的谓词“pR”添加到集合“PredUseSet(W, J)”(见图13的框1306;图14A的行1420-1430)。图1B的边缘移除器150B还从由图1B的图分析器140B创建的边缘列表移除作为回路的一部分并且对标量“J”输出依赖(而不是对标量逆依赖)的每个字典反向依赖边缘“E”(例如,写入语句“W1”是边缘“E”的汇聚,而写入语句“W2”是边缘“E”的源)(见图13的框1306;图14A的行1432-1434)。然后,图1B的边缘移除器150B将控制“pW1”的执行的谓词“pW1”添加到集合“PredDefSet(W2,J)”“pW1”(见图13的框1306;图14A的行1436)。在一些示例中,在执行所描述的操作之前,图1B的边缘移除器150B首先确定正在处理的标量循环是否包括循环承载的字典反向依赖和输出依赖(见图14A的行1424、1426、1432)。
如果边缘“E”不是回路的一部分,或者是回路的一部分但不是循环承载的字典反向边缘,那么图1B的示例边缘移除器150B尝试应用另一技术来处理依赖边缘“E”(见图13的框1306;图14A的行1442-1444)。
接着,图1B的示例依赖检查器155B确定由图1B的边缘移除器150B执行的边缘处理操作是否已经导致从图2的循环200消除(例如,从由图分析器140B创建的边缘列表消除)与回路相关联的所有边缘(见图13的框1308;图14A的行1410)。如果已经移除所有这些依赖边缘,那么示例代码生成器120B进行操作以便创建将向量化的循环的向量化版本(见图13的框1310;图14B的行1452)。在一些示例中,当代码转换器170B将标量循环控制变量(例如,“i”)转换成向量循环控制变量并通过例如用谓词“p”代替条件语句并将有条件执行的语句转换成屏蔽向量操作等来将标量循环中的语句转换成向量化语句时,图1B的向量代码生成器120B开始操作。另外,代码转换器用对变量“j”的向量(例如,“vj”)的引用代替对标量“j”的引用(见图13的框1310;图14B的行1452)。如果尚未消除与回路相关联的所有边缘,那么图1B的向量化系统110B停止操作。
图1B的示例传播器175B通过例如在定义标量的每个指令“S”之后插入“PropagatePostTrue”来基于谓词“p”传播向量“vj”的元素,其中相关联的“PredUseSet(S,J)”不是“PredDefSet(S, J)”的子集(例如,“J=PropagatePostTrue(J, PredDefSet(S,J))”)(见图13的框1312;图14B的行1454-1462)。在一些示例中,图1B的选择器180B接着在循环体的底部插入“SelectLast”指令(见图13的框1314;图14B的行1464)。在处理完所有指令“S”之后,由流程图1300和伪代码1400表示的示例机器可读指令使得图1B的示例向量化系统110B停止操作。
可执行以便实现图1C的示例向量化系统110C的示例机器可读指令1500和1600由图15A、15B和15C中示出的流程图1500以及图16A、16B和16C中示出的伪代码1600表示。可以按间隔(例如,预定间隔)、基于事件(例如,预定事件)的发生等或其任意组合来执行示例机器可读指令1500和1600。
在该示例中,通过图1C的示例向量化系统110C执行的机器可读指令设计成允许图1C的示例分析器115C和图1C的示例代码生成器120C通过以下方法来执行标量循环向量化:处理标量计算机程序循环的特定类型的迭代内逆依赖和循环承载的依赖;然后利用水平递归指令来补偿这些边缘。在该示例中,当图1C的示例图生成器135C生成对应于将向量化的循环的依赖图并接着将该图提供给图1C的示例图分析器140C时,机器可读指令开始,其中图1C的示例图分析器140C利用图来标识和创建循环边缘的列表(见图15A的框1501)。
图1C的示例递归指令标识器145C将“t=t+加数”或“t=t-加数”形式的每个指令“S”标记为是可向量化的递归操作,其中加数是常数或是不取决于标量变量“t”的变量表达式(见图15A的框1502;图16A的行1603)。另外,图1C的示例递归指令标识器145C创建包含指令“S”的称为“RecurrenceSet(t)”的指令集合,并且图1C的示例边缘标识器150C创建称为“EdgesToRemove(t)”的空的边缘集合(见图15A的框1504;图16A的行1604、1605)。
对于不为空的每个“RecurrenceSet(t)”,倘若“RecurrenceSet(t)”包含写入语句“W”但不包含读取语句“R”,那么图1C的示例边缘标识器150C将操作数“t”上从读取语句节点“R”(定义为边缘“A”的源节点)到写入语句“W”(定义为边缘“A”的汇聚节点)的每个迭代内逆依赖边缘“A”添加到集合“EdgesToRemove(t)”中(见图15A的框1506;图16A的行1607-1612)。另外,图1C的示例递归指令标识器145C创建集合“PreAdd(R)”并将它初始化为NULL集合(即,空集合)(见图15A的框1508;图16A的行1613)。
如果不存在可通过移除路径的边缘消除的从读取指令“R”到写入语句“W”的路径,那么示例递归指令标识器145C还将对于EdgesToRemove(t)集合中的从读取指令“Rcopy”到写入语句“W”的每个边缘设置“PreAdd(R)=Union(PreAdd(R), W)”。图1C的示例边缘移除器152C从依赖图移除EdgesToRemove(t)集合中的边缘(见图15A的框1510;图16B的行1632),并且如果变量“t”上的任何循环承载的依赖边缘是逆依赖边缘,且该边缘的汇聚节点在RecurrenceSet(t)集合中,那么移除该边缘(见图15A的框1510;图16B的行1633-1636)。示例边缘移除器152C还移除变量“t”上从第一写入语句“W1”(定义为源节点)到第二写入语句“W2”(定义为汇聚节点)的每个循环承载的流或输出依赖边缘,前提条件是写入指令“W1”和“W2”(例如,源节点和汇聚节点)均在RecurrenceSet(t)集合中(见图15A的框1510;图16B的行1637-1639)。
图1C的示例部分向量化工具155C尝试应用部分向量化技术来处理依赖图中从读取语句“R”(定义为源节点)到写入语句“W”(定义为汇聚节点)的路径上的边缘,其中这些路径利用不经过包含在集合“EdgesToRemove(t)”中的边缘“E”的迭代内依赖边缘构造而成(见图15B的框1512;图16A的行1616-1620)。如果无法移除任一边缘,那么示例边缘移除器152C从RecurrenceSet(t)集合移除写入语句“W”,并从“EdgesToRemove(t)”移除所有边缘(见图15B的框1514;图16A的行1623-1624)。如果RecurrenceSet(t)不为空,那么重复关于图15A和15B的框1506-1520描述的操作。
如果RecurrenceSet(t)为空,那么图1C的示例边缘移除器152C应用其它技术(适用时)来以将允许将循环向量化的方式处理依赖图中的任何剩余边缘/回路。倘若已经从对应的依赖图/边缘列表移除所有回路(见图15B的框1520;图16C的行1644),那么现在可以将循环向量化。如果没有移除所有回路(见图15A和15B的框1520和1534;图16C的行1644),那么循环不是可向量化的,并且机器可读指令1500和1600使得示例分析器115停止操作。
图1C的代码转换器170C通过例如用向量变量代替标量变量、用向量迭代控制变量代替标量迭代控制变量(见图15B的框1520)等将标量指令转换成向量指令(注意,图16A-16C的示例伪代码中没有示出该操作)。在一些示例中,对于位于RecurrenceSet(t)集合中的“t=t+a”或“t=t-a”形式的每个指令“S”,选择器/广播器175C通过例如插入“SelectLast”指令来选择在循环的底部计算的向量“vt”的最后的掩码启用值,并在循环的顶部将该掩码启用元素广播给向量“vt”的所有元素(见图15B的框1522;图16C的行1646-1649)。
接着,图1C的示例递归加法器180C利用序列{vsa1=RunningPostAdd(0, va, p1);vt=vt+va}(如果“S”是“t=t+a”的形式的话)和{vsa1=RunningPostAdd(0, va, p1); vt=vt-va}(如果“S”是“t=t-a”的形式的话)为位于RecurrenceSet(t)集合中的每个指令“S”生成求和向量(见图15B的框1524;图16C的行1650-1654)。这里,“p1”是向量代码中用于控制指令“S”的执行的谓词掩码。
对于具有非空“PreAdd(R)”集合的每个读取指令“R”,示例重命名工具180C在读取指令“R”之前添加指令“vtk=vt”,并在读取语句“R”中用引用“vtk”代替对“vt”的引用(见图15C的框1526;图16C的行1657-1659)。这里,“vtk”是为读取指令“R”生成的唯一名称。在一些示例中,对于PreAdd(R)”集合中的每个写入语句“W”,示例重命名工具180C在读取指令“R”之前插入指令(vsa2=RunningPreAdd(0, va, p1); vtk=vtk+va)或(vsa2=RunningPreAdd(0, va, p1); vtk=vtk-va) (见图15C的框1528;图16C的行1660-1665)。在一些示例中,在向量化操作之后执行常规优化技术,例如副本传播和公共子表达式消除或部分冗余度消除,以便使向量代码简化(见图15C的框1530),并且由机器可读指令表示的向量化过程结束。图1C的示例代码生成器120C还可标识具有相同“PreAdd”集合内容的多个指令,并注销除了这些指令中在字典上排在第一个的指令以外的那些指令,以便进一步优化代码。在这些示例中,在注销指令中,用对“vtk”的引用代替对“vt”的任何引用。
可执行以便实现图1D的向量化系统110D的示例机器可读指令1700和1800由图17A和17B中示出的流程图1700以及图18A和18B示出的伪代码1800表示。可以按间隔(例如,预定间隔)、基于事件(例如,预定事件)的发生等或其任意组合来执行示例机器可读指令1700和1800。
在该示例中,通过向量化系统110D执行的机器可读指令设计成使得能够将具有交叉迭代存储器依赖的循环进行循环向量化。在机器可读指令1700和1800开始操作之前,图生成器115D和图分析器120D已经分别生成正在分析的循环的依赖图并对该图进行分析以便标识和创建循环边缘的列表。当图1D的示例边缘移除器145D将将向量化的循环的指令标记为“可向量化”时,机器可读指令开始(见图17A的框1702;图18A的行1806),并且图1D的示例冲突标识器150D选择将处理的边缘“E”(见图17A的框1704;图18A的行1808),并确定所选择的边缘“E”是否是回路的一部分(见图17A的框1706;图18A的行1810)。如果边缘“E”不是回路的一部分,那么图1D的示例冲突标识器150D确定是否要处理其它依赖边缘“E”(见图17A的框1708;图18A的行1808)。如果存在更多边缘“E”,那么图1D的示例边缘移除器145D选择要处理的下一个边缘“E”(见图17A的框1704;图18A的行1808)。如果所有边缘“E”均已处理完,那么示例边缘移除器145D确定是否尚未从循环移除(即,从由图分析器140D创建的边缘列表移除)确定是回路的一部分的任何边缘(见图17A的框1710)。如果尚未移除所有这些边缘回路,那么循环不是可向量化的(见图17B的框1711;图18A的行1836),并且机器可读指令1700、1800使得图1D的向量化系统110D停止操作。
如果边缘“E”是回路的一部分,那么图1D的示例冲突标识器150D确定边缘“E”是否是从语句“A”到语句“B”的具有单个方向(<)的存储器流、逆或输出依赖边缘“E”(见图17A的框1712;图18A的行1814)。如果边缘“E”满足这些准则之一,那么示例冲突标识器150D将语句“A”和“B”添加到“冲突”指令集合(见图17A的框1714;图18A的行1818),并且图1D的示例边缘移除器145D从依赖图/边缘列表移除边缘“E”(见图17A的框1716;图18A的行1820)。图1D的示例冲突标识器150D将与所消除的回路相关联的所有指令放到称为“IN_VPL”集合的指令集合中,稍后将把“IN_VPL”集合放到“VPL”中(见图17A的框1718;图18A的行1822)。
如果图1D的示例冲突标识器150D确定边缘“E”不满足这些准则中的任何准则(见图17A的框1712;图18A的行1814),那么示例冲突检查器180D确定另一技术是否可用于处理边缘“E”(见图17A的框1720;图18A的行1826)。如果有另一技术可用,那么示例边缘移除器145D应用该技术来处理边缘“E”(见图17A的框1722;图18A的行1828-1830)。如果没有另一技术可用,那么图1D的示例冲突标识器150D确定循环不是可向量化的(见图17B的框1711),并且机器可读指令使得示例向量化系统110D停止操作。
在将与通过移除边缘“E”而消除的回路相关联的所有指令放到集合“IN_VPL”中(见图17A的框1718)之后,图1D的示例冲突标识器150D进行测试以便确定是否有更多边缘要处理(见图17A的框1708;图18A的行1808)。如果所有边缘均已处理完,那么图1的示例边缘移除器145D进行测试以便确定是否移除了所有回路(即,从边缘列表移除边缘是否进行了操作以便打破循环中的所有回路)(见图17A的框1710)。如果尚未移除所有回路,那么循环不是可向量化的(见图17B的框1711;图18A的行1836),并且机器可读指令使得图1D的示例向量化系统110D停止操作,如上所述。
如果已经移除所有回路,那么如上文关于图1D所描述,图1D的示例代码转换器170D将正在进行向量化的循环的标量指令转换成向量指令(见图17B的框1723;图18的示例伪代码中没有示出)。代码生成器130A的示例循环分区器175D生成“VPL”,并将包含在集合“IN_VPL”中的所有指令放到“VPL”中(见图17B的框1724;图18B的行1844)。然后,对于包含在“Conflict”指令集合中的每对指令“A”和“B”,示例冲突检查器180D在“VPL”之前插入对应的“CheckConflict”操作(见图17B的框1726;图18B的行1850-1854)。在一些示例中,冲突检查器180D在“CheckConflict”操作的结果上执行逻辑“或”操作以便动态地确定循环中的最早的下一个冲突点(见图17B的框1728;图18B的行1858-1862),并利用下一个最早的冲突点来生成用于控制“VPL”的执行的谓词(见图17B的框1730;图18B的行1858-1862)。在生成用于控制“VPL”的执行的谓词之后,机器可读指令使得示例向量化系统110D停止操作。
可执行以便实现图1E的向量化系统110E的示例机器可读指令1900和2000由图19A和19B中示出的流程图以及图20A和20B中示出的伪代码表示。可以按间隔(例如,预定间隔)、基于事件(例如,预定事件)的发生等或其任意组合来执行示例机器可读指令1900和2000。
通过图1E的向量化系统110E执行的机器可读指令设计成使得能够将具有可导致交叉迭代依赖的有条件执行的语句的标量计算机程序循环向量化。在执行指令之前,图1E的示例图生成器135E和图1E的示例图分析器140E已经进行操作以便生成图并对图进行分析以标识存在于标量计算机程序循环中的边缘(例如,创建边缘列表)。然后,机器可读指令使得图1E的示例边缘移除器145E将将向量化的循环的指令标记为“可向量化”(见图19A的框1904;图20A的行2006)。图1E的示例边缘移除器145E还选择要处理的边缘(见图19A的框1906;图20A的行2008),并确定边缘“E”是否是回路的一部分(见图19A的框1906;图20A的行2010)。如果边缘“E”不是回路的一部分,那么示例冲突标识器150E确定是否有更多边缘“E”要处理(见图19A的框1908;图20A的行2008)。如果存在更多边缘“E”,那么示例边缘移除器145E选择要处理的下一个边缘“E”(见图19A的框1904)。如果所有边缘“E”均已处理完,并且倘若已经移除了作为回路的一部分的所有边缘“E”,那么图1E的示例代码生成器120E继续进行以便将循环向量化,如下文参考图19A的框1923和图20B的行2042所描述。
如果所有边缘“E”均已处理完(利用下文参考图19A的框1912-1922和图20A的行2014-2034描述的示例技术),但是尚未从由图1E的示例图分析器140E标识的边缘列表移除作为回路的一部分的所有边缘“E”,那么循环中剩余一个或多个回路,并且图1E的边缘移除器145E使得将循环标记为不可向量化,并且指令使得图1E的向量化系统110E停止操作(见图19B的框1911;图20A的行2036)。
如果所选择的边缘“E”是回路的一部分(见图19A的框1906;图20A的行2010),那么图1E的示例边缘移除器145E确定边缘“E”是否是从语句“A”到语句“B”的具有单个方向(<)的流依赖边缘,其中“A”、“B”或两者在循环内有条件地执行(见图19A的框1912;图20A的行2014、2016)。如果图1E的边缘移除器145E确定满足这些条件,那么图1E的示例冲突标识器150E将语句“A”和“B”添加到“ConditionalPairStop”指令(CPS)集合(见图19A的框1914;图20A的行2018),并且图1E 的边缘移除器145E从依赖图移除边缘“E”(见图19A的框1916;图20A的行2020)。在一些示例中,冲突标识器150E将与所消除的回路相关联的所有指令放到称为“IN_VPL”集合的指令集合中(见图19A的框1918;图20A的行2022),稍后代码生成器将把“IN_VPL”放到“VPL”中。
如果图1E的示例边缘移除器145E确定边缘“E”不是上文所述的类型的流依赖边缘“E”(见图19A的框1912;图20A的行2014),那么图1E的示例边缘移除器145E确定是否可以利用另一技术来以将允许通过代码生成器将循环向量化的方式处理边缘“E” (见图19A的框1920;图20A的行2026)。如果有另一技术可用,那么示例边缘移除器145E对边缘“E”应用该技术(见图19A的框1922;图20A的行2028、2030)。如果不存在可用于处理边缘“E”的另一技术,那么示例边缘移除器145E确定循环不是可向量化的(见图19B的框1911),将循环标记为不可向量化(见图19B的框1911;图20A的行2036),并且机器可读指令使得示例向量化系统110E停止操作。
在处理完每个边缘之后,图1E的边缘移除器145E再次进行测试以便确定是否有更多边缘要处理(如上所述),并且如果没有,那么确定是否从依赖图移除所有回路。如上所述,如果图1E的示例边缘移除器145E确定已经成功处理边缘并从边缘列表移除边缘以使得所有循环回路被打破,那么将标量计算机程序循环提供给图1E的代码转换器170E,代码转换器170E通过用向量变量代替标量变量等来将标量循环指令转换成向量循环指令(见框1923;图20A和20B的示例伪代码中没有示出)。示例分区器175E生成包括包含在集合“IN_VPL”中的语句的“VPL”(见图19B的框1924;图20B的行2044)。然后,对于包含在冲突检查指令“CPS”集合中的每对语句“A”和“B”,图1E的冲突检查器标识器180E将诸如“ConditionalPairStop”指令的条件冲突检查指令插入到“VPL”中(见图19B的框1926;图20B的行2050-2054)。如上所述,“ConditionalPairStop”指令用于标识可并行执行的循环迭代。在一些示例中,图1E的条件冲突标识器180E进行测试以便确定语句“A”是否写入到标量变量“r”(见图19B的框1928;图20B的行2056)。如果语句“A”没有写入到标量变量“r”,那么示例分区器175E将包含在“VPL”中的有条件执行的指令(例如,语句“A”和语句“B”)转换成屏蔽指令(见图19B的框1934;图20B的行2072、2074)。如果语句“A”的确写入到标量变量“r”,那么图1E的示例传播器183E在语句“A”的向量指令之后插入水平传播指令,以便将“r”的向量化版本的值从其中语句“A”的谓词(例如,“pA”)为“真”的元素传播至其中谓词“pA”为“假”的连续元素(见图19B的框1930;图20B的行2064)。图1E的示例选择器185E在“VPL”之后插入“SelectLast”指令以便选择向量“vr”的最后的元素,并将它广播给向量“vr”的所有元素以便在下一个向量迭代中使用(见图19B的框1932;图20B的行2066)。然后,有形机器可读指令1900和2000使得图1E的向量化系统110E停止操作。
可执行以便实现图1F的向量化系统110F的示例机器可读指令2100和2200由图21A-21B中示出的流程图2100以及图22A和22B中示出的伪代码2200表示。可以按间隔(例如,预定间隔)、基于事件(例如,预定事件)的发生等或其任意组合来执行示例机器可读指令2100和2200。
通过图1F的示例向量化系统110F执行的示例操作设计成将具有由对循环内的标量变量的引用引起的循环承载的依赖的循环向量化。在一些示例中,图1F的示例图生成器135F和图1F的示例图分析器140F已经进行操作以便生成和分析依赖图,然后指令2100和2200开始,并使得图1F的示例边缘移除器145F创建和填充包含具有汇聚“W”的迭代内逆依赖边缘的边缘集合“E”。图1F的边缘移除器145F还创建和填充对于包含在“E”中的每个边缘包含源节点“R”的节点集合“S”(见图21A的框2102;图22A的行2208-2212)。示例边缘移除器145F为定义正在向量化的循环中的标量变量“r”的每个写入语句“W”创建集合“E”和“S”。
对于集合“S”中不存在从对应“W”节点到“R”节点的循环承载的流依赖边缘的每个节点“R”,示例边缘移除器145F从集合“S”移除读取指令“R”,并从边缘集合“E”移除对应的边缘“E(R->W)”(见图21A的框2104;图22A的行2214-2218)。
对于集合“S”中的每个节点“R”,图1F的示例边缘移除器145F尝试利用部分向量化来消除从节点“R”到节点“W”的任何依赖路径上不经过集合“E”中的边缘的边缘(见图21A的框2106;图22A的行2224-2230)。如果无法消除这种路径/回路上的任何边缘(见图21A的框2108;图22A的行2230),那么边缘移除器145F使得向量化系统110F停止操作(见图21A的框2109;图22A的行2232)。在一些示例中,边缘移除器145F还通过返回“FAILED TOVECTORIZE”消息来指示向量化失败(见图22A的行2232)。
在边缘集合“E”不为空的情况下,图1F的示例边缘移除器145F将关于“E”中的每个剩余边缘的信息(例如,{r, W, S, E})记录到堆栈上(见图21A的框2110;图22A的行2240、2242)。在一些示例中,通过将信息推送到称为“PropagateShiftCodeGeneration”的堆栈上来记录信息,然后边缘移除器145F从由图1F的图分析器140F创建的对应的依赖图/边缘列表移除所有边缘“E”。在一些示例中,边缘移除器145F尝试利用将允许将循环向量化的适用技术(包括本文中所公开的任何技术)来处理与标量计算机程序循环中剩余的回路相关联的任何剩余边缘(见图21B的框2212;图22A的行2250-2252)。如果有任何回路剩余,那么循环无法向量化(见图21B的框2115)。
接着,倘若与循环相关联的依赖图不包含任何回路,那么图1F的示例代码转换器170F继续进行以便通过例如用向量变量代替标量变量、用谓词代替条件等来将正在处理的标量循环转换成向量循环(见图21B的框2116;图22B的行2254-2258)。在一些示例中,对于“PropagateShiftCodeGeneration”堆栈中的每个(r, W, S, E),示例复制器165F创建称为“Wcopy”的写入语句“W”的副本,其中已经通过重命名工具180F将对“r”的任何引用重命名为“rcopy”(见图21B的框2118;图22B的行2260-2262)。另外,图1F的示例复制器175F将写入语句的副本Wcopy和它的依赖前身升起在由集合“S”表示的所有指令上(见图21B的框2120;图22B的行2264),并且在包含在集合“S”中的所有指令中,图1F的重命名工具180F用对“rcopy”的引用代替对“r”的所有引用(见图21B的框2122;图22B的行2266)。另外,图1F的示例传播器/移位器185F使得基于控制循环的标量版本中的向量“r”的谓词传播/移位重命名后的向量“rcopy”的值(见图21B的框2124;图22B的行2268、2270)。在一些示例中,示例传播器/移位器185F通过在指令“Wcopy”之后插入指令“rcopy=PropagateShift(lr, rcopy, p)”来执行向量传播/移位操作,其中p是在“Wcopy”中使用的谓词掩码。图1F的选择器187F插入指令“lr=SelectLastElement(r, p)”,以使得将在向量的最后的迭代中计算的“r”的值移位到下一个迭代中的“rcopy”中。在进入循环之前,图1F的选择器187F还初始化“r”的值(见图21B的框2124;图22B的行2272-2274)。然后,示例机器可读指令2100和2200使得图1F的代码生成器120F停止操作。
图23是能够执行图13、14A-14B、15A-15C、16A-16C、17A-17B、18A-18B、19A-19B、20A-20B、21A-21B和22A-22B的指令以便实现图1A、1B、1C、1D、1E和1F的设备的示例处理器平台2300的框图。处理器平台2300可以是例如服务器、个人计算机、移动装置(例如,蜂窝电话、智能电话、诸如iPadTM的平板计算机)、个人数字助理(PDA)、互联网器具、DVD播放器、CD播放器、数字视频记录器、蓝牙播放器、游戏控制台、个人视频记录器、机顶盒或任何其它类型的计算装置。
所示示例的处理器平台2300包括处理器2312。所示示例的处理器2312是硬件。例如,处理器2312可以由来自任何期望系列或制造商的一个或多个集成电路、逻辑电路、微处理器或控制器来实现。
所示示例的处理器2312包括本地存储器2313(例如,高速缓存)。所示示例的处理器2312经由总线2318与包括易失性存储器2314和非易失性存储器2316的主存储器通信。易失性存储器2314可以由同步动态随机存取存储器(SDRAM)、动态随机存取存储器(DRAM)、RAMBUS动态随机存取存储器(RDRAM)和/或任何其它类型的随机存取存储器装置实现。非易失性存储器2316可以由闪速存储器和/或任何其它期望类型的存储器装置实现。对主存储器2314、2316的存取由存储器控制器控制。
所示示例的处理器平台2300还包括接口电路2320。接口电路2320可以由任何类型的接口标准实现,例如以太网接口、通用串行总线(USB)和/或PCI express接口。
在所示示例中,一个或多个输入装置2322连接至接口电路2320。输入装置2322允许用户将数据和命令输入到处理器2312中。输入装置可以由例如音频传感器、麦克风、相机(静态或视频)、键盘、按钮、鼠标、触摸屏、跟踪板、跟踪球、isopoint和/或语音识别系统实现。
一个或多个输出装置2324也连接至所示示例的接口电路2320。输出装置2324可以由例如显示装置(例如,发光二极管(LED)、有机发光二极管(OLED)、液晶显示器、阴极射线管显示器(CRT)、触摸屏、触觉输出装置、发光二极管(LED)、打印机和/或扬声器)实现。因此,所示示例的接口电路2320通常包括图形驱动器卡、图形驱动器芯片或图形驱动器处理器。
所示示例的接口电路2320还包括便于经由网络2326(例如,以太网连接、数字订户线(DSL)、电话线、同轴电缆、蜂窝电话系统等)与外部机器(例如,任何种类的计算装置)交换数据的通信装置,例如传送器、接收器、收发器、调制解调器和/或网络接口卡。
所示示例的处理器平台2300还包括用于存储软件和/或数据的一个或多个大容量存储装置2328。这些大容量存储装置2328的示例包括软盘驱动器、硬盘驱动器、致密盘驱动器、蓝牙盘驱动器、RAID系统和数字通用盘(DVD)驱动器。
图13、14A-14B、15A-15C、16A-16C、17A-17B、18A-18B、19A-19B、20A-20B、21A-21B和22A-22B的编码指令2332可以存储在大容量存储装置2328中,存储在易失性存储器2314中,存储在非易失性存储器2316中,和/或存储在诸如CD或DVD的可移动有形计算机可读存储介质上。
从上文将明白,上文所公开的方法、设备和制品允许将具有循环承载的依赖的标量计算机程序循环向量化,从而消除手动执行该向量化的需要。此外,上文所公开的方法、设备和制品利用计算机程序代码、应用和/或服务,包括与可在具有支持对具有运行时数据依赖的循环进行推测性向量化的硬件/软件的体系结构(例如,MacroscalarTM或类似体系结构)中使用的计算机语言相关联的计算机代码,以便执行该向量化。上文所公开的方法、设备和制品还允许标识运行时循环依赖并消除这些依赖,从而使得能够将标量计算机程序循环向量化。
本文中所公开的示例方法包括生成与第一标量计算机程序指令相关联的第一谓词集合,其中第一谓词集合包含使得在标量计算机程序中在第一标量计算机程序指令处或之前定义标量变量的谓词。该示例还包括生成与第一标量计算机程序指令相关联的第二谓词集合,其中第二谓词集合包含使得在标量计算机程序循环中在第一标量计算机程序指令之后使用标量变量的谓词。一些示例方法还包括:确定第二谓词集合是否是第一谓词集合的子集;以及响应于确定第二谓词集合不是第一谓词集合的子集,将向量的元素中的值传播给向量的随后元素。在一些这样的示例方法中,通过将标量变量转换成向量变量来形成向量。
一些示例方法还包括:将控制第一标量计算机程序指令的执行的第一谓词添加到第一谓词集合;并将第二谓词集合初始化为空集合。一些示例方法另外包括将控制第二标量计算机程序指令的执行的第二谓词添加到第二谓词集合。
一些示例方法包括确定第一标量计算机程序指令和第二计算机程序指令之间的边缘是否是标量变量上的循环承载的字典反向逆依赖边缘。如果确定该边缘是标量变量上的循环承载的字典反向逆依赖边缘,那么将控制第二标量计算机程序指令的执行的第二谓词添加到第二谓词集合。
一些示例方法还包括将控制第二标量计算机程序指令的执行的第二谓词添加到第一谓词集合。示例方法还可包括确定第一标量计算机程序指令和第二计算机程序指令之间的边缘是否是标量变量上的输出依赖边缘。在一些示例方法中,如果确定该边缘是输出依赖边缘,那么将控制第二标量计算机程序指令的执行的第二谓词添加到第一谓词集合。在一些示例中,利用传播指令来传播该值。一些示例方法包括:将对应于第一标量计算机程序指令的标量指令转换到向量计算机程序指令中;以及在该向量计算机程序指令之后插入传播指令。
在一些示例方法中,所传播的值是第一值,而元素是第一元素,并且方法还包括:在第一迭代中,从向量中的第二元素选择第二值;以及在第二迭代中,用所选择的第二值填充向量的所有元素。在一些示例方法中,第二元素是向量中的最后的元素。在一些示例中,基于第一谓词传播该值。
本文中所公开的一些示例系统包括用于生成与第一标量计算机程序指令相关联的第一谓词集合的谓词集合生成器,其中第一谓词集合包含使得在第一标量计算机程序指令处或之前定义标量变量的谓词。谓词集合生成器还生成与第一标量计算机程序指令相关联的第二谓词集合。第二谓词集合包含使得在第一标量计算机程序指令之后使用标量变量的谓词。一些示例系统还包括传播器,用于:确定第二谓词集合是否是第一谓词集合的子集;以及响应于确定第二谓词集合不是第一谓词集合的子集,将向量的元素中的值传播给向量的随后元素。向量通过将标量变量转换成向量变量而形成。
在一些示例系统中,谓词集合生成器还将控制第一标量计算机程序指令的执行的第一谓词添加到第一谓词集合,并将第二谓词集合初始化为空集合。一些示例系统还包括边缘移除器,用于将控制第二标量计算机程序指令的执行的第二谓词添加到第二谓词集合。在一些示例系统中,边缘移除器将确定第一标量计算机程序指令和第二计算机程序指令之间的边缘是否是标量变量上的循环承载的字典反向逆依赖边缘。如果确定该边缘是标量变量上的循环承载的字典反向逆依赖边缘,那么边缘移除器将控制第二标量计算机程序指令的执行的第二谓词添加到第二谓词集合。在一些示例中,边缘移除器将控制第二标量计算机程序指令的执行的第二谓词添加到第一谓词集合。
一些示例系统包括边缘移除器,用于确定第一标量计算机程序指令和第二计算机程序指令之间的边缘是否是标量变量上的输出依赖边缘。如果确定边缘是输出依赖边缘,那么边缘移除器将控制第二标量计算机程序指令的执行的第二谓词添加到第一谓词集合。
在一些示例系统中,传播器利用传播指令来传播该值,并且传播器在通过将第一标量计算机程序指令转换成向量指令而形成的向量指令之后插入传播指令。在一些示例中,传播值是第一值,而元素是第一元素,并且系统还包括选择器,用于在第一迭代中从向量中的第二元素选择第二值,并在第二迭代中用所选择的值填充向量的所有元素。在一些示例中,第二元素是向量中的最后的元素。
本文中所公开的一些示例有形机器可读存储介质包括机器可读指令,这些指令使得机器生成与第一标量计算机程序指令相关联的第一谓词集合。第一谓词集合将包含使得在第一标量计算机程序指令处或之前定义标量变量的谓词。指令还使得机器生成与第一标量计算机程序指令相关联的第二谓词集合。第二谓词集合将包含使得在第一标量计算机程序指令之后使用标量变量的谓词。在一些示例中,指令还使得机器确定第二谓词集合是否是第一谓词集合的子集。响应于确定第二谓词集合不是第一谓词集合的子集,指令使得机器作为响应将向量的元素中的值传播给向量的随后元素。在一些示例中,向量通过将标量变量转换成向量变量而形成。
在本文中所公开的一些示例中,指令还使得机器将控制第一标量计算机程序指令的执行的第一谓词添加到第一谓词集合,并将第二谓词集合初始化为空集合。指令还使得机器将控制第二标量计算机程序指令的执行的第二谓词添加到第二谓词集合。在一些示例中,指令还使得机器确定第一标量计算机程序指令和第二计算机程序指令之间的边缘是否是标量变量上的循环承载的字典反向逆依赖边缘。如果确定边缘是标量变量上的循环承载的字典反向逆依赖边缘,那么指令还使得机器将控制第二标量计算机程序指令的执行的第二谓词添加到第二谓词集合。
在一些示例中,指令还使得机器将控制第二标量计算机程序指令的执行的第二谓词添加到第一谓词集合。指令还使得机器确定第一标量计算机程序指令和第二计算机程序指令之间的边缘是否是标量变量上的输出依赖边缘,并且如果确定边缘是输出依赖边缘,那么将控制第二标量计算机程序指令的执行的第二谓词添加到第一谓词集合。
在一些示例中,指令使得机器利用传播指令来传播该值,将对应于第一标量计算机程序指令的标量指令转换到向量计算机程序指令中,并在向量计算机程序指令之后插入传播指令。
在一些示例中,所传播的值是第一值,而元素是第一元素,并且指令还使得机器从向量中的第二元素选择第二值(该第二值在第一迭代中选择),并在第二迭代中用所选择的第二值填充向量的所有元素。第二元素是向量中的最后的元素。在一些示例中,基于第一谓词传播该值。
本文中所公开的一些示例方法包括:响应于接收到标量计算机程序循环,用第一向量求和操作和第一向量递归操作代替标量计算机程序循环中的标量递归操作。第一向量求和操作将生成第一运行和,而第一向量递归操作将生成第一向量。第一向量递归操作基于标量递归操作。一些示例方法还包括:插入重命名操作以便重命名第一向量;插入第二向量求和操作以便生成第二运行和;以及插入第二向量递归操作以便基于重命名的第一向量生成第二向量。
在一些示例方法中,第一向量递归操作将第一向量定义成基于第一向量和第一运行和,而第二向量递归操作将重命名的第一向量定义成基于重命名的第一向量和第二运行和。一些示例方法还包括用对重命名的向量的引用代替对读取操作中的第一向量的引用,其中读取操作读取重命名的向量。
在一些示例方法中,在读取操作之前插入第二向量递归操作。在一些示例中,标量递归操作基于加数,第一运行和是第一求和向量,而第二运行和是第二求和向量。第一求和向量的每个向量元素包含聚集直到当前迭代的加数值的运行和,并且第二求和向量中的每个向量元素包含聚集直到前一个迭代的加数值的运行和
一些示例方法包括:在当前向量迭代中,选择第一向量的最后的元素中的值;以及在随后迭代中,用所选择的值填充第一向量的元素。一些示例方法还包括标识标量计算机程序循环中从读取操作到标量递归操作的依赖边缘,其中标量递归操作是写入操作。另外,示例方法包括:如果写入操作在与标量计算机程序循环相关联的标量递归操作的集合中,并且读取操作不在递归操作的集合中,那么将依赖边缘添加到将从与标量计算机程序循环相关联的边缘列表移除的依赖边缘集合中。
在一些示例方法中,标量递归操作是第一标量递归操作,并且方法还包括标识标量计算机程序循环中从第一标量递归操作到第二标量递归操作的依赖边缘,其中第一和第二标量递归操作是写入操作。
本文中所公开的一些示例系统包括递归加法器,它用第一向量求和操作和第一向量递归操作来代替标量计算机程序循环中的标量递归操作。第一向量求和操作将生成第一运行和,而第一向量递归操作将生成第一向量。将标量递归操作进行转换以便形成第一向量递归操作。在一些示例中,递归加法器还插入第二向量求和操作以便生成第二运行和,并插入第二向量递归操作以便生成第二向量。一些示例系统还包括用于重命名第一向量的重命名工具,其中第二向量递归操作基于重命名的第一向量。
在一些示例系统中,第一向量递归操作将第一向量定义成基于第一向量和第一运行和,而第二向量递归操作将重命名的第一向量定义成基于重命名的第一向量和第二运行和。在一些这样的示例系统中,递归加法器在向量读取操作之前插入第二求和向量操作和第二向量递归操作,并用对重命名的向量的引用代替对向量读取操作中的第一向量的引用。向量读取操作读取重命名的向量。
在一些示例系统中,标量递归操作基于加数,第一运行和是第一求和向量,而第二运行和是第二求和向量。第一求和向量的每个向量元素包含聚集直到当前迭代的加数值的运行和,并且第二求和向量中的每个向量元素包含聚集直到前一个迭代的加数值的运行和。
一些示例系统包括边缘移除器,用于标识标量计算机程序循环中从读取操作到标量递归操作的依赖边缘,其中标量递归操作是写入操作。在一些示例中,如果写入操作在与标量计算机程序循环相关联的标量递归操作的集合中,并且读取操作不在递归操作的集合中,那么边缘移除器还将依赖边缘添加到与标量计算机程序循环相关联的依赖边缘集合中。在一些示例中,边缘移除器应用部分向量化技术来打破标量计算机程序循环中的回路。如果部分向量化技术没有成功打破回路,那么边缘移除器从依赖边缘集合移除依赖边缘,并从标量递归操作的集合移除写入操作。
在一些示例系统中,标量递归操作是第一标量递归操作,并且系统还包括用于标识标量计算机程序循环中从第一写入指令到第二写入指令的依赖边缘的边缘移除器。如果第一和第二写入指令均包含在与标量计算机程序循环相关联的递归操作的集合中,那么边缘移除器从与标量计算机程序循环相关联的依赖边缘列表中移除依赖边缘。
本文中所公开的一些示例有形机器可读存储介质包括机器可读指令,这些指令使得机器:响应于接收到标量计算机程序循环,用第一向量求和操作和第一向量递归操作代替标量计算机程序循环中的标量递归操作。第一向量求和操作将生成第一运行和,而第一向量递归操作将生成第一向量。第一向量递归操作基于标量递归操作。指令还使得机器插入第二向量求和操作。第二向量求和操作将生成第二运行和。在一些示例中,指令还使得机器插入第二向量递归操作以便生成第二向量并重命名第一向量,第二向量递归操作基于重命名的第一向量。
在一些示例中,第一向量递归操作将第一向量定义成基于第一向量和第一运行和,第二向量递归操作将重命名的第一向量定义成基于重命名的第一向量和第二运行和,并且在读取重命名的向量的向量读取操作之前插入第二求和向量操作和第二向量递归操作。在一些示例中,用对重命名的向量的引用代替对向量读取操作中的第一向量的引用。在一些示例中,标量递归操作基于加数,第一运行和是第一求和向量,而第二运行和是第二求和向量。第一求和向量的每个向量元素包含聚集直到当前迭代的加数值的运行和,并且第二求和向量中的每个向量元素包含聚集直到前一个迭代的加数值的运行和。
在一些示例中,指令还使得机器标识标量计算机程序循环中从读取操作到标量递归操作的依赖边缘,其中标量递归操作是写入操作。如果写入操作在与标量计算机程序循环相关联的标量递归操作的集合中,并且读取操作不在标量递归操作的集合中,那么指令使得机器将依赖边缘添加到与标量计算机程序循环相关联的依赖边缘集合中。指令使得机器应用部分向量化技术来移除标量计算机程序循环中的回路。如果部分向量化技术没有成功打破回路,那么指令使得机器从依赖边缘集合移除依赖边缘,并从标量递归操作的集合移除写入操作。
一些示例指令使得机器标识标量计算机程序循环中从第一写入指令到第二写入指令的依赖边缘。如果第一和第二写入指令均包含在与标量计算机程序循环相关联的标量递归操作的集合中,那么指令使得机器从标量计算机程序循环的依赖边缘列表移除依赖边缘。
本文中所公开的一个示例方法包括:在运行时,标识由于冲突标量循环操作的集合而无法与第二循环迭代并行执行的第一循环迭代,第一循环迭代在第二循环迭代之后执行。该方法还包括将向量循环分段成包括第一向量分区的向量分区,第一向量分区并行执行连续循环迭代,连续循环迭代在较早的循环迭代处开始,并在冲突循环迭代之前结束。
在一些示例方法中,连续循环迭代是连续循环迭代的第一集合,并且向量分区包括用于并行执行连续循环迭代的第二集合的第二向量分区。连续循环迭代的第二集合在第一循环迭代处开始,并在第三循环迭代之前结束。在一些示例方法中,包含在连续循环迭代的第一集合中的第一数量的连续循环迭代不同于包含在连续循环迭代的第二集合中的第二数量的连续循环迭代。在一些示例方法中,将向量循环分段成向量分区包括生成向量分区循环,向量分区循环基于谓词执行。在一些示例方法中,在进入向量分区循环之前标识第一循环迭代,并且在一些示例方法中,在外部循环内执行的内部循环中执行向量循环的分段。在一些示例方法中,冲突操作存取相同存储器位置。
在一些示例方法中,冲突操作包括第一有条件执行的语句和第二有条件执行的语句,并且第一和第二有条件执行的语句造成交叉迭代依赖。一些示例方法还包括通过将与第一操作和第二操作相关联的程序指令的集合放到向量分区循环中来补偿第一操作和第二操作之间的存储器流依赖。
本文中所公开的一个示例系统包括冲突检查器,用于在运行时标识由于冲突操作而无法与第二循环迭代并行执行的第一循环迭代,其中第一循环迭代在第二循环迭代之前执行。该系统还包括用于将向量循环分段成包括第一向量分区的向量分区的分区器。第一向量分区将并行执行连续循环迭代,并且连续循环迭代在第二循环迭代处开始,并在第一循环迭代之前结束。在一些示例系统中,连续循环迭代是连续循环迭代的第一集合,并且向量分区还包括用于并行执行连续循环迭代的第二集合的第二向量分区。连续循环迭代的第二集合在第一循环迭代处开始,并在第三循环迭代之前结束。在一些示例系统中,包含在连续循环迭代的第一集合中的第一数量的连续循环迭代不同于包含在连续循环迭代的第二集合中的第二数量的连续循环迭代。
在一些示例系统中,分区器通过生成向量分区循环来将向量循环分段成向量分区,向量分区循环基于谓词执行。在一些示例系统中,在进入向量分区循环之前,冲突检查器标识第一冲突循环迭代。在一些示例中,分区器在外部循环内执行的内部循环中将向量循环分段。
在一些示例系统中,冲突操作存取相同存储器位置,并且在一些示例系统中,冲突操作包括第一有条件执行的语句和第二有条件执行的语句,其中第一和第二有条件执行的语句造成交叉迭代依赖。一些示例中,冲突操作包括造成存储器流依赖的第一操作和第二操作。
在一些示例中,分区器通过生成向量分区循环来将向量循环分段,并且冲突操作包括由第一标量指令执行的第一标量操作和由第二标量指令执行的第二标量操作。在一些这样的示例中,由分区器执行的分段通过将与第一标量指令和第二标量指令相关联的向量计算机程序指令的集合放到向量分区循环中来补偿第一标量指令和第二标量指令之间的存储器流依赖。
本文中所公开的一些示例有形机器可读存储介质包括机器可读指令,这些指令使得机器在运行时标识由于冲突标量循环操作的集合而无法与第二循环迭代并行执行的第一循环迭代。第一循环迭代在第二循环迭代之后执行。指令还使得机器将向量循环分段成包括第一向量分区的向量分区,第一向量分区并行执行在第二循环迭代处开始并在第一循环迭代之前结束的连续循环迭代。在一些示例中,连续循环迭代是连续循环迭代的第一集合,并且向量分区包括用于并行执行在第一循环迭代处开始并在第三循环迭代之前结束的连续循环迭代的第二集合的第二向量分区。
在一些示例中,包含在连续循环迭代的第一集合中的第一数量的连续循环迭代不同于包含在连续循环迭代的第二集合中的第二数量的连续循环迭代。在一些示例中,将向量循环分段成向量分区包括生成基于谓词执行的向量分区循环。在一些示例中,在进入向量分区循环之前,标识第一循环迭代,并且在一些示例中,在外部循环内执行的内部循环中将向量循环分段。在一些示例中,冲突操作存取相同存储器位置。
在一些示例中,冲突操作包括造成交叉迭代依赖的第一有条件执行的语句和第二有条件执行的语句。在一些示例中,指令还使得机器通过将与第一标量操作和第二标量操作相关联的程序指令的集合放到向量分区循环中来补偿第一标量操作和第二标量操作之间的存储器流依赖。
本文中所公开的一些示例方法包括:响应于接收到具有在第一标量操作中引用和在字典上排在第一标量操作之前的第二标量操作中引用的标量变量的标量计算机程序循环,基于标量变量重命名第一向量,以便形成第二向量。该方法还包括:用对第二向量的引用代替对基于第一标量操作的第一向量操作的副本中的第一向量的引用;以及用对第二向量的引用代替对基于第二标量操作的第二向量操作中的第一向量的引用。该方法还包括:将第一向量操作的副本放在向量计算机程序循环中在字典上排在第二向量操作之前的位置;以及将第三向量操作插入到向量计算机程序循环中。第三向量操作基于谓词向量传播第二向量的向量元素中的值。
在一些示例方法中,向量计算机程序循环中的该位置是第一位置,并且第三向量操作插入在第二位置,其中第一位置在字典上排在第二位置之前。在一些示例方法中,谓词向量基于控制标量计算机程序循环中的第一标量操作的执行的条件。在一些示例中,第三向量操作基于谓词向量传播第二向量的向量元素中的值。
一些示例方法还包括标识各自与标量计算机程序循环中的迭代内逆依赖相关联以及各自具有第一操作作为汇聚节点的边缘的集合。一些示例方法还包括:标识各自对应于边缘集合中的边缘的源节点的集合;并确定是否存在从第一标量操作到第二标量操作的流依赖。如果不存在从第一标量操作到第二标量操作的流依赖,那么该方法包括:从边缘集合移除第二标量操作和第一标量操作之间的第一边缘;以及从源节点集合移除对应于第二标量操作的第一源节点。在一些示例中,该方法还包括:在第一迭代中,选择来自第一向量的最后的元素的值;以及在第二迭代中,用所选择的向量值填充第一向量的所有元素。
本文中所公开的一些示例系统包括复制器,用于响应于接收到具有在第一标量操作中引用和在字典上排在第一标量操作之前的第二标量操作中引用的标量变量的标量计算机程序循环,生成第一向量操作的副本。第一向量操作基于第一标量操作。复制器还将第一向量操作的副本放到向量计算机程序循环中在字典上排在基于第二标量操作的第二向量操作之前的位置。重命名工具重命名基于标量变量的第一向量以便形成第二向量,并用对第二向量的引用代替对第一向量操作的副本中的第一向量的引用。重命名工具还用对第二向量的引用代替对基于第二标量操作的第二向量操作中的第一向量的引用。一些示例系统还包括用于将第三向量操作插入到向量计算机程序循环中的传播器。第三向量操作基于谓词向量传播第二向量的向量元素中的值。在一些示例中,向量计算机程序循环中的该位置是第一位置,并且传播器将第三向量操作插入在第二位置,其中第一位置在字典上排在第二位置之前。
在一些示例系统中,谓词向量基于控制标量计算机程序循环中的第一标量操作的执行的条件。并且在一些示例系统中,第三向量操作基于谓词向量传播第二向量的向量元素中的值。
一些示例系统还包括边缘移除器,用于标识各自与标量计算机程序循环中的迭代内逆依赖相关联以及各自具有第一操作作为汇聚节点的边缘的集合。示例边缘移除器还标识各自对应于边缘集合中的边缘的源节点的集合,并确定是否存在从第一标量操作到第二标量操作的流依赖。如果边缘移除器确定不存在从第一标量操作到第二标量操作的流依赖,那么边缘移除器从边缘集合移除第二标量操作和第一标量操作之间的第一边缘,并从源节点集合移除对应于第二标量操作的第一源节点。
一些示例系统还包括:选择器,用于在第一迭代中选择来自第一向量的最后的元素的值;以及广播器,用于在第二迭代中用所选择的值填充第一向量的所有元素。
本文中所公开的一些示例有形机器可读存储介质包括机器可读指令,这些指令使得机器响应于接收到具有在第一标量操作中引用和在字典上排在第一标量操作之前的第二标量操作中引用的标量变量的标量计算机程序循环,重命名第一向量以形成第二向量,第一向量基于标量变量。指令还使得机器用对第二向量的引用代替对第一向量操作的副本中的第一向量的引用,并用对第二向量的引用代替对第二向量操作中的第一向量的引用,其中基于第一向量操作基于第一标量操作,并且第二向量操作基于第二标量操作。指令还使得机器将第一向量操作的副本放在向量计算机程序循环中在字典上排在第二向量操作之前的位置,并将第三向量操作插入到向量计算机程序循环中,第三向量操作基于谓词向量传播第二向量的向量元素中的值。
在一些示例中,向量计算机程序循环中的该位置是第一位置,并且第三向量操作插入在第二位置,其中第一位置在字典上排在第二位置之前。在一些示例中,谓词向量基于控制标量计算机程序循环中的第一标量操作的执行的条件,并且在一些示例中,第三向量操作基于谓词向量传播第二向量的向量元素中的值。
在一些示例中,指令还使得机器标识各自与标量计算机程序循环中的迭代内逆依赖相关联以及各自具有第一操作作为汇聚节点的边缘的集合。指令还使得机器标识各自对应于边缘集合中的边缘的源节点的集合。指令还使得机器:确定是否存在从第一标量操作到第二标量操作的流依赖;并且如果确定不存在从第一标量操作到第二标量操作的流依赖,那么从边缘集合移除第二标量操作和第一标量操作之间的第一边缘,并从源节点的集合移除对应于第二标量操作的第一源节点。在一些示例中,指令还使得机器在第一迭代中选择来自第一向量的最后的元素的值,并在第二迭代中用所选择的向量值填充第一向量的所有元素。
在一些示例中,其它示例分析器中的任何分析器采用示例分析器115A、115B、115C、115D、115E、115F中的一个或多个分析器所采用的循环依赖/边缘处理技术来处理循环依赖/边缘(如果适用于该类型的循环依赖/边缘的话)。
最后,尽管本文中描述了特定的示例方法、设备和制品,但是本专利的覆盖范围不限于此。相反,本专利覆盖在字面上或在等同的原则下公平地落在本专利的权利要求的范围内的所有方法、设备和制品。

Claims (30)

1.一种用于将具有由有条件定义的标量变量引起的循环承载的依赖的标量计算机程序循环转换成向量计算机程序循环的系统,所述系统包括:
谓词集合生成器,用于:
生成与第一标量计算机程序指令相关联的第一谓词集合,所述第一谓词集合包含使得在所述第一标量计算机程序指令处或之前定义标量变量的谓词;
生成与所述第一标量计算机程序指令相关联的第二谓词集合,所述第二谓词集合包含使得在所述第一标量计算机程序指令之后使用所述标量变量的谓词;
传播器,用于:
确定所述第二谓词集合是否是所述第一谓词集合的子集;以及
响应于确定所述第二谓词集合不是所述第一谓词集合的子集,将向量的元素中的值传播给所述向量的随后元素,所述向量通过将所述标量变量转换成向量变量而形成。
2.如权利要求1所述的系统,其中所述谓词集合生成器还用于:
将控制所述第一标量计算机程序指令的执行的第一谓词添加到所述第一谓词集合;以及
将所述第二谓词集合初始化为空集合。
3.如权利要求2所述的系统,还包括用于将控制第二标量计算机程序指令的执行的第二谓词添加到所述第二谓词集合的边缘移除器。
4.如权利要求2所述的系统,还包括边缘移除器,用于:
确定所述第一标量计算机程序指令和第二标量计算机程序指令之间的边缘是否是所述标量变量上的循环承载的字典反向逆依赖边缘;以及
如果确定所述边缘是所述标量变量上的循环承载的字典反向逆依赖边缘,那么将控制所述第二标量计算机程序指令的执行的第二谓词添加到所述第二谓词集合。
5.如权利要求2所述的系统,还包括用于将控制第二标量计算机程序指令的执行的第二谓词添加到所述第一谓词集合的边缘移除器。
6.如权利要求2所述的系统,还包括边缘移除器,用于:
确定所述第一标量计算机程序指令和第二标量计算机程序指令之间的边缘是否是所述标量变量上的输出依赖边缘;以及
如果确定所述边缘是输出依赖边缘,那么将控制所述第二标量计算机程序指令的执行的第二谓词添加到所述第一谓词集合。
7.如权利要求1所述的系统,其中所述传播器将利用传播指令来传播所述值,并且其中所述传播器在通过将所述第一标量计算机程序指令转换成所述向量计算机程序指令而形成的向量计算机程序指令之后插入所述传播指令。
8.如权利要求1所述的系统,其中所述值是第一值,并且所述元素是第一元素,所述系统还包括:
选择器,用于选择来自所述向量中的第二元素的第二值,所述第二值在第一迭代中选择;以及
广播器,用于在第二迭代中用所述选择的值填充所述向量的所有元素。
9.如权利要求8所述的系统,其中所述第二元素是所述向量中的最后的元素。
10.一种用于将具有由有条件定义的标量变量引起的循环承载的依赖的标量计算机程序循环转换成向量计算机程序循环的方法,所述方法包括:
生成与第一标量计算机程序指令相关联的第一谓词集合,所述第一谓词集合包含使得在所述第一标量计算机程序指令处或之前在所述标量计算机程序中定义所述标量变量的谓词;
生成与所述第一标量计算机程序指令相关联的第二谓词集合,所述第二谓词集合包含使得在所述第一标量计算机程序指令之后在所述标量计算机程序循环中使用所述标量变量的谓词;
确定所述第二谓词集合是否是所述第一谓词集合的子集;以及
响应于确定所述第二谓词集合不是所述第一谓词集合的子集,将向量的元素中的值传播给所述向量的随后元素,所述向量通过将所述标量变量转换成向量变量而形成。
11.如权利要求10所述的方法,还包括:
将控制所述第一标量计算机程序指令的执行的第一谓词添加到所述第一谓词集合;以及
将所述第二谓词集合初始化为空集合。
12.如权利要求11所述的方法,还包括:
将控制第二标量计算机程序指令的执行的第二谓词添加到所述第二谓词集合。
13.如权利要求11所述的方法,还包括:
确定所述第一标量计算机程序指令和第二标量计算机程序指令之间的边缘是否是所述标量变量上的循环承载的字典反向逆依赖边缘;以及
如果确定所述边缘是所述标量变量上的循环承载的字典反向逆依赖边缘,那么将控制所述第二标量计算机程序指令的执行的第二谓词添加到所述第二谓词集合。
14.如权利要求11所述的方法,还包括:
将控制第二标量计算机程序指令的执行的第二谓词添加到所述第一谓词集合。
15.如权利要求11所述的方法,还包括:
确定所述第一标量计算机程序指令和第二标量计算机程序指令之间的边缘是否是所述标量变量上的输出依赖边缘;以及
如果确定所述边缘是输出依赖边缘,那么将控制所述第二标量计算机程序指令的执行的第二谓词添加到所述第一谓词集合。
16.如权利要求10-15中任何一项权利要求所述的方法,其中利用传播指令来传播所述值,所述方法还包括:
将对应于所述第一标量计算机程序指令的标量指令转换成向量计算机程序指令;以及
在所述向量计算机程序指令之后插入所述传播指令。
17.如权利要求10-15中任何一项权利要求所述的方法,其中所述值是第一值,并且所述元素是第一元素,所述方法还包括:
选择来自所述向量中的第二元素的第二值,所述第二值在第一迭代中选择;以及
在第二迭代中用所述选择的第二值填充所述向量的所有元素。
18.如权利要求17所述的方法,其中所述第二元素是所述向量中的最后的元素。
19.如权利要求10所述的方法,其中基于所述第一谓词传播所述值。
20.一种用于将具有由有条件定义的标量变量引起的循环承载的依赖的标量计算机程序循环转换成向量计算机程序循环的系统,所述系统包括:
用于生成与第一标量计算机程序指令相关联的第一谓词集合的部件,所述第一谓词集合包含使得在所述第一标量计算机程序指令处或之前定义标量变量的谓词;
用于生成与所述第一标量计算机程序指令相关联的第二谓词集合的部件,所述第二谓词集合包含使得在所述第一标量计算机程序指令之后使用所述标量变量的谓词;
用于确定所述第二谓词集合是否是所述第一谓词集合的子集的部件;以及
用于响应于确定所述第二谓词集合不是所述第一谓词集合的子集而将向量的元素中的值传播给所述向量的随后元素的部件,所述向量通过将所述标量变量转换成向量变量而形成。
21.如权利要求20所述的系统,还包括:
用于将控制所述第一标量计算机程序指令的执行的第一谓词添加到所述第一谓词集合的部件;以及
用于将所述第二谓词集合初始化为空集合的部件。
22.如权利要求21所述的系统,还包括用于将控制第二标量计算机程序指令的执行的第二谓词添加到所述第二谓词集合的部件。
23.如权利要求21所述的系统,还包括:
用于确定所述第一标量计算机程序指令和第二标量计算机程序指令之间的边缘是否是所述标量变量上的循环承载的字典反向逆依赖边缘的部件;以及
用于如果确定所述边缘是所述标量变量上的循环承载的字典反向逆依赖边缘,那么将控制所述第二标量计算机程序指令的执行的第二谓词添加到所述第二谓词集合的部件。
24.如权利要求21所述的系统,还包括:
用于将控制第二标量计算机程序指令的执行的第二谓词添加到所述第一谓词集合的部件。
25.如权利要求21所述的系统,还包括:
用于确定所述第一标量计算机程序指令和第二标量计算机程序指令之间的边缘是否是所述标量变量上的输出依赖边缘的部件;以及
用于如果确定所述边缘是输出依赖边缘,那么将控制所述第二标量计算机程序指令的执行的第二谓词添加到所述第一谓词集合的部件。
26.如权利要求20-25中任何一项权利要求所述的系统,其中利用传播指令来传播所述值,所述系统还包括:
用于将对应于所述第一标量计算机程序指令的标量指令转换成向量计算机程序指令的部件;以及
用于在所述向量计算机程序指令之后插入所述传播指令的部件。
27.如权利要求20-25中任何一项权利要求所述的系统,其中所述值是第一值,并且所述元素是第一元素,所述系统还包括:
用于选择来自所述向量中的第二元素的第二值的部件,所述第二值在第一迭代中选择;以及
用于在第二迭代中用所述选择的第二值填充所述向量的所有元素的部件。
28.如权利要求27所述的系统,其中所述第二元素是所述向量中的最后的元素。
29.如权利要求20所述的系统,其中基于所述第一谓词传播所述值。
30.一种存储指令的机器可读介质,所述指令在执行时使得机器执行权利要求10至19中的任何一项所述的方法。
CN201380073078.XA 2013-03-15 2013-03-15 用于将具有循环承载的依赖的标量计算机程序循环向量化的方法和系统 Active CN104969179B (zh)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/US2013/032111 WO2014142972A1 (en) 2013-03-15 2013-03-15 Methods and systems to vectorize scalar computer program loops having loop-carried dependences

Publications (2)

Publication Number Publication Date
CN104969179A CN104969179A (zh) 2015-10-07
CN104969179B true CN104969179B (zh) 2019-07-16

Family

ID=51537337

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201380073078.XA Active CN104969179B (zh) 2013-03-15 2013-03-15 用于将具有循环承载的依赖的标量计算机程序循环向量化的方法和系统

Country Status (4)

Country Link
US (3) US9268541B2 (zh)
EP (1) EP2972781A4 (zh)
CN (1) CN104969179B (zh)
WO (1) WO2014142972A1 (zh)

Families Citing this family (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9244677B2 (en) 2012-09-28 2016-01-26 Intel Corporation Loop vectorization methods and apparatus
CN104969179B (zh) * 2013-03-15 2019-07-16 英特尔公司 用于将具有循环承载的依赖的标量计算机程序循环向量化的方法和系统
US10296630B2 (en) 2014-10-10 2019-05-21 Salesforce.Com, Inc. Graph representation of data extraction for use with a data repository
WO2016089242A1 (en) * 2014-12-04 2016-06-09 Huawei Technologies Co., Ltd Vectorization apparatus
US20160179550A1 (en) * 2014-12-23 2016-06-23 Intel Corporation Fast vector dynamic memory conflict detection
US10133827B2 (en) 2015-05-12 2018-11-20 Oracle International Corporation Automatic generation of multi-source breadth-first search from high-level graph language
US10614126B2 (en) 2015-05-21 2020-04-07 Oracle International Corporation Textual query editor for graph databases that performs semantic analysis using extracted information
KR102336448B1 (ko) * 2015-06-10 2021-12-07 삼성전자주식회사 사진 추출 전자 장치 및 방법
US10127025B2 (en) 2015-07-22 2018-11-13 Oracle International Corporation Optimization techniques for high-level graph language compilers
US9575736B2 (en) * 2015-07-22 2017-02-21 Oracle International Corporation Advanced interactive command-line front-end for graph analysis systems
US10810257B2 (en) 2015-08-27 2020-10-20 Oracle International Corporation Fast processing of path-finding queries in large graph databases
JP2018534708A (ja) * 2015-11-05 2018-11-22 コーニンクレッカ フィリップス エヌ ヴェKoninklijke Philips N.V. 患者の医療記録の包括的な検証
US10572233B2 (en) * 2015-11-20 2020-02-25 Nec Corporation Vectorization device, vectorization method, and recording medium on which vectorization program is stored
US9971570B2 (en) 2015-12-15 2018-05-15 Oracle International Corporation Automated generation of memory consumption aware code
GB2549737B (en) * 2016-04-26 2019-05-08 Advanced Risc Mach Ltd An apparatus and method for managing address collisions when performing vector operations
US10776093B2 (en) 2016-07-01 2020-09-15 Intel Corporation Vectorize store instructions method and apparatus
US9690553B1 (en) * 2016-09-26 2017-06-27 International Business Machines Corporation Identifying software dependency relationships
EP3336692B1 (en) * 2016-12-13 2020-04-29 Arm Ltd Replicate partition instruction
EP3336691B1 (en) 2016-12-13 2022-04-06 ARM Limited Replicate elements instruction
US10795682B2 (en) * 2016-12-28 2020-10-06 Intel Corporation Generating vector based selection control statements
US10540398B2 (en) 2017-04-24 2020-01-21 Oracle International Corporation Multi-source breadth-first search (MS-BFS) technique and graph processing system that applies it
US10585945B2 (en) 2017-08-01 2020-03-10 Oracle International Corporation Methods of graph-type specialization and optimization in graph algorithm DSL compilation
US10133561B1 (en) * 2017-08-30 2018-11-20 International Business Machines Corporation Partial redundancy elimination with a fixed number of temporaries
US11372804B2 (en) 2018-05-16 2022-06-28 Qualcomm Incorporated System and method of loading and replication of sub-vector values
US10795672B2 (en) 2018-10-31 2020-10-06 Oracle International Corporation Automatic generation of multi-source breadth-first search from high-level graph language for distributed graph processing systems
US10860301B2 (en) 2019-06-28 2020-12-08 Intel Corporation Control speculation in dataflow graphs
US10901733B1 (en) * 2019-07-01 2021-01-26 Western Digital Technologies, Inc. Open channel vector command execution
CN113391842A (zh) * 2020-03-13 2021-09-14 华为技术有限公司 一种单指令多数据simd指令的生成、处理方法以及相关设备
CN116893850B (zh) * 2023-07-10 2024-05-24 北京辉羲智能科技有限公司 一种硬件循环指令转换方法及编译器
CN117234514B (zh) * 2023-11-08 2024-02-23 睿思芯科(深圳)技术有限公司 将标量化程序转换为向量化程序的方法、系统及相关设备

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8176299B2 (en) * 2008-09-24 2012-05-08 Apple Inc. Generating stop indicators based on conditional data dependency in vector processors
CN102576318A (zh) * 2010-06-25 2012-07-11 松下电器产业株式会社 集成电路、计算机系统、控制方法

Family Cites Families (65)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0814817B2 (ja) 1986-10-09 1996-02-14 株式会社日立製作所 自動ベクトル化方法
US5225385A (en) 1988-08-26 1993-07-06 Shell Oil Company Solid alkene polymerization catalyst components and process for their preparation
JPH03111971A (ja) 1989-09-27 1991-05-13 Toshiba Corp ベクトル化診断方式
US5247696A (en) 1991-01-17 1993-09-21 Cray Research, Inc. Method for compiling loops having recursive equations by detecting and correcting recurring data points before storing the result to memory
US5802375A (en) 1994-11-23 1998-09-01 Cray Research, Inc. Outer loop vectorization
US5790866A (en) * 1995-02-13 1998-08-04 Kuck And Associates, Inc. Method of analyzing definitions and uses in programs with pointers and aggregates in an optimizing compiler
US5958048A (en) * 1996-08-07 1999-09-28 Elbrus International Ltd. Architectural support for software pipelining of nested loops
US6954927B2 (en) * 1999-02-17 2005-10-11 Elbrus International Hardware supported software pipelined loop prologue optimization
US6507947B1 (en) * 1999-08-20 2003-01-14 Hewlett-Packard Company Programmatic synthesis of processor element arrays
US6438747B1 (en) 1999-08-20 2002-08-20 Hewlett-Packard Company Programmatic iteration scheduling for parallel processors
US6892380B2 (en) * 1999-12-30 2005-05-10 Texas Instruments Incorporated Method for software pipelining of irregular conditional control loops
US6772415B1 (en) 2000-01-31 2004-08-03 Interuniversitair Microelektronica Centrum (Imec) Vzw Loop optimization with mapping code on an architecture
GB2367406B (en) * 2000-06-13 2002-06-05 Siroyan Ltd Predicated execution of instructions in processors
GB2380825B (en) * 2001-10-12 2004-07-14 Siroyan Ltd Processors and compiling methods for processors
US8141068B1 (en) 2002-06-18 2012-03-20 Hewlett-Packard Development Company, L.P. Compiler with flexible scheduling
US20040006667A1 (en) 2002-06-21 2004-01-08 Bik Aart J.C. Apparatus and method for implementing adjacent, non-unit stride memory access patterns utilizing SIMD instructions
US7020873B2 (en) 2002-06-21 2006-03-28 Intel Corporation Apparatus and method for vectorization of detected saturation and clipping operations in serial code loops of a source program
JP3847672B2 (ja) * 2002-07-03 2006-11-22 松下電器産業株式会社 コンパイラ装置及びコンパイル方法
US20110238948A1 (en) * 2002-08-07 2011-09-29 Martin Vorbach Method and device for coupling a data processing unit and a data processing array
US7086038B2 (en) * 2002-10-07 2006-08-01 Hewlett-Packard Development Company, L.P. System and method for creating systolic solvers
US7334110B1 (en) * 2003-08-18 2008-02-19 Cray Inc. Decoupled scalar/vector computer architecture system and method
US7171544B2 (en) 2003-12-15 2007-01-30 International Business Machines Corporation Run-time parallelization of loops in computer programs by access patterns
FR2865047B1 (fr) 2004-01-14 2006-04-07 Commissariat Energie Atomique Systeme de generation automatique de codes optimises
US7395419B1 (en) * 2004-04-23 2008-07-01 Apple Inc. Macroscalar processor architecture
US7617496B2 (en) * 2004-04-23 2009-11-10 Apple Inc. Macroscalar processor architecture
US8549501B2 (en) 2004-06-07 2013-10-01 International Business Machines Corporation Framework for generating mixed-mode operations in loop-level simdization
US7478377B2 (en) 2004-06-07 2009-01-13 International Business Machines Corporation SIMD code generation in the presence of optimized misaligned data reorganization
US7475392B2 (en) 2004-06-07 2009-01-06 International Business Machines Corporation SIMD code generation for loops with mixed data lengths
US20070074195A1 (en) * 2005-09-23 2007-03-29 Shih-Wei Liao Data transformations for streaming applications on multiprocessors
US7770162B2 (en) 2005-12-29 2010-08-03 Intel Corporation Statement shifting to increase parallelism of loops
US7730463B2 (en) * 2006-02-21 2010-06-01 International Business Machines Corporation Efficient generation of SIMD code in presence of multi-threading and other false sharing conditions and in machines having memory protection support
US7493475B2 (en) * 2006-11-15 2009-02-17 Stmicroelectronics, Inc. Instruction vector-mode processing in multi-lane processor by multiplex switch replicating instruction in one lane to select others along with updated operand address
US8087101B2 (en) 2007-01-19 2012-01-03 James Riddell Ferguson Impact shock absorbing material
US8214818B2 (en) 2007-08-30 2012-07-03 Intel Corporation Method and apparatus to achieve maximum outer level parallelism of a loop
US8146071B2 (en) 2007-09-18 2012-03-27 International Business Machines Corporation Pipelined parallelization of multi-dimensional loops with multiple data dependencies
US8087010B2 (en) * 2007-09-26 2011-12-27 International Business Machines Corporation Selective code generation optimization for an advanced dual-representation polyhedral loop transformation framework
JP4339907B2 (ja) 2007-10-24 2009-10-07 株式会社日立製作所 マルチプロセッサ向け最適コード生成方法及びコンパイル装置
US8136107B2 (en) * 2007-10-24 2012-03-13 International Business Machines Corporation Software pipelining using one or more vector registers
US8527742B2 (en) * 2008-08-15 2013-09-03 Apple Inc. Processing vectors using wrapping add and subtract instructions in the macroscalar architecture
US8583904B2 (en) 2008-08-15 2013-11-12 Apple Inc. Processing vectors using wrapping negation instructions in the macroscalar architecture
US20110035568A1 (en) * 2008-08-15 2011-02-10 Apple Inc. Select first and select last instructions for processing vectors
US8131979B2 (en) 2008-08-15 2012-03-06 Apple Inc. Check-hazard instructions for processing vectors
US8984262B2 (en) * 2008-08-15 2015-03-17 Apple Inc. Generate predicates instruction for processing vectors
US20110283092A1 (en) * 2008-08-15 2011-11-17 Apple Inc. Getfirst and assignlast instructions for processing vectors
US9182959B2 (en) 2008-08-15 2015-11-10 Apple Inc. Predicate count and segment count instructions for processing vectors
US8745360B2 (en) * 2008-09-24 2014-06-03 Apple Inc. Generating predicate values based on conditional data dependency in vector processors
US20100115233A1 (en) 2008-10-31 2010-05-06 Convey Computer Dynamically-selectable vector register partitioning
US8060857B2 (en) * 2009-01-31 2011-11-15 Ted J. Biggerstaff Automated partitioning of a computation for parallel or other high capability architecture
US8458685B2 (en) 2009-06-12 2013-06-04 Cray Inc. Vector atomic memory operation vector update system and method
US8627304B2 (en) 2009-07-28 2014-01-07 International Business Machines Corporation Vectorization of program code
US9043769B2 (en) * 2009-12-28 2015-05-26 Hyperion Core Inc. Optimization of loops and data flow sections in multi-core processor environment
US8572359B2 (en) 2009-12-30 2013-10-29 International Business Machines Corporation Runtime extraction of data parallelism
KR101613971B1 (ko) * 2009-12-30 2016-04-21 삼성전자주식회사 프로그램 코드의 변환 방법
US8621448B2 (en) 2010-09-23 2013-12-31 Apple Inc. Systems and methods for compiler-based vectorization of non-leaf code
US8949808B2 (en) 2010-09-23 2015-02-03 Apple Inc. Systems and methods for compiler-based full-function vectorization
US8793675B2 (en) * 2010-12-24 2014-07-29 Intel Corporation Loop parallelization based on loop splitting or index array
US8640112B2 (en) 2011-03-30 2014-01-28 National Instruments Corporation Vectorizing combinations of program operations
US9043775B2 (en) 2011-09-20 2015-05-26 Infosys Limited Method for identifying problematic loops in an application and devices thereof
US8966457B2 (en) * 2011-11-15 2015-02-24 Global Supercomputing Corporation Method and system for converting a single-threaded software program into an application-specific supercomputer
WO2013089750A1 (en) 2011-12-15 2013-06-20 Intel Corporation Methods to optimize a program loop via vector instructions using a shuffle table and a blend table
US9038042B2 (en) 2012-06-29 2015-05-19 Analog Devices, Inc. Staged loop instructions
US8893080B2 (en) * 2012-08-15 2014-11-18 Telefonaktiebolaget L M Ericsson (Publ) Parallelization of dataflow actors with local state
US9244677B2 (en) 2012-09-28 2016-01-26 Intel Corporation Loop vectorization methods and apparatus
WO2014063323A1 (en) * 2012-10-25 2014-05-01 Intel Corporation Partial vectorization compilation system
CN104969179B (zh) * 2013-03-15 2019-07-16 英特尔公司 用于将具有循环承载的依赖的标量计算机程序循环向量化的方法和系统

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8176299B2 (en) * 2008-09-24 2012-05-08 Apple Inc. Generating stop indicators based on conditional data dependency in vector processors
CN102576318A (zh) * 2010-06-25 2012-07-11 松下电器产业株式会社 集成电路、计算机系统、控制方法

Also Published As

Publication number Publication date
US20160154638A1 (en) 2016-06-02
US20170322786A1 (en) 2017-11-09
CN104969179A (zh) 2015-10-07
US9268541B2 (en) 2016-02-23
EP2972781A1 (en) 2016-01-20
WO2014142972A1 (en) 2014-09-18
US9733913B2 (en) 2017-08-15
US10402177B2 (en) 2019-09-03
EP2972781A4 (en) 2016-10-19
US20150007154A1 (en) 2015-01-01

Similar Documents

Publication Publication Date Title
CN104969179B (zh) 用于将具有循环承载的依赖的标量计算机程序循环向量化的方法和系统
EP3779802A1 (en) Methods, systems, articles of manufacture and apparatus to map workloads
US8645924B2 (en) Lossless path reduction for efficient symbolic execution and automatic test generation
US20110047532A1 (en) Methods and apparatuses for selective code coverage
US20130080993A1 (en) Embedded system performance
US8484630B2 (en) Code motion based on live ranges in an optimizing compiler
JP5347023B2 (ja) 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体
US20160321048A1 (en) Information processing apparatus and compiling method
US20110047531A1 (en) Methods and apparatuses for selective code coverage
US9086873B2 (en) Methods and apparatus to compile instructions for a vector of instruction pointers processor architecture
US8458679B2 (en) May-constant propagation
US20110191760A1 (en) Method and apparatus for enhancing comprehension of code time complexity and flow
CN115461718A (zh) 神经网络中的内存分配
US8756580B2 (en) Instance-based field affinity optimization
US10108405B2 (en) Compiling apparatus and compiling method
US20130262843A1 (en) Function-based software comparison method
CN108369499B (zh) 一种代码虚拟化系统和方法
US11188324B2 (en) Methods, systems, and articles of manufacture to perform heterogeneous data structure selection via programmer annotations
US11995441B1 (en) Instruction decoding using hash tables
US9772825B2 (en) Program structure-based blocking
JP5169322B2 (ja) 変数最適化装置、変数最適化プログラム、コンパイラ、変数最適化方法、及びコンパイル方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant