使用混洗表和混合表经由矢量指令优化程序循环的方法

文档序号:6485284阅读:286来源:国知局
使用混洗表和混合表经由矢量指令优化程序循环的方法
【专利摘要】根据一种实施例,一种代码优化器被配置为接收第一代码,该第一代码具有以标量指令实现的程序循环,用于基于第三数组的值把第一数组的值存储到第二数组,并生成第二代码,该第二代码用至少一个矢量指令来表示程序循环。该第二代码包括混洗指令、混合指令和存储指令,该混洗指令以矢量方式使用混洗表基于第三数组混洗第一数组的元素,该混合指令以矢量方式使用混合表混合第一数组的已混洗的元素,该存储指令把第一数组的已混合元素存储在第二数组中。
【专利说明】使用混洗表和混合表经由矢量指令优化程序循环的方法
发明领域
[0001]本发明的各实施例通常涉及程序循环的优化。尤其,本发明的各实施例涉及使用混洗表和混合表经由矢量指令优化程序循环。
[0002]背景
[0003]几乎所有数据处理应用都涉及必须对数据集合迭代地执行的操作。这样的程序循环可以包括任何数量的指令,且可以迭代根据计算机程序确定的任何次数。很常见的情况是,基于第三数组的条件把第一数组的值赋值给第二数组。通常,为了实现这样的操作,取决于第三数组的相应元素,利用程序循环来把第一数组的元素迭代地赋值给第二数组的元素,以标量方式每次一个元素地进行,如图3中所示的。
[0004]在如图3中所示出的示例中,基于数组b[]的相应元素的值或条件,在程序循环中每次一个元素地把数组a[]的元素赋值给数组dest[]。然而,因为由处理器执行的大量的迭代和指令,这样的实现是低效的。
[0005]附图简述
[0006]作为示例而非限制,在附图的各图中阐释本发明的各实施例,附图中,类似的标号指示相似的元素。
[0007]图1是阐释根据一种实施例的代码优化器的框图。
[0008]图2是阐释根据一种实施例优化程序代码的方法的流程图。
[0009]图3是表示典型程序循环的伪代码。
[0010]图4是根据一种实施例用高级矢量指令表示程序循环的伪代码。
[0011]图5是阐释根据一种实施例存储混洗表和掩码存储表的数据结构的图。
[0012]图6是阐释根据一种实施例用于优化程序循环的方法的流程图。
[0013]图7是根据另一实施例用高级矢量指令表示程序循环的伪代码。
[0014]图8是阐释根据一种实施例存储混洗表和混合表的数据结构的图。
[0015]图9是阐释根据另一实施例用于优化程序循环的方法的流程图。
[0016]图10是阐释根据一种实施例的数据处理系统的示例的框图。
[0017]图11是阐释根据另一实施例的数据处理系统的示例的框图。
[0018]详细描述
[0019]将参考下面讨论的细节描述本发明的各种实施例和各方面,且附图将阐释各种实施例。下列的描述和附图阐释本发明,且不应被解释成限制本发明。描述了众多特定细节,以便提供对本发明的各种实施例的透彻理解。然而,在某些实例中,不描述公知的或常规的细节,以便提供对本发明的各实施例的简练讨论。
[0020]本说明书中对“一种实施例”或“一个实施例”的引用意味着,结合该实时例描述的具体的特征、结构或特性可以被包括在本发明的至少一种实施例中。在本说明书中各个地方出现“在一个实施例中”的短语不一定都是指相同的实施例。
[0021]根据一些实施例,通过使用矢量指令以矢量方式执行程序循环的迭代,代码优化器(例如,编译器)用于优化程序循环的标量指令。通过由诸如单指令多数据(SMD)处理器等的具有矢量能力的处理器执行矢量指令或打包指令(Packed instruction),执行程序循环的迭代。通过使用矢量或打包指令,基于矢量指令的矢量长度或打包在SIMD指令内的指令的数量,可以减少或缩小程序循环的迭代的数量。可以由具有矢量能力的处理器使用矢量指令来并行执行典型程序循环的某些迭代。结果,程序循环的执行效率可以得到极大改善。
[0022]根据一种实施例,代码优化器接收到第一代码,该第一代码具有用于基于第三数组(例如,条件数组)的元素的值或条件把第一数组(例如,源数组)的元素赋值给第二数组(例如,目的地数组)的元素的程序循环。作为响应,代码优化器被配置为生成第二代码,该第二代码具有执行与程序循环相同的操作的矢量指令。在一种实施例中,在程序循环的每次迭代中,第二代码包括VECT0R_SHUFLE指令和VECT0R_MASKST0RE指令,VECT0R_SHUFLE指令基于第三数组的相应元素的值或条件使用混洗表混洗第一数组的元素,VECTOR,MASKST0RE指令以矢量方式把第一数组的已混洗的元素存储在第二数组中。
[0023]在另一实施例中,在程序循环的每次迭代中,第二代码包括VECT0R_SHUFLE指令和VECT0R_BLEND指令,VECT0R_SHUFLE指令基于第三数组的相应元素的值或条件使用混洗表混洗第一数组的元素,VECT0R_BLEND指令以矢量方式混合第一数组的已混洗的元素。取决于矢量长度,一旦已经经由混合操作积聚了第一数组的元素,那么,就把第一数组的已混合的元素存储在第二数组中。
[0024]图1是阐释根据一种实施例的代码优化器的框图。参见图1,系统100包括接收第一代码101的代码优化器102,第一代码101具有带有标量指令(例如图3中所示出的那些标量指令)的程序循环。第一代码101中的程序循环包括标量指令,这些标量指令基于第三数组的元素的值或条件,分别迭代地把第一数组的元素的值赋值给第二数组的元素。响应于第一代码101,代码优化器102被配置为把第一代码101的标量指令转换成第二代码103,第二代码103具有至少一个矢量指令以便代替第一代码101的一些标量指令。在一种实施例中,代码优化器被配置为把多个标量迭代的多个数据打包成单个SIMD指令。第二代码103的至少一个矢量指令允许具有矢量能力的处理器104(例如,具有SMD能力的处理器)执行至少一个矢量指令,以便在程序循环中并行执行某些步骤,例如在单个指令循环期间。
[0025]在一种实施例中,在每次迭代期间,第二代码103包括在此称为VECTOR_SHUFFLE指令的混洗指令,该混洗指令基于根据第三数组的相应元素的值或条件生成的掩码使用混洗表105混洗第一数组的元素。第二代码103还包括在此称为VECT0R_MASKST0RE指令的存储指令,该存储指令基于掩码将第一数组的已混洗的元素存储在第二数组中。在另一实施例中,在每次迭代期间,第二代码103包括VECTOR_SHUFFLE指令,VECTOR_SHUFFLE指令基于根据第三数组的相应元素的值或条件生成的掩码使用混洗表105混洗第一数组的元素。第二代码103还包括在此称为VECT0R_BLEND指令的混合指令,该混合指令将第一数组的已混洗的元素与先前已混洗的元素混合。在已经混洗并混合第一数组的所有元素时,然后,把第一数组的已混合的元素存储在第二数组中。应注意,代码优化器102可以以硬件、软件或其组合实现。
[0026]在一种实施例中,代码优化器102可以是编译器的一部分,且处理器104可以是可从加利福尼亚州圣克拉拉市的英特A g得到的高级矢量扩展(AVX)兼容的处理器。在一种实施例中,VECTOR_SHUFFLE指令可以是流式SIMD扩展(SSE)和/或AVX兼容的指令的PSHUFB、PSHUFD、PSHUFHW 和 PSHUFLW 中的一种。VECTOR_MASKSTORE 指令可以是 SSE/AVX 兼容的指令的 MASKMOVDQU、VMASKMOV 和 MASKMOVQ 中的一种。VECTOR_BLEND 指令可以是 SSE/AVX 兼容的指令的 BLENDPD、BLENDPS、BLENDVPD 和 BLENDVPS 中的一种。
[0027]图2是阐释根据一种实施例优化程序代码的方法的流程图。例如,方法200可以由图1的代码优化器102执行。参见图2,在框201,处理逻辑接收第一代码,该第一代码具有程序循环,该程序循环具有基于第三数组的值或条件把第一数组的值存储到第二数组的标量指令。在框202,处理逻辑生成第二代码,该第二代码具有诸如VECT0R_SHUFFLE、VECT0R_MASKST0RE和VECT0R_BLEND指令等的至少一个矢量指令,从而以矢量方式执行程序循环的一些迭代。矢量指令可以与基于AVX的矢量指令兼容。在框203,将第二代码存储在存储器中,以便由具有矢量能力的处理器执行。
[0028]图3是表示具有标量指令的典型程序循环的伪代码。参见图3,在这一示例中,伪代码300包括程序循环(例如,for循环),以基于第三数组303的相应元素的值或条件分别把第一数组301的元素的值赋值给第二数组302的相应元素。在这一示例中,在每次迭代中每次一个元素地、迭代地处理数组301-303的元素中的每一个。如图3中所示出,在每次迭代期间,在304行评估数组303的元素,且如果满足条件,那么就在305行把数组301元素赋值给数组302的相应元素。此后,在行306处递增将在下一迭代中执行的下一个元素的索引。在这样的配置中, 处理器必须执行等于数组301中的元素的数量的迭代次数。如果数组301具有大量的元素,将存在大量的迭代,这显著低效且耗费资源。
[0029]图4是表示根据本发明的一种实施例使用基于矢量的指令或经打包指令的程序循环的伪代码。在这一示例中,伪代码400可以由图1的代码优化器102基于图3的伪代码300生成。参见图4,多个数据被打包成矢量寄存器,且把矢量或打包指令(例如,SMD指令)用作在相同的迭代内并行执行多个操作的打包指令,其中在常规标量程序循环的迭代内那些多个操作将必须每次一个地执行。
[0030]在401行,借助于广播,把条件值(例如,topVal)加载到矢量寄存器VMM0。取决于VMMO寄存器的大小,使用借助于广播的加载指令(load-with-broadcast instruction),可以把该条件值的多个副本加载到VMM0。VMMO可以是128位、256位、512位或其他大小的寄存器。借助于广播的加载指令可以是SSE/AVX兼容的指令的VBR0ADCASTSS、VBR0ADCASTSD和VBR0ADCASTF中的一种。在被执行时,借助于广播的加载指令加载来自源操作数(例如,topVal)的值并广播给目的地操作数(例如,VMM0)的所有元素。
[0031 ] 在这一示例中,假设:
[0032]topVal = O ;
[0033]数组a[4] = {0,1,2,3};
[0034]数组b [4] = {-2,-2,I, -2}.[0035]在401行的指令将把所有零加载到VMMO寄存器。然后,按矢量长度(VL)的增量执行程序循环402,这是由于每次迭代执行等于VL的指派操作的数量。取决于寄存器的大小,对于128位、256位或512位寄存器,VL分别可以是4、8或16。
[0036]在403行,指令加载来自数组b[]的4个值,并与存储在VMMO中的topVal的矢量(在这一示例中都是0)进行比较。存储在VMM2寄存器中的结果将是{-1,_1,0,-1},因为这些是少于VMMO中的topVal的数组b[]中的值。再次贯穿本申请,在此描述的诸如VMM0、VMM和VMM2等的任何寄存器可以是128位、256位、512位或其他大小的寄存器。在这一示例中,利用了打包比较大于指令(packed compare-greater-than instruction),该指令可以在单个指令循环内以矢量方式比较多个值。在一种实施例中,打包比较大于指令可以是SSE/AVX兼容的指令的PCMPGTB、PCMPGTW、PCMPGTD或PCMPGTQ中的一种,这取决于数据和/或寄存器宽度。
[0037]在行404,提取VMM2中的每一元素的符号位并将其存储在寄存器或存储器“掩码”(在这一示例中是OxD)中。在一种实施例中,利用了打包提取符号位指令(packedextract-sign-bit),该指令可以是SSE/AVX兼容的指令的M0VMSKPD和M0VMSKPS中的一种,该指令从源操作数中的打包浮点值提取符号位,把它们格式成掩码,并把该掩码存储在目的地操作数中。
[0038]在405行,根据存储在“掩码”中的掩码值,从混洗表加载混洗控制。混洗表示例被不出为图5中的混洗表501,混洗表501可以被实现为图1的混洗表105 —部分。在这一示例中,由掩码表示的混洗控制是{0x00,0x01, 0x02, 0x03, 0x08, 0x09, OxOa, OxOb, OxOc, Ox0d, OxOe, OxOf, 0x80, 0x80, 0x80, 0x80},基于从存储在VMMl寄存器中的比较结果提取的符号位(例如,-1, -1, O, -1),把该混洗控制加载到寄存器“掩码”中。
[0039]在406行,从数组ΑΙ0,I, 2,3}加载四个元素,且根据先前加载到VMMl中的混洗控制进行混洗。结果将是{0,2,3,0},且存储在VMM2寄存器中。在一种实施例中,利用了打包混洗指令,该指令可以是SSE/AVX兼容的指令的PSHUFB、PSHUFD、PSHUFHW和PSHUFLW中的一种。打包混洗指令根据源操作数中的混洗控制掩码在目的地操作数中原地执行各种大小的混洗。该指令置换(permute)目的地操作数中的数据,保持混洗掩码不受影响。如果设定了混洗控制掩码中的每一个的最高有效位,那么,把常量零写到结果中。混洗控制掩码中的每一元素形成置换目的地操作数中的相应字节的索引。每一索引的值是混洗控制字节的最低有效4比特(128位操作)或3比特(64位操作)。
[0040]在407行,对存储在“掩码”中的具有预先确定的逻辑值(例如,逻辑值I)的比特的数量进行技术,并将其存储在“num”中。在一种实施例中,利用了与AVX指令兼容的P0PCNT,其中POPCNT指令返回具有逻辑值I的比特的数量。在408行,根据来自掩码存储表的比特的数量,把掩码控制加载到VMMl中。掩码存储表的示例被示出为图5中的表502,表502可以被实现为图1的掩码存储表106的一部分。在这一示例中,VMMl将包含来自掩码存储表 502 的{-1, -1, -1, 0}。
[0041]在409行,执行掩码存储操作,该操作把基于存储在VMMl中掩码而选择的VMM2的值存储到目的地数组中。在这一示例中,将仅存储VMM2的前3个元素(例如,基于{-1,-1,-1,0}的掩码)。在一种实施例中,在此利用了打包掩码存储指令,该指令可以是AVX兼容指令的MASKMOVDQU、VMASKMOV和MASKM0VQ中的一种。在410行,按在掩码存储操作期间所存储的元素的数量递增目的地数组的索引或指针。结果,取决于关联的矢量长度,程序循环402的每次迭代可以以矢量方式执行多个操作。注意,仅出于阐释的目的描述了如图3-图5中所示出的伪代码和数据结构;也可以利用其他代码或编程语言以及特定打包或矢量指令。
[0042]图6是阐释根据一种实施例用于优化程序循环的方法的流程图。例如,方法600可以由图1的代码优化器102执行。参见图6,在框601,接收到第一代码,该第一代码具有用标量指令实现的程序循环。第一代码基于第三数组的值把第一数组的值存储到第二数组。在框602,代码优化器基于第一代码生成第二代码,以加载第三数组的值,并使用矢量比较指令把它们与预先确定的阈值进行比较。在框603,基于掩码(基于比较结果的符号位确定该掩码),第二代码加载混洗表。在框604,使用混洗表,使用矢量混洗指令,第二代码混洗第一数组的元素。在框605,基于掩码(例如,掩码中的非零比特的数量),加载掩码存储表。在框606,然后,基于掩码存储表,使用矢量掩码存储指令把已混洗的元素存储在第二数组中。在每次迭代中执行上面的操作,其中每次迭代使用矢量指令来并行执行多个操作(例如,高达矢量长度)。然后,在框607,把第二代码存储在存储器中。
[0043]在另一实施例中,代替使用VECT0R_MASKST0RE指令,在程序循环的每次迭代中,第二代码包括VECT0R_SHUFLE指令和VECT0R_BLEND指令,VECT0R_SHUFLE指令基于第三数组的相应元素值或条件使用混洗表混洗第一数组的元素,VECT0R_BLEND指令以矢量方式混合第一数组的已混洗的元素。取决于矢量长度,一旦经由混合操作已积聚了第一数组的元素,则然后,把第一数组的已混合的元素存储在第二数组中。
[0044]图7是表示根据本发明的另一实施例使用基于矢量的或打包指令的程序循环的伪代码。在这一示例中,伪代码700可以由图1的代码优化器102基于图3的伪代码300生成。参见图7,多个数据被打包成矢量寄存器,且矢量或打包指令(例如,SMD指令)被用作在相同的迭代内并行执行多个操作的打包指令,其中在常规标量程序循环的迭代内那些多个操作必须每次一个地执行。在这一实施例中,该过程将积聚结果直到它已经处理了等于矢量长度的元素的数量。代替使用如上所述的掩码存储指令,利用了带有混合表的混合指令。 [0045]参见图7,在701行,执行程序循环的某些初始化。在这一示例中,借助于广播把条件值(例如,topVal)加载到矢量寄存器VMMO中。取决于VMMO寄存器的大小,使用借助于广播的加载指令(loadwith broadcast instruction),可以把条件值的多个副本加载到VMMO中。VMMO可以是128位、256位、512位或其他大小的寄存器。借助于广播的加载指令可以是AVX兼容指令的VBROADCASTSS、VBROADCASTSD和VBR0ADCASTF中的一种。在被执行时,借助于广播的加载指令加载来自源操作数的值(例如,topVal)并广播到目的地操作数(例如,VMM0)的所有元素。
[0046]另外,积聚计数器numOfElem表示已经处理但没有存储在目的地数组的元素的数量。在这一示例中,假设:
[0047]topVal = O ;
[0048]a[8] = {O, 1,2,3,4,5,6,7};
[0049]b [8] = {~2, ~2, I, ~2, ~2, I, I, ~2).[0050]在701行,指令将把所有零都加载到VMMO寄存器中。然后,按矢量长度(VL)的递增执行程序循环702,这是由于每次迭代执行等于VL的指派操作的数量。取决于寄存器的大小,对于128位、256位或512位寄存器,VL分别可以是4、8或16。
[0051]在行703,指令加载来自数组b[]的4个值,并与存储在VMMO中的topVal的矢量(在这一示例中都是0)进行比较。存储在VMM3寄存器中的结果将是{-1,_1,0,-1},因为这些是少于VMMO中的topVal的数组b[]中的值。再次贯穿本申请,在此描述的诸如VMM0、VMM、VMM2和VMM3等的任何寄存器可以是128位、256位、512位或其他大小的寄存器。在这一示例中,利用了打包比较大于指令,该指令可以在单个指令循环内以矢量方式比较多个值。在一种实施例中,打包比较大于指令可以是SSE/AVX兼容指令的PCMPGTB、PCMPGTW、PCMPGTD或PCMPGTQ中的一种,这取决于数据和/或寄存器宽度。
[0052]在704行,提取VMM3中的每一元素的符号位并将其存储在寄存器或存储器“掩码”(在这一示例中是OxD)中。在一种实施例中,利用了打包提取符号位指令,该指令可以是SSE/AVX兼容指令的M0VMSKPD和M0VMSKPS中的一种,该指令从源操作数中的打包浮点值提取符号位,把它们格式成掩码,并把该掩码存储在目的地操作数中。
[0053]在705行,根据存储在“掩码”中的掩码值和当前所积聚的元素的数量“numOfElem”,从混洗表把混洗控制加载到VMMl寄存器中。混洗表的示例被示出为图8中的混洗表751,混洗表751可以被实现为图1的混洗表105的一部分。在这一示例中,VMMl中的混洗控制是{0x00, 0x01, 0x02, 0x03, 0x08, 0x09, OxOa, OxOb, OxOc, OxOd, OxOe, OxOf, Ox80,0x80, 0x80, 0x80}。
[0054]在706行,从数组{0,I, 2,3}加载四个元素,且根据先前加载到VMMl中的混洗控制进行混洗。结果将是{0,1、3,0},且存储在VMM3寄存器中。在一种实施例中,利用了打包混洗指令,该指令可以是SSE/AVX兼容的指令的PSHUFB、PSHUFD、PSHUFHW和PSHUFLW中的一种。打包混洗指令根据源操作数中的混洗控制掩码在目的地操作数中原地执行各种大小的混洗。该指令置换目的地操作数中的数据,保持混洗掩码不受影响。如果设定了混洗控制掩码中的每一个的最高有效位,那么,把常量零写到结果中。混洗控制掩码中的每一元素形成置换目的地操作数中的相应字节的索引。每一索引的值是混洗控制字节的最低有效的4比特(128位操作)或3比特(64位操作)。
[0055]在707行,对存储在“掩码”中的具有预先确定的逻辑值(例如,逻辑值I)的比特的数量进行计数,并将其存储在寄存器或存储器“num”中。在这一示例中,“num”是3。在一种实施例中,利用了与AVX指令兼容的P0PCNT,其中POPCNT指令返回具有逻辑值I的比特的数量。在708行,根据所积聚的元素的数量“num”,从混合表把混合控制加载到VMMl中。混合表的不例被不出为图8中的表752,表752可以被实现为图1的混合表107的一部分。在这一示例中,VMMl将包含来自混合表752的{0,O, O, 0}。
[0056]在709行,使用先前加载到VMMl中的混合控制把存储在VMM2中的已积聚的元素与存储在VMM3中的已混洗的元素混合起来。结果将是{0,1、3,0},并存储在VMM2中。在一种实施例中,使用VECT0R_BLEND指令以矢量方式执行多个元素的混合操作,VECT0R_BLEND指令可以是SSE/AVX兼容的指令的BLENDPD、BLENDPS、BLENDVPD和BLENDVPS中的一种。取决于掩码寄存器操作数(例如,VMM3)中所定义的掩码比特,VECT0R_BLEND有条件地复制来自第二源操作数(例如,VMM2)和第一源操作数(例如,VMM1)的值的每一数据元素。掩码比特是掩码寄存器的每一元素中是最高有效位。
[0057]此后,在行710,按存储在“num”中的值的增量,更新已积聚的元素的数量numOfElem, “num”对应于已混合的元素的数量。在711行,如果numOfElem中已处理的已积聚的元素的数量大于矢量长度VL,则存储在VMM2中的经混合元素存储在目的地数组中,且对接下来的VL个元素重复该迭代。在这一示例中,“num”等于3,少于值为4的VL。结果,已积聚的经已混合的元素将不存储在目的地数组中。相反,执行下一迭代。[0058]回到703行,从b[]加载4个值,并将其与矢量topVal(在这一示例中都是零)进行比较。结果将是{-1,O, O, -1}。在704行,提取每一元素的符号位并将其存储在64位寄存器掩码中(在这一示例中,该值将是0x9)。在705行,根据掩码值和所积聚的元素的当前数量(例如,3),从混洗表加载混洗控制。在这一示例中,混洗控制将是{OxOc,OxOd, OxOe, 0x0f, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x01,0x02,0x03}。在 706行,从数组a[]加载4个元素(例如,{4,5,6,7}),并根据先前加载的控制混洗。结果将是{7,O, O, 4}。在707行,对掩码中具有值I的比特的数量(在这一示例中结果是2)进行计数。在708行,根据已积聚的元素的数量,加载混合控制。在这一示例中混合控制将是{0,0,0,1}。
[0059]在709行,使用先前加载的混合控制,把已积聚元素与已混洗的元素混合。结果将是{0,1,3,4}。在710行,这一迭代中所积聚的元素的数量相加(在这一示例中新的值将是3+2 = 5)。在711行,把已积聚的数量与矢量长度VL4进行比较。在这种情况中,满足该条件。在712行,存储已积聚寄存器。在713行,已积聚元素的数量递减4(例如,VL),得到I。在行714,把已混洗的元素指派为新的已积聚的矢量寄存器。经加载的值的旋转将最近积聚的元素放置在匹配已积聚的元素的剩余数量的矢量的开始处。结果将是{7,DC,DC,DC} (DC=不关心)。在715行,目的地指针递增4(例如,VL)个元素。
[0060]图9是阐释根据另一实施例用于优化程序循环的方法的流程图。方法800可以由图1的代码优化器102执行。参见图8,在框801,接收到第一代码,该第一代码具有以标量指令实现的程序循环。第一代码基于第三数组的值把第一数组的值存储到第二数组。在框802,代码优化器基于第一代码生成第二代码,以加载第三数组的值并使用矢量比较指令把它们与预先确定的阈值进行比较。在框803,基于掩码(基于比较结果的符号位确定该掩码),第二代码加载混洗表。在框804,使用混洗表,使用矢量混洗指令,第二代码混洗第一数组的元素。在框805,基于第一数组的已积聚的元素,加载混合表。在框806,使用矢量混合指令,把已混洗的元素与第一数组的已积聚元素混合起来。如果已积聚的元素的数量少于矢量长度,则迭代地执行框802-806的操作。否则,在框807,然后,把第一数组的已积聚元素存储在第二数组。然后,对第一数组的所有元素迭代地执行上面的操作。
[0061]图10是阐释根据本发明的一种实施例的数据处理系统的示例的框图。例如,系统900可以表示图1的任意系统100。处理器901可以表示图1的处理器104。系统900可以表示以上所描述的任意系统。例如,系统900可以表示台式计算机、膝上型计算机、平板计算机、服务器、移动电话(例如,智能手机)、媒体播放器、个人数字助理(PDA)、个人通信设备、游戏设备、网络路由器或集线器、无线接入点或中继器、机顶盒或其组合。注意,尽管图10阐释了数据处理系统的各种组件,但它不旨在表示任何具体的体系结构或互连组件的方式;因而,这些细节与本发明的各实施例没有密切关系。还应明白,具有更少组件或者也许具有更多组件的网络计算机、手持式计算机、移动电话和其他数据处理系统也可以与本发明的各实施例一起使用。
[0062]参见图10,在一种实施例中,系统900包括处理器901和芯片组902,芯片组902经由总线或互连将包括存储器905和设备903-904的各种组件耦合到处理器901。处理器901可以表示其中包括有单个处理器核或多个处理器核909的单个处理器或多个处理器。处理器901可以表示一个或多个通用处理器,例如微处理器、中央处理单元(CPU)等等。更具体地,处理器901可以是复杂指令集计算(CISC)微处理器、精简指令集计算(RISC)微处理器、超长指令字(VLIW)微处理器或实现其他指令集的处理器、或实现指令集的组合的处理器。处理器901也可以是一个或多个专用处理器,例如专用集成电路(ASIC)、现场可编程门阵列(FPGA)、数字信号处理器(DSP)、网络处理器、图形处理器、网络处理器、通信处理器、密码处理器、协处理器、嵌入式处理器或能够处理指令的任何其他类型的逻辑。例如,处理器9Ol可以是可从加利福尼亚州圣克拉拉市的英特尔公司购买的奔腾? 4 ( Pentium*4)、奔腾⑧双核(Pentium? Dual-Core)、酷睿 ?2 双核和四核(Core?2Duo and Quad)、至强?(Xeon?)、安腾 ? (Itanium?)、XScale?、酷睿 ?i7 (Core?i7)、酷睿 ?i5 (Core?i5)、赛扬?(Celeron? )或StrongARM?微处理器。处理器901被配置为执行用于执行在此讨论的操作和步骤的指令。
[0063]处理器901可以包括指令解码器,指令解码器可以接收和解码各种指令。解码器可以生成和输出一个或多个微操作、微代码入口点、微指令、其他指令或其他控制信号,它们反映原始输入指令或者是从原始输入指令导出。可以使用各种不同的机制实现解码器。合适的机制的示例包括但不限于微代码只读存储器(ROM)、查找、硬件实现、可编程逻辑阵列(PLA)等等。
[0064]解码器可以不是处理器901的必要组件。在一个或多个其他实施例中,处理器901可以改为具有指令仿真器、指令翻译器、指令变形器、指令解释器或其他指令转换逻辑。各种不同类型的指令仿真器、指令变形器、指令翻译器等等在本领域中是已知的。指令转换逻辑可以接收比特范围隔离指令,仿真、转换、变形、解释或以另外方式转换该比特范围隔离指令,并输出对应于原始比特范围隔离指令的一个或多个指令或控制信号。指令转换逻辑可以以软件、硬件、固件或其组合实现。在一些情况中,指令转换逻辑中的一些或全部可以位于与其余的指令处理装置不同的管芯,例如在分离的管芯上或在系统存储器中。在一些情况中,指令处理装置可以具有解码器和指令转换逻辑两者。
[0065]处理器901和/或核心909还可以包括一个或多个执行单元,这些执行单元与解码器的输出耦合或以另外方式与之通信。术语“耦合”可以意味着两个或更多个元素处于直接的电气接触或连接。然而,“耦合”也可以意味着两个或更多个元素相互不处于直接连接,但仍然彼此协同操作或交互或通信(例如,通过中间组件)。作为一个示例,解码器和执行单元可以通过中间的可选缓冲器或本领域中已知可能耦合在解码器和执行单元之间的其他组件彼此耦合起来。处理器901和/或核心909还可以包括多种不同类型的执行单元,诸如例如算术单元、算术逻辑单元(ALU)整数单元等等。
[0066]处理器901还可以包括一个或多个寄存器堆,包括但不限于整数寄存器、浮点寄存器、矢量或扩展寄存器、状态寄存器和指令指针寄存器等等。在此使用术语“寄存器”来指代被用作宏指令的一部分以便标识操作数的板载处理器存储位置。换句话说,在此指出的寄存器在处理器外(从程序器的视角)可见的那些。然而,寄存器在含义上不应限于具体类型的电路。相反,寄存器仅需要能够存储和提供数据,并执行在此描述的功能。在此描述的寄存器可以使用任何数量的不同技术由在处理器内的电路实现,例如专用物理寄存器、使用寄存器重命名的动量分配物理寄存器、专用物理寄存器和动量分配物理寄存器的组合等等。在一种实施例中,整数寄存器存储32位或64位整数数据。寄存器堆可以包含用于经打包数据的扩展多媒体SMD寄存器(例如,XMM)。这样的寄存器可以包括涉及SSE2、SSE3、SSE4、GSSE和更高(泛指为“SSEx” )技术的128位宽的XMM寄存器和256位宽的寄存器(它们可以在它们的低阶比特中合并XMM寄存器),以便保存这样的经打包数据操作数。
[0067]处理器901和/或核心909也可以可选地包括一个或多个其他公知的组件。例如,处理器901可以可选地包括指令取数逻辑、预解码逻辑、调度逻辑、重排序缓冲器、分支预测逻辑、引退逻辑、寄存器重命名逻辑等等或其某种组合。这些组件可以按常规方式实现,或者具有本领域中的技术人员基于本公开内容将明显看出的细微调整。理解在此的实施例不需要对这些组件的进一步描述,但如果期望的话,可以容易地从常见文献得到进一步的描述。存在本领域中已知的这样的组件的众多不同的组合和配置。该范围不限于任何已知的这样的组合或 配置。各实施例可以被实现为带有或不带有这样的附加组件。
[0068]芯片组902可以包括存储器控制中枢(MCH)910和输入输出控制中枢(ICH)911。MCH910可以包括与存储器905通信的存储器控制器(未示出)。MCH910也可以包括与图形设备912通信的图形接口。在本发明的一种实施例中,图形接口可以经由加速图形端口(AGP)、高速外围组件互连(PCI)总线或其他类型的互连与图形设备912通信。ICH911可以提供到诸如设备903-904等的I/O设备的接口。设备903-904中的任何都可以是存储设备(例如,硬盘驱动器、闪速存储器设备)、通用串行总线(USB)端口、键盘、鼠标、并行端口、串行端口、打印机、网络接口(有线或无线)、无线收发器(例如,WiF1、蓝牙或蜂窝收发器)、媒体设备(例如、音频/视频编解码器或控制器)、总线桥(例如,PC1-PCI桥)或其组合。
[0069]MCH910有时被称为北桥,且ICH911有时被称为南桥,尽管有些人在它们之间做出技术区分。在此所使用的术语MCH、ICH、北桥和南桥预期被广泛地解释为覆盖其功能包括向处理器传送中断信号的各种芯片。在一些实施例中,MCH910可以与处理器901集成起来。在这样的配置中,芯片组902操作执行MCH910和ICH911的一些功能的接口芯片,如图11中所示出的。此外,图形加速器912可以被集成在MCH910或处理器901内。
[0070]存储器905可以存储包括由处理器901或任何其他设备执行的指令序列的数据。例如,各种操作系统、设备驱动器、固件(例如,基本输入输出系统或BIOS)和/或应用的可执行代码913和/或数据914可以被加载到存储器905中且由处理器901执行。操作系统可以是任何种类的操作系统,诸如例如来自微软.?的Windows?操作系统、来自苹果的Mac OS?/iOS?、来自谷^?^Android?、Linux?、Unix?或其他实时操作系统。在一种实施例中,存储器905可以包括一个或多个易失性存储(或存储器)设备。例如随机存取存储器(RAM)、动量RAM(DRAM)、同步DRAM (SDRAM)、静态RAM(SRAM)或其他类型的存储设备。也可以利用非易失性存储器,例如硬盘或闪速存储设备。前端总线(FSB)906可以是多点式互连或点对点互连。术语FSB预期覆盖到处理器901的各种类型的互连。芯片组902可以经由点对点接口与诸如设备903-904等的其他设备通信。总线906可以被实现为各种总线或互连,诸如例如快速路径互连(QPI)、超传输互连或与高级微控制器总线体系结构(AMBA)兼容的总线,例如AMBA高性能总线(AHB)。
[0071]高速缓存908可以是任何种类的处理器高速缓存,例如I级(LI)高速缓存、L2高速缓存、L3高速缓存、L4高速缓存、末级高速缓存(LLC)或其组合。高速缓存908可以与处理器901的处理器核心909共享。高速缓存908可以嵌入在处理器901内和/或外置于处理器901。高速缓存908可以在各核心909当中共享。替代地,核心909中的至少一个还包括其中嵌入的其自己的本地高速缓存。核心909中的至少一个可以利用本地高速缓存已经与核心909中的另一个共享的高速缓存两者。处理器901还可以包括直接高速缓存访问(DCA)逻辑,以便允许诸如设备903-904等的其他设备直接地访问高速缓存908。处理器901和/或芯片组902还可以包括中断控制器,例如高级可编程中断控制器(APIC),以便处理诸如消息信号中断等的中断。
[0072]在前述的说明书中,已经参考其特定示例性实施例描述了本发明的各实施例。可以明显看出,在不偏离下列权利要求所陈述的本发明的宽泛的精神和范围的前提下,可以对其做出各种修改。因此,应该以说明性而非限制性的意义来看待说明书和附图。
【权利要求】
1.一种计算机实现的方法,包括: 接收第一代码,所述第一代码具有以标量指令实现的程序循环,用于基于第三数组的值把第一数组的值存储到第二数组中;以及 生成第二代码,所述第二代码用至少一个矢量指令表示所述程序循环,所述第二代码包括 混洗指令,用于以矢量方式使用混洗表基于所述第三数组混洗所述第一数组的元素, 混合指令,用于以矢量方式使用混合表混合所述第一数组的已混洗的元素,以及 存储指令,用于将所述第一数组的已混洗的元素存储在所述第二数组中。
2.如权利要求1所述的方法,其特征在于,所述第二代码进一步包括用于将所述第三数组的元素与预先确定的阈值进行比较,从而生成比较结果的指令,以及 用于基于所述比较结果生成掩码的指令,基于所述掩码混洗所述第一数组的所述元素。
3.如权利要求2所述的方法,其特征在于,所述第二代码进一步包括用于加载基于所述掩码选择的所述混洗表的元素的指令,基于所述混洗表的已选择的元素经由所述混洗指令混洗所述第一数组的所述元素。
4.如权利要求2所述的方法,其特征在于,所述第二代码进一步包括用于加载基于所述掩码选择的所述混合表的 元素的指令,基于所述混合表的已选择的元素经由所述混合指令混合所述第一数组的已混洗的元素。
5.如权利要求4所述的方法,其特征在于,基于所述掩码的具有预先确定的逻辑值的比特的数量确定所述混合表的已选择的元素。
6.如权利要求2所述的方法,其特征在于,所述第二代码进一步包括用于将所述预先确定的阈值存储在矢量寄存器中的指令,使用矢量比较指令把所述第一数组的所述元素与存储在所述矢量寄存器中的值进行比较。
7.如权利要求2所述的方法,其特征在于,基于存储在矢量寄存器中的所述比较结果的符号位生成所述掩码。
8.一种其中存储有指令的计算机可读存储介质,在由计算机执行时,所述指令引起所述计算机执行一种方法,所述方法包括: 接收第一代码,所述第一代码具有以标量指令实现的程序循环,用于基于第三数组的值把第一数组的值存储到第二数组中;以及 生成第二代码,所述第二代码使用至少一个矢量指令表示所述程序循环,所述第二代码包括 混洗指令,用于以矢量方式基于所述第三数组使用混洗表混洗所述第一数组的元素, 混合指令,用于以矢量方式使用混合表混合所述第一数组的已混洗的元素,以及 存储指令,用于将所述第一数组的已混洗的元素存储在所述第二数组中。
9.如权利要求8所述的计算机可读存储介质,其特征在于,所述第二代码进一步包括 用于将所述第三数组的元素与预先确定的阈值进行比较,从而生成比较结果的指令,以及 用于基于所述比较结果生成掩码的指令,基于所述掩码混洗所述第一数组的所述元素。
10.如权利要求9所述的计算机可读存储介质,其特征在于,所述第二代码进一步包括用于加载基于所述掩码选择的所述混洗表的元素的指令,基于所述混洗表的已选择的元素经由所述混洗指令混洗所述第一数组的所述元素。
11.如权利要求9所述的计算机可读存储介质,其特征在于,所述第二代码进一步包括用于加载基于所述掩码选择的所述混合表的元素的指令,基于所述混合表的已选择的元素经由所述混合指令混合所述第一数组的已混洗的元素。
12.如权利要求11所述的计算机可读存储介质,其特征在于,基于所述掩码的具有预先确定的逻辑值的比特的数量确定所述混合表的已选择的元素。
13.如权利要求9所述的计算机可读存储介质,其特征在于,所述第二代码进一步包括用于将所述预先确定的阈值存储在矢量寄存器中的指令,使用矢量比较指令把所述第一数组的所述元素与存储在所述矢量寄存器中的值进行比较。
14.如权利要求9所述的计算机可读存储介质,其特征在于,基于存储在矢量寄存器中的所述比较结果的符号位生成所述掩码。
15.一种装置,包括: 存储器,用于存储混 洗表和混合表;以及 代码优化器,用于接收第一代码,所述第一代码具有以标量指令实现的程序循环,用于基于第三数组的值把第一数组的值存储到第二数组中,并且,所述代码优化器用于生成第二代码,所述第二代码用至少一个矢量指令表示所述程序循环,所述第二代码包括 混洗指令,用于以矢量方式使用所述混洗表基于所述第三数组混洗所述第一数组的元素, 混合指令,用于以矢量方式使用所述混合表混合所述第一数组的已混洗的元素,以及 存储指令,用于将所述第一数组的已混洗的元素存储在所述第二数组中。
16.如权利要求15所述的装置,其特征在于,所述第二代码进一步包括 用于将所述第三数组的元素与预先确定的阈值进行比较,从而生成比较结果的指令,以及 用于基于所述比较结果生成掩码的指令,基于所述掩码混洗所述第一数组的所述元素。
17.如权利要求16所述的装置,其特征在于,所述第二代码进一步包括用于加载基于所述掩码选择的所述混洗表的元素的指令,基于所述混洗表的已选择的元素经由所述混洗指令混洗所述第一数组的所述元素。
18.如权利要求14所述的装置,其特征在于,所述第二代码进一步包括用于加载基于所述掩码选择的所述混合表的元素的指令,基于所述混合表的已选择的元素经由所述混合指令混合所述第一数组的已混洗的元素。
19.如权利要求18所述的装置,其特征在于,基于所述掩码的具有预先确定的逻辑值的比特的数量确定所述混合表的已选择的元素。
20.如权利要求16所述的装置,其特征在于,所述第二代码进一步包括用于将所述预先确定的阈值存储在矢量寄存器中的指令,使用矢量比较指令把所述第一数组的所述元素与存储在所述矢量寄存器中的值进行比较。
【文档编号】G06F9/44GK103999045SQ201180075570
【公开日】2014年8月20日 申请日期:2011年12月15日 优先权日:2011年12月15日
【发明者】T·尤里尔, E·乌尔德-阿迈德-瓦尔, B·T·托尔 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1