使用硬件指针的simd核心中的发散分支解决方案的制作方法_4

文档序号:9332647阅读:来源:国知局
其他实施方案中一些步骤可以与图示不 同的次序发生,一些步骤可同时进行,一些步骤可与其他步骤结合,并且一些步骤可以不存 在。
[0062] 在块602中,可定位并分析软件程序或子例程。程序代码可由设计者以高级语言 (如C语言或另一种语言)书写。这个软件程序可被书写用于编译和执行并行数据应用程 序,如在游戏、商业、医疗和其他领域。程序代码可指软件应用程序、子例程、动态链接库的 任何部分或其他。路径名可由用户按照命令提示键入。或者,用户名可从给定的目录位置 或者其他位置读取,以便开始编译源代码。可在编译期间检查、翻译、优化并且进一步处理 程序代码内部的指令。
[0063] 在一些实施方案中,静态地编译源代码。在这类实施方案中,在前端编译期间,可 将源代码翻译成中间表示(IR)。后端编译步骤可将IR翻译成机器代码。静态后端编译可 进行更多的转换和优化。在其他实施方案中,使用准时制(JIT)方法编译源代码。在获得 系统配置后,JIT方法可产生适当的二进制代码。使用任一方法,编译器可识别函数调用、 循环、循环内部的踪迹和程序代码中的基本块。在程序分析期间可构造一个或多个控制流 程图。
[0064] 在各种实施方案中,在处理器(如通用处理器)上编译程序代码。程序代码可被 编译用于目标处理器,所述目标处理器包括并行微型体系结构,如SHffi微型体系结构。一 个或多个相关联的数据记录可被分配给函数调用以产生一个或多个工作项目。
[0065] 在检测到程序代码中的任何发散点之前,当已分析的和已翻译的指令出现在程 序代码中时,编译器可将它们布置在存储器中。基本上,编译器可能正在创建大小为1的 VLIW。如果编译器检测到在已识别的循环内部的发散点(条件块604),那么在块606中,可 插入已产生的代码,其中当被执行时,所述代码更新下一个要提取的VLIW的大小。编译器 可以一种允许目标处理器创建超长指令字(VLIW)的方式设置代码和数据记录。编译器可 跟踪由发散点和对应会聚点之间的多个基本块混合的指令的程序计数器(PC)值。当执行 已产生的代码时,可随后将多个PC值传递至目标处理器。可跟踪一个或多个相关联的数据 记录来伴随VLIW内部的混合指令以产生一个或多个相关联的工作项目。
[0066] 在块608中,编译器可插入代码,其中当被执行时,所述代码将指向VLIW内部的指 令的多个PC寄存器映射到目标处理器内部的多个并行执行道中的给定一个。或者,映射可 在偏移量和工作项目ID之间。在块610中,编译器可插入已产生的代码,其中当被执行时, 所述代码更新下一个要提取的VLIW的VLIW大小和映射。在块612中,可在循环的结束处 插入已产生的代码,其中当被执行时,所述代码存储关于将要进入睡眠或退出状态的执行 道的状态信息。
[0067] 现参照图7,展示了用于使用硬件技术来最优化多个工作项目在处理器中的并行 执行的方法700的一个实施方案。出于讨论目的,以相继次序展示这个实施方案和随后描 述的方法的后续实施方案中的步骤。然而,在其他实施方案中一些步骤可以与图示不同的 次序发生,一些步骤可同时进行,一些步骤可与其他步骤结合,并且一些步骤可以不存在。
[0068] 在块702中,将相关联的数据记录分配给已编译的代码以产生多个工作项目。在 一些实施方案中,操作系统可进行分配。在块704中,将工作项目安排给具有单指令多数据 (SHffi)微型体系结构的目标处理器。在块706中,更新具有下一个要提取的VLIW的大小的 大小寄存器。在块708中,更新多个PC寄存器中的一个或多个。多个PC寄存器可储存指 向将要生成的VLIW内部的对应字的指针或地址。
[0069] 在块710中,更新用于将多个PC寄存器映射到执行工作项目的并行执行道的矢量 寄存器。对应于并行执行道中的一个给定的道的特定字段或条目可存储PC标识符(ID)。 PC ID可识别多个PC寄存器中的一个,将要读取所述一个PC寄存器来获得将由相关联的执 行道处理的指令的地址。使用更新后的大小和多个程序计数器(PC),在块712中,处理器可 提取某一数量的指令,所述数量等于来自i缓存的更新后的大小。已提取的指令可来自循 环内部的发散点和会聚点之间的单独基本块。在块714中,目标处理器可读取矢量寄存器 以生成具有已提取的指令的VLIW。存储在矢量寄存器中的映射信息可针对给定的工作项目 和对应的执行道确定要处理VLIW中的哪个指令。目标处理器可将已提取的指令映射到执 行工作项目的并行执行道。
[0070] 现参照图8,展示用于使用硬件技术来最优化多个工作项目在处理器中的并行执 行的方法800的另一个实施方案。出于讨论目的,以相继次序展示这个实施方案和随后描 述的方法的后续实施方案中的步骤。然而,在其他实施方案中一些步骤可以与图示不同的 次序发生,一些步骤可同时进行,一些步骤可与其他步骤结合,并且一些步骤可以不存在。
[0071] 在块802中,使用目标处理器中的并行执行道同时执行已生成的VLIW中的指令。 如果针对给定的工作项目到达循环的结束(条件块804)并且如果没有检测到活动的工作 项目(条件块806),那么在块810中,读取关于分配给并行执行道的工作项目中的每一个的 相应状态信息。状态信息可包括至少下一个PC和工作项目ID。状态信息可用于继续并行 执行道内部的执行。
[0072] 如果针对给定的工作项目到达循环的结束(条件块804)并且如果检测到任何活 动的工作项目(条件块806),那么在块812中,存储关于给定的工作项目的状态信息以供以 后使用。给定的工作项目可使执行停止并且可被置于睡眠或退出状态。
[0073] 现参照图9,展示了示出目标代码排列900的另一个实施方案的概括性框图。代码 排列900示出当执行用于分别在图2和图3中展示的控制流程图200和随附执行序列320 的代码时,由处理器创建的排列的一个实施方案。代码502-506可进行与先前所描述功能 相同的功能。
[0074] 基本块的大小在编译时是已知的。编译器可跟踪PC并且安排程序代码的指令以 使初始化代码最小化并且减小DVLIW的大小。在使用控制流程图200和代码排列500的前 一实施例中,使用BB 6的四个副本。编译器可通过引入间隙来减少踪迹和附随PC寄存器 ID的数量。间隙可利用空操作(nop operation)。
[0075] 这里可使用之前描述的关于代码排列500的步骤。在BB 2完成时,DVLIW的大小 保持为2。然而,已提取的DVLIW内部的两个指令中的一个是在排列900中提供间隙的空操 作。PC寄存器ID 0对应于空操作并且PC寄存器ID 1对应于BB 3中的指令。在BB 3完 成时,DVLIW从2减小至1。现在PC寄存器ID 0对应于BB 4中的指令并且PC寄存器ID 1对应于空操作。
[0076] 在BBC(0, 4)完成时,处理器在执行踪迹0中的BB 4的结束处的代码506的同时 将大小寄存器从1更新为2。已执行的代码506更新矢量寄存器中用于分支至BB 6的工 作项目的条目以存储PC ID 1。在将两个PC寄存器值和已存储的大小发送至i缓存之后, 可从i缓存提取两个指令。两个已提取的指令包括来自BB 5和BB 6的混合指令。在矢量 寄存器中具有相关联的存储为为〇的PC寄存器ID的工作项目从BB (0, 5)获取已提取的指 令。在矢量寄存器中具有相关联的存储为1的PC寄存器ID的工作项目从BB (1,6)获取已 提取的指令。
[0077] 在BB (1,6)完成时,代码506将DVLIW的大小从2更新为1。对应于BB (1,6)的工 作项目停止执行,存储状态信息,并且等待,直到在下一个PC处重启执行。下一个PC可指 向BB 1或BB 7。其他步骤可如之前所描述那样进行。代码排列900响应于确定在检测到 的给定发散点和对应的会聚点之间的第一踪迹路径小于在给定发散点和对应的会聚点之 间的第二踪迹路径示出,编译器可使无操作与对应于VLIW中的第二踪迹路径的指令成组, 所述VLIW是在第一踪迹路径的完成和对应会聚点之间创建的。
[0078] 对于之前描述的实施方案中的每一个,进一步的并行化可发生,其中代码是在循 环的外部与循环内部的代码并行化。例如,用于BB 7的程序代码可与BB 1并行化以终止 用于完成循环的工作项目的程序。另外,响应于检测到对应于VLIW内部的资源独立指令而 不是单个指令的PC寄存器ID,相关联的工作项目和执行道可在执行道内部同时执行多个 资源独立指令。
[0079] 此外,编译器可使用寄存器分配来减小DVLIW的大小。程序代码可包括以下陈述 式: X= (A+B) + (B+M)。这里,两个操作使用相同的操作码。第一踪迹包括加法操作,如T1 = A+B。第二踪迹包括加法操作,如T2 = C+D。有工作项目使用来自具有PC寄存器ID (如 0)的基本块X (BB X)的Tl。有其他工作项目使用来自具有PC寄存器ID (如1)的BB Y的 T2。如果第一操作数对"C"和"A"、第二操作数对"
...
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1