瓦解的多嵌套循环的向量化的制作方法
【技术领域】
[0001] 本公开通常涉及计算平台,更具体地说,本公开涉及循环瓦解(loop collapsing) 方法、装置和指令以及循环向量化方法。
【背景技术】
[0002] 例如,在高性能计算(HPC)编码中,例如二到五次的嵌套循环是非常常见的。循环 瓦解通过减小分支的数目并因而减小分支错误预测的概率来改善性能。瓦解多嵌套循环的 传统方式是创建没有嵌套的、由在瓦解的循环的每一次迭代上递增的新循环计数器控制的 循环。新循环计数器总共递增次,其中t Cj是对ij进行循环的循环计 数。然而,关于单个循环计数器的信息需要被保存用于循环内部的计算以及用作访问多维 阵列的索引。
[0003] 并且,在一些情况下,尽管循环瓦解可以改善性能,但是当前的编译器很少能够有 效地瓦解循环。阻止瓦解的一些最常见的原因包括:在η维阵列A中的非步长(stride)存 储器存取(在瓦解之后);存在对子维阵列B(m维,m<n)的访问;以及存在对单独的循环 计数器(ij)的计算。
【附图说明】
[0004] 图1是根据本发明实施例的处理器管线的框图。
[0005] 图2A和2B是根据本发明实施例的比较标量对向量操作的框图。
[0006] 图3A是根据本发明一个实施例的多维循环计数器向量和相关联的掩码的框图。
[0007] 图3B是根据本发明实施例与循环计数器更新指令相关联的值的框图。
[0008] 图4是根据本发明实施例的方法的流程图。
[0009] 图5是根据本发明实施例的向量执行单元的一部分的框图。
[0010] 图5A是根据本发明实施例的向量化代码段的方法的流程图。
[0011] 图5B是根据本发明另一实施例的方法的流程图。
[0012] 图6A是根据本发明实施例的示例性AVX指令格式的说明。
[0013] 图6B是根据本发明实施例的在其中来自图6A的字段组成完整的操作码字段和基 本操作字段的说明。
[0014] 图6C是根据本发明实施例的在其中来自6A的字段组成寄存器索引字段的说明。
[0015] 图7A和7B是根据本发明实施例说明通用向量友好的指令格式及其指令模板的框 图。
[0016] 图8是根据本发明实施例说明示例性的特定向量友好的指令格式的框图。
[0017] 图9是根据本发明一个实施例的寄存器架构的框图。
[0018] 图IOA是根据本发明实施例的说明示例性有序管线和示例性寄存器重命名的乱 序发射/执行管线二者的框图。
[0019] 图IOB是根据本发明实施例的说明要包括在处理器中的有序架构核心和示例性 的寄存器重命名的乱序发射/执行架构核心二者的示例性实施例的框图。
[0020] 图IlA-B说明了更具体的示例性有序核心架构的框图,该核心将是芯片中若干逻 辑框中的一个(包括相同类型和/或不同类型的其他核心)。
[0021] 图12是根据本发明实施例的可以具有多于一个核心、可以具有集成存储器控制 器、并且可以具有集成显卡的处理器的框图。
[0022] 图13是根据本发明实施例的示例性系统的框图。
[0023] 图14是根据本发明实施例的更具体的第一示例性系统的框图。
[0024] 图15是根据本发明实施例的更具体的第二示例性系统的框图。
[0025] 图16是根据本发明实施例的SoC的框图。
[0026] 图17是根据本发明实施例对使用软件指令转换器来将源指令集中的二进制指令 转换成目标指令集中的二进制指令进行比较的框图。
【具体实施方式】
[0027] 在各个实施例中,可以以向量格式维持用于嵌套循环的循环计数器。可以在由嵌 套循环形成的瓦解循环的每一次迭代结束的时候相应地修改这些多个循环计数器。在不同 的实施例中,可以响应于单个指令来在处理器的硬件中执行计算后的循环计数器更新。
[0028] 因而,实施例可以将嵌套循环的循环计数器存储为在向量大小的存储装置中存储 的单个多维循环计数器,例如处理器的向量寄存器或者向量大小的存储器单元。可以经由 用于控制多维循环计数器的一个或多个指令来控制这一存储装置中的值。可以提供这样 的指令的不同特质来以可控制的方式使计数器递增和递减,并且更新处理器的各种状态标 志。此外,可以使用计算多维阵列内的偏移的指令来执行循环瓦解。这一方案使得能够瓦 解多嵌套循环并且使用嵌套循环的循环计数器作为用于访问多维阵列(包括子维阵列)或 者针对嵌套循环的循环计数器的其他计算的索引。
[0029] 图1示出了利用半导体芯片上的逻辑电路实现的处理核心100的高级别视图。处 理核心包括管线101。管线由多个级组成,每一级被设计为执行完全执行程序代码指令所需 的多步骤过程中的特定步骤。这些典型地至少包括:1)指令获取和解码;2)数据获取;3) 执行;4)回写。执行级对由在先前级(例如,在上面的步骤1)中)中获取和解码的指令识 别的并且在另一先前级(例如,上面的步骤2))中获取的数据执行由相同的指令识别的特 定运算。所运算的数据通常从(通用)寄存器存储空间102中获取。在完成该运算时创建 的新数据也被典型地"回写"到寄存器存储空间(例如,在上面的步骤4)处)。
[0030] 与该执行级相关联的逻辑电路典型地由多个"执行单元"或"功能单元" 1〇3_1到 103_N组成,这些"执行单元"或"功能单元" 103_1到103_N各自被设计为执行其自身唯一 的操作子集(例如,第一功能单元执行整型数学运算,第二功能单元执行浮点指令,第三功 能单元执行自/至高速缓存/存储器的加载/存储操作,等等)。由所有功能单元执行的所 有操作的集合与由处理核心100支持的"指令集"相对应。
[0031] 两种类型的处理器架构在计算机科学领域被广泛认识:"标量"和"矢量"。标量处 理器被设计为执行对单个数据集执行操作的指令,而向量处理器被设计为执行对多个数据 集执行操作的指令。图2A和2B呈现了展示在标量处理器与向量处理器之间的基本区别的 比较示例。
[0032] 图2A示出了标量与(AND)指令的示例,其中,单个操作数集合A和B被与在一起 以产生单一的(或"标量的")结果C(即,AB = C)。相较而言,图2B示出了向量与指令的 示例,其中,两个操作数集合,A/B和D/E,被分别并行地与在一起,以同时产生向量结果C、 F(即,A与B = C且D与E = F)。在术语方面,"向量"是具有多个"元素"的数据单元。例 如,向量V = Q,R,S,T,U具有5个不同的元素:Q、R、S、T和U。示例性的向量V的"大小" 是5(因为其具有5个元素)。
[0033] 图1还示出了与通用寄存器空间102不同的向量寄存器空间107的存在。具体地 说,通用寄存器空间102被名义上用于存储标量值。这样,当执行单元中的任意一个执行标 量操作时,它们名义上使用从通用寄存器存储空间102调用的操作数(并且将结果回写到 通用寄存器存储空间102)。相较而言,当执行单元中的任意一个执行向量操作时,它们名 义上使用从向量寄存器空间107调用的操作数(并且将结果回写到向量寄存器空间107)。 同样可以分配存储器的不同区域用于存储标量值和向量值。
[0034] 还要注意的是,在到功能单元103_1和103_N的各自输入处以及来自功能单元 103_1和103_N的各自输出处存在掩码逻辑104_1和104_N以及105_1和105_N。在各种 实现中,对于向量操作,仅实际上实现这些层中的一个一虽然这不是严格的要求(虽然未 在图1中描绘,但是,可以想象,仅执行标量操作而不执行向量操作的执行单元无需具有任 何掩码层)。对于采用掩码的任何向量指令,输入掩码逻辑1〇4_1和104_N* /或输出掩码 逻辑105_1和105_N可以用于控制针对该向量指令对哪些元素进行了有效操作。这里,从 掩码寄存器空间106读取掩码向量(例如,与从向量寄存器存储空间107读取的输