一种内存复制方法及装置制造方法
【专利摘要】一种内存复制方法及装置;方法包括:判断待复制内存的长度L是否小于第一长度阈值;当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L≥N≥max-min。本申请能提高内存复制的性能。
【专利说明】—种内存复制方法及装置
【技术领域】
[0001]本发明涉及计算机领域,尤其涉及一种内存复制方法及装置。
【背景技术】
[0002]应用程序经常会使用一些通用的操作,比如将一块内存的数据复制到另外一块空间、比较两块内存数据是否有差异、计算一个字符串的长度等。
[0003]如果不进行改进就会导致多个应用程序之间有大量重复性代码,总体代码尺寸变大需要更多的内存,导致更多指令缓存失效,性能下降。由于这些操作是频繁使用,Amdahl法则要求我们优化那些占有CPU时间比例大的函数,这样才能提高程序的整体性能。因此将所有的频繁操作的函数单独拿出来做成一个或多个程序可以共享的函数库,这样所有程序可以仅仅调用一个函数,去掉重复性函数代码,减少内存占有量,任何一个程序对此函数的调用都会预热缓存,使后面的使用者更快的运行。
[0004]内存复制函数memcpy就是属于上面提到的库函数,而且使用次数相当大,越来越被业界所重视,为了优化这个函数经常要写出数千行代码,最近一个memcpy函数达到了4700行汇编代码,但是将这段代码放到真实的环境中后,由于代码包含较多跳转指令,而CPU指令预测又没有达到十分精确的地步,导致优化的结果被预测失败的负面效应完全遮挡,所以优化人员将提高预测准确率融入了 memcpy函数里面,这将带来更好的结果。
[0005]目前的一种方案是完全采用对齐模式;在这种实现方式中,需要充分利用CPU流水线处理内存访问的过程,包括前端取指令,解码,内存访问方式,缓存对齐。理想情况下这种操作能带来最大的内存访问量。
[0006]但是该方案仅仅在所有指令预测成功的情况下才会取得最大吞吐量,这在实际应用上并不现实,必然会有指令预测失败的现象;同时由于小数据的访问时间短,所取得的性能提高更是被指令预测错误的负面所遮掩。
[0007]另一种方案充分考虑指令预测所带来的负面影响,将复制模式设计的尽可能简单,从而节省上一方案中为了内存对齐而添加的跳转指令。
[0008]该方案虽然减少了预测失败,但同时也减少了 CPU内存访问的吞吐量。
[0009]还有一种方案完全使用Intel提供的快数据复制模式,在带来尽可能提高内存吞吐量的基础上,不产生跳转指令预测错误。
[0010]该方案在避免预测错误的同时提高内存访问量,但是由于CPU需要访问MS_R0M,所以启动的时候,需要“预热”阶段,这个阶段带来很大延迟,严重影响中小字节复制。
【发明内容】
[0011 ] 本发明要解决的技术问题是如何提高内存复制的性能。
[0012]为了解决上述问题,本申请提供了一种内存复制方法,包括:
[0013]判断待复制内存的长度L是否小于第一长度阈值;
[0014]当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0015]从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;Wrsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
[0016]可选地,所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
[0017]可选地,所述第一长度阈值为256字节。
[0018]可选地,所述多个预定的长度区间包括8个长度区间,第i个长度区间的上、下限值分别为2--、2Η ;所述N为所确定的长度区间的min。
[0019]可选地,对于min大于或等于16的长度区间,所述从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中的步骤包括:
[0020]从所述待复制内存的源地址rsi开始,依次复制P次16个字节到目的地址rdi开始的内存中;P Smin除以16的商;
[0021]从rsi+L-N处开始,复制N个字节到rdi+L_N开始的N个字节中的步骤包括:
[0022]从rsi+L-min开始,依次复制P次16个字节到rdi+L_N开始的内存中。
[0023]可选地,对于min小于16的长度区间,所述从所述待复制内存的源地址的起始位置rsi开始,复制min个字节到目的地址的步骤包括:
[0024]从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;
[0025]从rsi+L-N处开始,复制N个字节到rdi+L_N开始的N个字节中的步骤包括:
[0026]从rsi+L-min开始,复制min个字节到rdi+L-min开始的min个字节中。
[0027]可选地,所述的方法还包括:
[0028]如果长度L大于或等于第一长度阈值,则判断长度L是否大于第二长度阈值;
[0029]当长度L不大于第二长度阈值时,从rsi+L-CL开始,复制CL个字节到rdi+L_CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;
[0030]将目的地址32字节对齐;
[0031]从rsi开始复制CL个字节到rdi开始的CL个字节中;复制后将rsi和rdi各增加CL个字节,将L减去CL;
[0032]判断L是否小于CL,如果是,则完成复制;如果不是则返回所述从rsi开始复制CL个字节到rdi开始的CL个字节中的步骤。
[0033]可选地,所述第二长度阈值为2048个字节,所述CL为128个字节。
[0034]本申请还提供了一种内存复制方法,包括:
[0035]判断用于保存待复制数据的内存的长度L是否小于第一长度阈值;
[0036]当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0037]将待复制数据保存到内存中目的地址rdi开始的min个字节中;将待复制数据保存到内存中rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
[0038]可选地,所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
[0039]可选地,所述多个预定的长度区间的上、下限值分别为2--、2Η ;所述N为所确定的长度区间的min ;i为正整数且21等于所述第一长度阈值。
[0040]可选地,对于min大于或等于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中的步骤包括:
[0041]从目的地址rdi开始,向内存中依次写入P次16个字节的待复制数据;P为min除以16的商;
[0042]将待复制数据保存到内存中rdi+L-N开始的N个字节中的步骤包括:
[0043]从rdi+L-min开始,向内存中依次写入P次16个字节的待复制数据。
[0044]可选地,对于min小于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中的步骤包括:
[0045]从目的地址rdi开始,向内存中写入min个字节的待复制数据;
[0046]将待复制数据保存到内存中rdi+L-N开始的N个字节中的步骤包括:
[0047]从rdi+L-min开始,向内存中写入min个字节的待复制数据。
[0048]可选地,所述的方法还包括:
[0049]如果长度L大于或等于第一长度阈值,则判断长度L是否大于第二长度阈值;
[0050]当长度L不大于第二长度阈值时,将待复制数据保存到内存中rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;
[0051 ] 将目的地址32字节对齐;
[0052]将待复制数据保存到内存中目的地址rdi开始的CL个字节中;保存后将rdi增加CL个字节,将L减去CL;
[0053]判断L是否小于CL,如果是,则完成复制;如果不是则返回所述将待复制数据保存到内存中目的地址rdi开始的CL个字节中的步骤。
[0054]本申请还提供了一种内存复制方法,包括:
[0055]判断待复制内存的长度L是否小于第一长度阈值;
[0056]当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0057]从所述待复制内存的源地址rsi开始复制min个字节,从rsi+L-N处开始复制N个字节;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L ^ N ^ max—min。
[0058]本申请还提供了一种内存复制装置,包括:
[0059]第一判断单元,用于判断待复制内存的长度L是否小于第一长度阈值;
[0060]第二判断单元,用于当所述第一判断单元的判断结果为长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0061]第一复制单元,用于从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;从rsi+L-N开始,复制N个字节到rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L ^ N ^ max—min。
[0062]可选地,所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
[0063]可选地,所述第一长度阈值为256字节。
[0064]可选地,所述多个预定的长度区间包括8个长度区间,第i个长度区间的上、下限值分别为2--、2Η ;所述N为所确定的长度区间的min。
[0065]可选地,对于min大于或等于16的长度区间,所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中是指:
[0066]所述第一复制单元从所述待复制内存的源地址rsi开始,依次复制P次16个字节到目的地址rdi开始的内存中;P为min除以16的商;
[0067]所述第一复制单元从rsi+L-N开始,复制N个字节到rdi+L-N开始的N个字节中是指:
[0068]所述第一复制单元从rsi+L-min开始,依次复制P次16个字节到rdi+L-N开始的内存中。
[0069]可选地,对于min小于16的长度区间,所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中是指:
[0070]所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;
[0071]所述第一复制单元从rsi+L-N开始,复制N个字节到rdi+L-N开始的N个字节中是指:
[0072]所述第一复制单元从rsi+L-min开始,复制min个字节到rdi+L-min开始的min个字节中。
[0073]可选地,所述的装置还包括:
[0074]第三判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,判断长度L是否大于第二长度阈值;
[0075]第二复制单元,用于当所述第三判断单元的判断结果为长度L不大于第二长度阈值时,从rsi+L-CL开始,复制CL个字节到rdi+L_CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;
[0076]地址对齐单元,用于将目的地址32字节对齐;
[0077]第三复制单元,用于从rsi开始复制CL个字节到rdi开始的CL个字节中;复制后将rsi和rdi各增加CL个字节,将L减去CL ;
[0078]第四判断单元,用于判断L是否小于CL,如果是,则完成复制;如果不是则指示所述第三复制单元再次进行从rsi开始复制CL个字节到rdi开始的CL个字节中的操作。
[0079]可选地,所述第二长度阈值为2048个字节,所述CL为128个字节。
[0080]本申请还提供了一种内存复制装置,包括:
[0081]第一判断单元,用于判断用于保存待复制数据的内存的长度L是否小于第一长度阈值;
[0082]第二判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0083]第一复制单元,用于将待复制数据保存到内存中目的地址rdi开始的min个字节中;将待复制数据保存到内存中rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
[0084]可选地,所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
[0085]可选地,所述多个预定的长度区间的上、下限值分别为2Μ、2η ;所述N为所确定的长度区间的min ;i为正整数且21等于所述第一长度阈值。
[0086]可选地,所述第一复制单元对于min大于或等于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中是指:
[0087]所述第一复制单元从目的地址rdi开始,向内存中依次写入P次16个字节的待复制数据;P为min除以16的商;
[0088]所述第一复制单元将待复制数据保存到内存中rdi+L-N开始的N个字节中是指:
[0089]所述第一复制单元从rdi+L-min开始,向内存中依次写入P次16个字节的待复制数据。
[0090]可选地,对于min小于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中是指:
[0091]从目的地址rdi开始,向内存中写入min个字节的待复制数据;
[0092]将待复制数据保存到内存中rdi+L-N开始的N个字节中是指:
[0093]从rdi+L-min开始,向内存中写入min个字节的待复制数据。
[0094]可选地,所述的装置还包括:
[0095]第三判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,判断长度L是否大于第二长度阈值;
[0096]第二复制单元,用于当所述第三判断单元的判断结果为长度L不大于第二长度阈值时,将待复制数据保存到内存中rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;
[0097]地址对齐单元,用于将目的地址32字节对齐;
[0098]第三复制单元,用于将待复制数据保存到内存中目的地址rdi开始的CL个字节中;保存后将rdi增加CL个字节,将L减去CL ;
[0099]第四判断单元,用于判断L是否小于CL,如果是,则完成复制;如果不是则指示所述第三复制单元进行所述将待复制数据保存到内存中目的地址rdi开始的CL个字节中的操作。
[0100]本申请还提供了一种内存复制装置,包括:
[0101]第一判断单元,用于判断待复制内存的长度L是否小于第一长度阈值;
[0102]第二判断单元,用于当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0103]第一复制单元,用于从所述待复制内存的源地址rsi开始复制min个字节,从rsi+L-N处开始复制N个字节;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,? L ^ N ^ max-min。
[0104]本申请的至少一种实施方式通过冗余复制,尽量减少内存复制过程中跳转指令的使用,从而可减少指令预测错误,提高复制性能。在本申请的又一实施方式中,对待复制内存长度小于第一长度阈值的情况、位于第一、第二长度阈值之间的情况、以及大于第二长度阈值的情况,针对各情况的特点分别提出了各自的复制策略,避免了全采用一种复制策略有可能不利于某些情况提高复制性能的问题。在本申请的又一实施方式中,对于每次按照固定字节复制后的剩余字节进行了巧妙的处理,避免了跳转指令的加入。当然,实施本申请的任一产品必不一定需要同时达到以上所述的所有优点。
【专利附图】
【附图说明】
[0105]图1是实施例一的一种内存复制方法的流程示意图;
[0106]图2a和图2b是实施例一中步骤S103的执行示意图;
[0107]图3是实施例一的一种实施方式的流程示意图;
[0108]图4是实施例一中步骤S105的执行示意图;
[0109]图5是实施例一中步骤S107在一备选方案中的具体流程示意图。
【具体实施方式】
[0110]下面将结合附图及实施例对本申请的技术方案进行更详细的说明。
[0111]需要说明的是,如果不冲突,本申请实施例以及实施例中的各个特征可以相互结合,均在本申请的保护范围之内。另外,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0112]在一个典型的配置中,进行内存复制操作的计算设备可包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
[0113]内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
[0114]计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM),快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0115]实施例一,一种内存复制方法,如图1所示,包括:
[0116]S101、判断待复制内存的长度L是否小于第一长度阈值,当长度L小于第一长度阈值时进行步骤S102 ;
[0117]S102、在多个预定的长度区间中,确定长度L对应的长度区间;
[0118]S103、从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;从rsi+L-N个字节处开始,复制N个字节到rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为大于或等于max-min、且小于或等于L的固定整数。
[0119]每次进行内存复制时,待复制内存的长度、源地址和目的地址都是确定的,可以但不限于通过内存复制函数中设定的参数得知上述长度L、源地址rsi和目的地址rdi。
[0120]本实施例中,步骤S103从从rsi+L-N个字节处开始复制N个字节,相当于从待复制内存的终点(rsi+L-Ι)开始往rsi的方向复制N个字节,且复制的字节数不大于L并至少为max-min个,这样可以在不加入跳转指令的情况下,保证复制的都是待复制内存,并保证待复制内存每个字节都被复制,具体分析如下。
[0121]L等于max时的情况如图2a所示,步骤S103中一方面从rsi开始复制min个字节(即复制到图2a中的rsi+min-1处),另一方面还从本次复制的终点rsi+L-Ι (即图2a中的rsi+max-1)开始,向rsi所在的方向复制N个字节(当N=max_min时,即复制图2a中从rsi+min到rsi+max-1的内存);图2a中的箭头仅用于说明计算字节个数的方向。可见,步骤S103可将rsi到rsi+max-Ι这个范围里的内存都复制到,且所复制的内存都属于这个范围。
[0122]L小于max时的情况如图2b所示,步骤103中一方面会从rsi开始复制min个字节(即复制到图2b中的rsi+min-1处),另一方面还从本次复制的终点rsi+L-Ι开始,向rsi所在的方向复制N个字节(即复制图2b中从rsi+L-N到rsi+L-Ι的内存);图2b中的箭头仅用于说明计算字节个数的方向。可见,步骤S103同样可将rsi到rsi+max-Ι这个范围里的内存都复制到,且所复制的内存未超出该范围;而且步骤S103中将有至少min-L+N个字节的内存会被复制两次;当N=max-min时,即:有max_L个字节被复制两次。
[0123]从上述分析可知,本实施例通过巧妙的设计,当复制长度小于第一长度阈值的内存时,通过部分冗余复制的代价,换取了在复制中不使用任何跳转指令的优势,这样可有效减少预测错误所带来的延误;经过测试,本实施方式在复制长度小于第一长度阈值的内存时,可大大减少跳转指令的预测错误,提高复制操作的性能。
[0124]本实施例的一种实施方式中,所述N为大于或等于max-min、且最接近max-min的2的整数次幂。比如max-min为31,则N为32 ;max-min为6,则N为8。
[0125]该实施方式的一种备选方案中,可以为不同的长度区间分别预设对应的N值;根据确定的长度区间就可以得到N的值。
[0126]本实施例的一种实施方式中,步骤S103中,复制内存时通过寄存器进行中转。其它实施方式中,也可以直接复制或采用其它方式中转。
[0127]本实施例的一种实施方式中,所述多个预定的长度区间所包含的长度值依次相连但互不重叠,且该多个预定的长度区间中长度值的总集合可覆盖从I至所述第一长度阈值减I的整个范围。
[0128]本实施例的一种实施方式中,所述第一长度阈值可以但不限于为256字节。在其它实施方式中,也可以根据经验或试验结果,找出复制性能受跳转指令预测正确率影响较大的长度范围,以确定所述第一长度阈值;对于小于第一长度阈值的长度,按照上述步骤S103复制,就可以不采用跳转指令。
[0129]该实施方式的一种备选方案中,所述多个预定的长度区间包括8个长度区间,第i个长度区间的上、下限值分别为2--、2Η,即所述多个预定的长度区间划分如下:
[0130]第I个长度区间为[1,I];
[0131]第2个长度区间为[2,3];
[0132]第3个长度区间为[4,7];
[0133]第4个长度区间为[8,15];
[0134]第5个长度区间为[16,31];
[0135]第6个长度区间为[32,63];
[0136]第7个长度区间为[64,127];
[0137]第8个长度区间为[128,255](长度L等于256时也可以按照步骤S103进行复制,如果这样的话,该长度区间相应改为[128,256])。
[0138]对于上述8个长度区间,N依次为:1、2、4、8、16、32、64、128,也就是等于各长度区间的min。
[0139]本实施例对于长度L为O时的情况也可以一样进行处理,可以将长度L=O对应于长度区间[0,O],将长度L=O时的N设置为O。
[0140]在其它备选方案中,也可以按照别的方式划分长度区间;比如可以将上述8个长度区间进行任意的合并;再比如将各长度区间的上、下限各加I ;还可以将各长度区间的上、下限值定为其它值。
[0141]本备选方案中,对于min大于或等于16的长度区间,从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中的步骤具体可以包括:
[0142]从所述待复制内存的源地址rsi开始,依次复制P次16个字节到目的地址rdi开始的内存中;P Smin除以16的商;
[0143]从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中的步骤具体可以包括:
[0144]从rsi+L-min开始,依次复制P次16个字节到rdi+L-N开始的内存中。
[0145]本备选方案中,对于min小于16的长度区间,从所述待复制内存的源地址的起始位置rsi开始,复制min个字节到目的地址的步骤具体可以包括:
[0146]从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的内存中;
[0147]从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中的步骤具体可以包括:
[0148]从rsi+L-min开始,复制min个字节到rdi+L-min开始的内存中。
[0149]本备选方案中,对于min大于或等于16的长度区间,复制时采用四个同样大小的16字节寄存器即可。对于min小于16的长度区间,复制时采用两个和min —样大小的寄存器(即8字节、4字节、2字节、I字节的寄存器)即可。本备选方案选择每次复制16字节的寄存器是因为每4次内存操作最多产生一次跨越缓存行的情况(缓存行为64字节),同时可以最大限度利用寄存器的容量,根据这个原因,如果复制的字节大于16字节,则选择16字节寄存器,而不是32字节寄存器或者8字节寄存器,32字节寄存器会导致更频繁的跨越缓存行的现象(几乎每两次操作产生一次跨越缓存行),8字节寄存器则每次只能使用8个字节因此需要更多的内存操作指令。因此,该备选方案中可以一次性完成内存的复制,进一步提高了复制的性能。当然,在其它备选方案中,也可以使用其它大小的寄存器,比如32字节寄存器、8字节寄存器等。
[0150]在一个具体的例子中,所确定的长度区间为32?63,N为32,P为2,代码如下所示,其中rdx即前文的长度L,/**/中为代码功能的解释。
[0151]cmp$32, %rdx/*比较需复制字节长度是否于32*/
[0152]jb L(less_32bytes)/*如果需复制字节长度小于32则离开,下面将复制介于32?63个字节*/
[0153]vmovups (%rsi), %xmm0/* 复制 rsi 开始的 16 个字节到寄存器 xmmO*/
[0154]vmovupsOxlO (%rsi), 0/oxmm1 /* 复制(rsi+16)开始的 16 个字节到寄存器 xmml */
[0155]vmovups-0x20 (%rdx, %rsi), 0/oxmm2/* 复制(rsi+rdx-32)开始的 16 个字节到寄存器 xmm2*/
[0156]vmovups-OxlO (%rdx, %rsi), %xmm3/* 复制(rsi+rdx-16)开始的 16 个字节到寄存器 xmm3*/
[0157]vmovups%xmmO, (%rdi) /*把寄存器xmmO的数据复制到rdi开始的16个字节中*/
[0158]vmovups%xmml, OxlO (%rdi)/* 把寄存器 xmml 的数据复制到(rdi+16)开始的 16 个子节中*/
[0159]vmovups%xmm2,-0x20 (%rdx, %rdi)/* 把寄存器 xmm2 的数据复制到(rdx+rdi —32)开始的16个字节中*/
[0160]vmovups%xmm3,-OxlO (%rdx, %rdi)/* 把寄存器 xmm3 的数据复制到(rdx+rdi —16)开始的16个字节中*/
[0161]retq/* 代码返回 */
[0162]上面的代码可以复制32?63字节内存而不需要任何跳转指令(64字节的情况也可适用上述代码),这样有效减少了跳转指令的使用。其它长度区间的情况可以类推,这里不再赘述。
[0163]本备选方案中,步骤S102具体可以包括:
[0164]21、各长度空间的下限值按照从大到小的顺序排列,将最大下限值作为当前下限值;
[0165]22、判断长度L是否小于所述当前下限值,如果不小于(即大于或等于)则确定长度L对应于该下限值所属的长度空间;如果小于则将下一个下限值作为当前下限值,返回步骤22。
[0166]比如先判断L是否小于128个字节,如果不小于128个字节则确定长度L对应的长度空间是[128,255],如果小于128个字节则继续判断L是否小于64个字节;如果不小于64个字节则确定长度L对应的长度空间是[64,127],如果小于64个字节则继续判断L是否小于32个字节;如果不小于32个字节则确定长度L对应的长度空间是[32,63],如果小于32个字节则继续判断L是否小于16个字节……以此类推。
[0167]步骤21、22只是步骤S102的一种具体实现方案,实现时可以有多种变形;比如将判断条件中的“小于”改为“大于”,并相应改变不同判断结果(“是”或“否”)对应的后续步骤。
[0168]步骤S102中也可以采用别的方式确定长度L对应的长度区间,比如可以采用不同的判断顺序:例如先判断L是否小于16,如果不小于,则进一步依次判断是否小于32、64、128,一旦出现“小于”的判断结果,就可以确定L对应的长度空间;如果小于,则进一步依次判断是否小于8、4、2,一旦出现“不小于”的判断结果就可以确定L对应的长度区间。这样当长度L较小时,例如12个字节时,只需判断两次即可确定对应的长度区间。再比如可以预先在配置文件中保存各种长度L和长度区间的对应关系,根据长度L就可以直接查知所对应的长度区间。
[0169]当长度区间的上、下限不同于本备选方案时,步骤S102中进行判断时的条件或数值相应变化即可,这里不再赘述。
[0170]本实施例的一种实施方式中,如图3所示,所述方法还可以包括:
[0171]如果步骤SlOl中判断长度L大于或等于第一长度阈值,则进行步骤S104 ;
[0172]S104、判断长度L是否大于第二长度阈值,当长度L不大于第二长度阈值时进行步骤 S105 ;
[0173]S105、从rsi+L-CL开始,复制CL个字节到rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;比如第一长度阈值为256时,CL 为 128 ;
[0174]S106、将目的地址32字节对齐;
[0175]S107、从rsi开始复制CL个字节到rdi开始的CL个字节中;复制后将rsi和rdi各增加CL个字节;将L减去CL后判断L是否小于CL,如果是,则完成复制;如果不是则返回步骤S107。
[0176]本实施方式中,由于长度L不一定恰好是CL的整数倍,这就意味着如果每次复制CL个字节,那么会有部分待复制内存未被复制;如果用前述的步骤SlOl?S103或其它方式来复制这部分剩余内存,则需要加入跳转指令。
[0177]而加入步骤S105则可避免在复制剩余内存时使用跳转指令。如图4所示,假设L除以CL的商向下取整的结果为M,那么在从rsi开始复制了 M次CL个字节后(即复制到图4中rsi+MXCL-Ι的位置),还会有L-MX CL个字节未被复制;而步骤S105复制了从rsi+L-CL到rsi+L-Ι (即终点)的CL个字节,由于L-MXCL小于CL,所以步骤S105复制的内存必然包括每次复制CL字节后剩余的内存。可见,步骤S105通过部分冗余复制(从rsi+L-CL到rsi+MXCL-Ι的内存),来避免使用跳转指令,从而提高了复制的性能。
[0178]本实施方式中,由于只有步骤S107中一个跳转指令,且该跳转指令在复制L个字节的过程中,只有最后一次的判断结果为“是”,因此可以减少指令预测失败;该实施方式也避免了 Intel快数据复制进行复制时“预热”所带来的额外延迟。
[0179]本实施方式中,步骤S106中将目的地址对齐,可以使后面拷入内存的操作不会产生跨缓存行的现象。这个步骤要求复制的内存长度一定大于至少一次循环复制的字节数(范围需要大于或等于160,比如下面循环一次需要复制128个字节,如果复制的时候仅仅是128个字节,经过目的地址对齐操作那么就很有可能导致剩余需复制字节数小于128,因此就不能进行复制128字节的循环操作);当第一长度阈值为160或更大的数值时,就可以确保进行步骤S106时,待复制内存的长度L是足够的。
[0180]本实施方式的一种备选方案中,所述第二长度阈值为2048个字节。其它备选方案中,也可以根据经验或试验结果,找出复制性能受Intel快数据复制预热时间影响较大的长度范围,以确定所述第二长度阈值;对于大于或等于第一长度阈值、小于第二长度阈值的长度,按照本实施方式进行复制,可避免预热带来的延迟,虽然使用了一次跳转指令,但对于该部分长度的数据而言,复制性能仍好于采用Intel快数据复制时的性能。
[0181]本实施方式的一种备选方案中,所述CL为128个字节。
[0182]在本备选方案的一个具体的例子中,步骤S105可以分为多个步骤完成,每个步骤中复制16个字节,一共复制8次,代码如下,其中rdx为长度L:
[0183]Vmovups-0x80 (%rsi+%rdx), %xmm8/* 复制(rsi+rdx-128)开始的 16 字节到寄存器xmm8^/
[0184]Vmovups_0x70 (%rsi+%rdx),%xmm9A 复制(rsi+rdx-112)开始的 16 字节到寄存器xmm9^/
[0185]Vmovups_0x60 (%rsi+%rdx),%xmmlOA 复制(rsi+rdx-96)开始的 16 字节到寄存器
xmmlO氺/
[0186]Vmovups_0x50 (%rsi+%rdx),%xmmllA 复制(rsi+rdx-80)开始的 16 字节到寄存器xmml1^/
[0187]Vmovups_0x40 (%rsi+%rdx),%xmml2A 复制(rsi+rdx-64)开始的 16 字节到寄存器
xmml2氺/
[0188]Vmovups_0x30 (%rsi+%rdx),%xmml3A 复制(rsi+rdx-48)开始的 16 字节到寄存器
xmml3氺/
[0189]Vmovups_0x20 (%rsi+%rdx),%xmml4A 复制(rsi+rdx-32)开始的 16 字节到寄存器xmml4V
[0190]Vmovups-OxlO (%rsi+%rdx),%xmml5A 复制(rsi+rdx-16)开始的 16 字节到寄存器
xmml5氺/
[0191]Vmovups%xmm8,_0x80(%rdi+%rdx) A 把寄存器 xmm8 数据复制到(rdi+rdx-128)开始的16个字节中*/
[0192]Vmovups%xmm9,-0x70(%rdi+%rdx)A 把寄存器 xmm8 数据复制到(rdi+rdx-112)开始的16个字节中*/
[0193]Vmovups%xmmlO,_0x60(%rdi+%rdx)/* 把寄存器 x_8 数据复制到(rdi+rdx-96)开始的16个字节中*/
[0194]Vmovups%xmmll,_0x50(%rdi+%rdx)/* 把寄存器 x_8 数据复制到(rdi+rdx-80)开始的16个字节中*/
[0195]Vmovups%xmml2,-0x40(%rdi+%rdx)A把寄存器 xmm8 数据复制到(rdi+rdx-64)开始的16个字节中*/
[0196]Vmovups%xmml3,_0x30(%rdi+%rdx)/*把寄存器 x_8 数据复制到(rdi+rdx-48)开始的16个字节中*/
[0197]Vmovups%xmml4,_0x20(%rdi+%rdx)/* 把寄存器 x_8 数据复制到(rdi+rdx-32)开始的16个字节中*/
[0198]Vmovups%xmml5,_OxlO(%rdi+%rdx)/*把寄存器 x_8 数据复制到(rdi+rdx-16)开始的16个字节中*/
[0199]该备选方案中,步骤S107如图5所示,具体可以包括:
[0200]51、复制从rsi开始的128个字节到rdi开始的128个字节中;
[0201]52、将 rsi 和 rdi 各向前移位 128 个字节(即:rsi=rsi+128 ;rdi=rdi+128),将 L 减去 128 ;
[0202]53、判断L是否小于128 ;如果是,则完成复制;如果不是,则返回步骤51。
[0203]本实施方式的一种备选方案中,所述步骤S104还可以包括:
[0204]当长度L大于第二长度阈值时釆用Intel快数据复制。
[0205]比如用以下代码实现:
[0206]mov%rdx, %rcx/*将需复制的内存长度放入寄存器%rcx*/
[0207]rep movsb/*CPU会将解码该指令,变为更多复制内存操作*/
[0208]ret/*复制操作结束*/
[0209]实施例二,一种内存复制装置,包括:
[0210]第一判断单元,用于判断待复制内存的长度L是否小于第一长度阈值;
[0211]第二判断单元,用于当所述第一判断单元的判断结果为长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0212]第一复制单元,用于从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L ^ N ^ max—min。
[0213]本实施例的一种实施方式中,所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
[0214]本实施例的一种实施方式中,所述第一长度阈值可以为256字节。
[0215]本实施方式的一种备选方案中,所述多个预定的长度区间可以包括8个长度区间,第i个长度区间的上、下限值分别为2--、2Η ;所述N可以为所确定的长度区间的min。
[0216]该备选方案中,对于min大于或等于16的长度区间,所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中具体可以是指:
[0217]所述第一复制单元从所述待复制内存的源地址rsi开始,依次复制P次16个字节到目的地址rdi开始的内存中;P为min除以16的商;
[0218]所述第一复制单元从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中具体可以是指:
[0219]所述第一复制单元从rsi+L-min开始,依次复制P次16个字节到rdi+L-N开始的内存中。
[0220]该备选方案中,对于min小于16的长度区间,所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中具体可以是指:
[0221]所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;
[0222]所述第一复制单元从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中具体可以是指:
[0223]所述第一复制单元从rsi+L-min开始,复制min个字节到rdi+L-min开始的min个字节中。
[0224]本实施例的一种备选方案中,所述的装置还可以包括:
[0225]第三判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,判断长度L是否大于第二长度阈值;
[0226]第二复制单元,用于当所述第三判断单元的判断结果为长度L不大于第二长度阈值时,从rsi+L-CL开始,复制CL个字节到rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;
[0227]地址对齐单元,用于将目的地址32字节对齐;
[0228]第三复制单元,用于从rsi开始复制CL个字节到rdi开始的CL个字节中;复制后将rsi和rdi各增加CL个字节,将L减去CL ;
[0229]第四判断单元,用于判断L是否小于CL,如果是,则完成复制;如果不是则指示所述第三复制单元再次进行从rsi开始复制CL个字节到rdi开始的CL个字节中的操作。
[0230]本实施方式的一种备选方案中,所述第二长度阈值可以为2048个字节,所述CL可以为128个字节。
[0231]其它实现细节可参考实施例一。
[0232]实施例三、一种内存复制方法,包括:
[0233]判断用于保存待复制数据的内存的长度L是否小于第一长度阈值;
[0234]当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0235]将待复制数据保存到内存中目的地址rdi开始的min个字节中;将待复制数据保存到内存中rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
[0236]本实施例可适用于将寄存器或其它存储空间中的数据复制进内存的情况,比如将一个16字节寄存器中的数据写入64字节的内存中(即:写入后该64字节的内存中依次保存了 4段相同的数据,每段16个字节,和寄存器中数据相同),则64就是所述的长度L,写入开始的位置就是目的地址rdi。
[0237]本实施例通过巧妙的设计,当长度小于第一长度阈值时,通过部分冗余复制的代价,换取了在向内存中复制数据的过程中不使用任何跳转指令的优势,这样可有效减少预测错误所带来的延误。
[0238]本实施例的一种实施方式中,所述N可以为大于或等于max-min、且最接近max-min的2的整数次幂。
[0239]本实施例的一种实施方式中,可以根据经验或试验结果,找出复制性能受跳转指令预测正确率影响较大的长度范围,将其中最大的长度作为第一长度阈值;对于小于第一长度阈值的长度,按照本实施例的方法复制,就可以不采用跳转指令。在一种备选方案中,所述第一长度阈值可以为256。
[0240]本实施例的一种实施方式中,所述多个预定的长度区间所包含的长度值依次相连但互不重叠,且该多个预定的长度区间中长度值的总集合可覆盖从I至所述第一长度阈值减I的整个范围。
[0241]本实施例的一种实施方式中,所述多个预定的长度区间的上、下限值可以分别为2--、2Η ;所述N为所确定的长度区间的min ;i为正整数且21等于所述第一长度阈值。
[0242]本实施例的一种实施方式中,对于min大于或等于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中的步骤具体可以包括:
[0243]从目的地址rdi开始,向内存中依次写入P次16个字节的待复制数据;P为min除以16的商;
[0244]将待复制数据保存到内存中rdi+L-N开始的N个字节中的步骤具体可以包括:
[0245]从rdi+L-min开始,向内存中依次写入P次16个字节的待复制数据。
[0246]在本实施方式的一个具体的例子中,一个16字节寄存器xmmO作为待复制数据的数据源,所确定的长度区间为32?63,N为32,P为2,代码如下所示,其中rdx即前文的长度L,/**/中为代码功能的解释。
[0247]vmovups%xmmO, (%rdi)/*把寄存器xmmO的数据复制到内存中目的地址rdi开始的16个字节中*/
[0248]vmovups%xmmO, OxlO (%rdi) /*把寄存器xmmO数据复制到内存中(rdi+16)开始的16个字节中*/
[0249]vmovups%xmmO,-0x20 (%rdx, %rdi)/* 把寄存器 xmmO 数据复制到内存中(rdx+rd1-32)开始的16个字节中*/
[0250]vmovups%xmmO,-OxlO (%rdx, %rdi)/* 把寄存器 xmmO 数据复制到内存中(rdx+rd1-16)开始的16个字节中*/
[0251]retq/* 代码返回 */
[0252]本实施例的一种实施方式中,对于min小于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中的步骤具体可以包括:
[0253]从目的地址rdi开始,向内存中写入min个字节的待复制数据;
[0254]将待复制数据保存到内存中rdi+L-N开始的N个字节中的步骤具体可以包括:
[0255]从rdi+L-min开始,向内存中写入min个字节的待复制数据。
[0256]本实施例的一种实施方式中,所述的方法还可以包括:
[0257]如果长度L大于或等于第一长度阈值,则判断长度L是否大于第二长度阈值;
[0258]当长度L不大于第二长度阈值时,将待复制数据保存到内存中rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;
[0259]将目的地址32字节对齐;
[0260]将待复制数据保存到内存中目的地址rdi开始的CL个字节中;保存后将rdi增加CL个字节,将L减去CL;
[0261]判断L是否小于CL,如果是,则完成复制;如果不是则返回所述将待复制数据保存到内存中目的地址rdi开始的CL个字节中的步骤。
[0262]本实施方式的一种备选方案中,所述方法还可以包括:
[0263]当长度L大于第二长度阈值时采用Intel快数据复制。
[0264]本实施方式中,可以根据经验或试验结果,找出复制性能受Intel快数据复制预热时间影响较大的长度范围,以确定所述第二长度阈值;对于大于或等于第一长度阈值、小于第二长度阈值的长度,按照本实施方式进行复制,可避免预热带来的延迟,虽然使用了一次跳转指令,但对于该部分长度的数据而言,复制性能仍好于采用Intel快数据复制时的性能。
[0265]本实施方式的一种备选方案中,所述CL可以为128个字节。
[0266]在本备选方案的一个具体的例子中,该例子中也是以一个16字节寄存器xmmO作为待复制数据的数据源,代码如下所示,其中rdx即前文的长度L,/**/中为代码功能的解释。
[0267]Vmovups%xmmO,-0x80 (%rdi+%rdx)/* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-128)开始的16个字节中*/
[0268]Vmovups%xmmO, -0x70 (%rdi+%rdx) /* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-112)开始的16个字节中*/
[0269]Vmovups%xmmO,-0x60 (%rdi+%rdx)/* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-96)开始的16个字节中*/
[0270]Vmovups%xmmO,-0x50 (%rdi+%rdx)/* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-80)开始的16个字节中*/
[0271]Vmovups%xmmO,-0x40 (%rdi+%rdx)/* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-64)开始的16个字节中*/
[0272]Vmovups%xmmO,-0x30 (%rdi+%rdx)/* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-48)开始的16个字节中*/
[0273]Vmovups%xmmO,-0x20 (%rdi+%rdx)/* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-32)开始的16个字节中*/
[0274]Vmovups%xmmO,-OxlO (%rdi+%rdx)/* 把寄存器 xmmO 数据复制到内存中(rdi+rdx-16)开始的16个字节中*/
[0275]其它实现细节可参考实施例一。
[0276]实施例四、一种内存复制装置,包括:
[0277]第一判断单元,用于判断用于保存待复制数据的内存的长度L是否小于第一长度阈值;
[0278]第二判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0279]第一复制单元,用于将待复制数据保存到内存中目的地址rdi开始的min个字节中;将待复制数据保存到内存中rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
[0280]本实施例的一种实施方式中,所述N可以为大于或等于max-min、且最接近max-min的2的整数次幂。
[0281]本实施例的一种实施方式中,所述多个预定的长度区间的上、下限值可以分别为2--、2Η ;所述N为所确定的长度区间的min ;i为正整数且21等于所述第一长度阈值。
[0282]本实施例的一种实施方式中,所述第一复制单元对于min大于或等于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中具体可以是指:
[0283]所述第一复制单元从目的地址rdi开始,向内存中依次写入P次16个字节的待复制数据;P为min除以16的商;
[0284]所述第一复制单元将待复制数据保存到内存中rdi+L-N开始的N个字节中具体可以是指:
[0285]所述第一复制单元从rdi+L-min开始,向内存中依次写入P次16个字节的待复制数据。
[0286]本实施例的一种实施方式中,对于min小于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中具体可以是指:
[0287]从目的地址rdi开始,向内存中写入min个字节的待复制数据;
[0288]将待复制数据保存到内存中rdi+L-N开始的N个字节中具体可以是指:
[0289]从rdi+L-min开始,向内存中写入min个字节的待复制数据。
[0290]本实施例的一种实施方式中,所述的装置还包括:
[0291]第三判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,判断长度L是否大于第二长度阈值;
[0292]第二复制单元,用于当所述第三判断单元的判断结果为长度L不大于第二长度阈值时,将待复制数据保存到内存中rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂;
[0293]地址对齐单元,用于将目的地址32字节对齐;
[0294]第三复制单元,用于将待复制数据保存到内存中目的地址rdi开始的CL个字节中;保存后将rdi增加CL个字节,将L减去CL ;
[0295]第四判断单元,用于判断L是否小于CL,如果是,则完成复制;如果不是则指示所述第三复制单元进行将待复制数据保存到内存中目的地址rdi开始的CL个字节中的操作。
[0296]其它实现细节可参考实施例一至三。
[0297]实施例五、一种内存复制方法,包括:
[0298]判断待复制内存的长度L是否小于第一长度阈值;
[0299]当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0300]从所述待复制内存的源地址rsi开始复制min个字节,从rsi+L-N处开始复制N个字节;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L ^ N ^ max—min。
[0301]本实施例可适用于将内存中的数据复制进寄存器或其它存储空间的情况,比如将内存中的64字节依次复制进4个16字节寄存器,则64就是所述的长度L,64字节中首字节的位置就是源地址rdi。
[0302]本实施例通过巧妙的设计,当长度小于第一长度阈值时,通过部分冗余复制的代价,换取了在内存复制的过程中不使用任何跳转指令的优势,这样可有效减少预测错误所带来的延误。
[0303]其它实现细节可参考实施例一。
[0304]实施例六、一种内存复制装置,包括:
[0305]第一判断单元,用于判断待复制内存的长度L是否小于第一长度阈值;
[0306]第二判断单元,用于当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间;
[0307]第一复制单元,用于从所述待复制内存的源地址rsi开始复制min个字节,从rsi+L-N处开始复制N个字节;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,? L ^ N ^ max-min。
[0308]其它实现细节可参考实施例一和二。
[0309]本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本申请不限制于任何特定形式的硬件和软件的结合。
[0310]当然,本申请还可有其他多种实施例,在不背离本申请精神及其实质的情况下,熟悉本领域的技术人员当可根据本申请作出各种相应的改变和变形,但这些相应的改变和变形都应属于本申请的权利要求的保护范围。
【权利要求】
1.一种内存复制方法,包括: 判断待复制内存的长度L是否小于第一长度阈值; 当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间; 从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
2.如权利要求1所述的方法,其特征在于: 所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
3.如权利要求1所述的方法,其特征在于: 所述第一长度阈值为256字节。
4.如权利要求2所述的方法,其特征在于: 所述多个预定的长度区间包括8个长度区间,第i个长度区间的上、下限值分别为2'-1>2^ ;所述N为所确定的长度区间的min。
5.如权利要求4所述的方法,其特征在于,对于min大于或等于16的长度区间,所述从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中的步骤包括: 从所述待复制内存的源地址rsi开始,依次复制P次16个字节到目的地址rdi开始的内存中;P为min除以16的商; 从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中的步骤包括: 从rsi+L-min开始,依次复制P次16个字节到rdi+L-N开始的内存中。
6.如权利要求4所述的方法,其特征在于,对于min小于16的长度区间,所述从所述待复制内存的源地址的起始位置rsi开始,复制min个字节到目的地址的步骤包括: 从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中; 从rsi+L-N处开始,复制N个字节到rdi+L-N开始的N个字节中的步骤包括: 从rsi+L-min开始,复制min个字节到rdi+L-min开始的min个字节中。
7.如权利要求1?6中任一项所述的方法,其特征在于,还包括: 如果长度L大于或等于第一长度阈值,则判断长度L是否大于第二长度阈值; 当长度L不大于第二长度阈值时,从rsi+L-CL开始,复制CL个字节到rdi+L_CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂; 将目的地址32字节对齐; 从rsi开始复制CL个字节到rdi开始的CL个字节中;复制后将rsi和rdi各增加CL个字节,将L减去CL ; 判断L是否小于CL,如果是,则完成复制;如果不是则返回所述从rsi开始复制CL个字节到rdi开始的CL个字节中的步骤。
8.如权利要求7所述的方法,其特征在于: 所述第二长度阈值为2048个字节,所述CL为128个字节。
9.一种内存复制方法,包括: 判断用于保存待复制数据的内存的长度L是否小于第一长度阈值; 当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间; 将待复制数据保存到内存中目的地址rdi开始的min个字节中;将待复制数据保存到内存中rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
10.如权利要求9所述的方法,其特征在于: 所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
11.如权利要求10所述的方法,其特征在于: 所述多个预定的长度区间的上、下限值分别为2--、2Η ;所述N为所确定的长度区间的min ;i为正整数且21等于所述第一长度阈值。
12.如权利要求11所述的方法,其特征在于,对于min大于或等于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中的步骤包括: 从目的地址rdi开始,向内存中依次写入P次16个字节的待复制数据;P为min除以16的商; 将待复制数据保存到内存中rdi+L-N开始的N个字节中的步骤包括: 从rdi+L-min开始,向内存中依次写入P次16个字节的待复制数据。
13.如权利要求11所述的方法,其特征在于,对于min小于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中的步骤包括: 从目的地址rdi开始,向内存中写入min个字节的待复制数据; 将待复制数据保存到内存中rdi+L-N开始的N个字节中的步骤包括: 从rdi+L-min开始,向内存中写入min个字节的待复制数据。
14.如权利要求9?13中任一项所述的方法,其特征在于,还包括: 如果长度L大于或等于第一长度阈值,则判断长度L是否大于第二长度阈值; 当长度L不大于第二长度阈值时,将待复制数据保存到内存中rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂; 将目的地址32字节对齐; 将待复制数据保存到内存中目的地址rdi开始的CL个字节中;保存后将rdi增加CL个字节,将L减去CL; 判断L是否小于CL,如果是,则完成复制;如果不是则返回所述将待复制数据保存到内存中目的地址rdi开始的CL个字节中的步骤。
15.—种内存复制方法,包括: 判断待复制内存的长度L是否小于第一长度阈值; 当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间; 从所述待复制内存的源地址rsi开始复制min个字节,从rsi+L_N处开始复制N个字节;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L ^ N ^ max—min。
16.—种内存复制装置,其特征在于,包括: 第一判断单元,用于判断待复制内存的长度L是否小于第一长度阈值; 第二判断单元,用于当所述第一判断单元的判断结果为长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间; 第一复制单元,用于从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中;从rsi+L-N开始,复制N个字节到rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L ^ N ^ max—min。
17.如权利要求9所述的装置,其特征在于: 所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
18.如权利要求9所述的装置,其特征在于: 所述第一长度阈值为256字节。
19.如权利要求11所述的装置,其特征在于: 所述多个预定的长度区间包括8个长度区间,第i个长度区间的上、下限值分别为2'-1>2^ ;所述N为所确定的长度区间的min。
20.如权利要求12所述的装置,其特征在于,对于min大于或等于16的长度区间,所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中是指: 所述第一复制单元从所述待复制内存的源地址rsi开始,依次复制P次16个字节到目的地址rdi开始的内存中;P为min除以16的商; 所述第一复制单元从rsi+L-N开始,复制N个字节到rdi+L-N开始的N个字节中是指: 所述第一复制单元从rsi+L-min开始,依次复制P次16个字节到rdi+L-N开始的内存中。
21.如权利要求12所述的装置,其特征在于,对于min小于16的长度区间,所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中是指: 所述第一复制单元从所述待复制内存的源地址rsi开始,复制min个字节到目的地址rdi开始的min个字节中; 所述第一复制单元从rsi+L-N开始,复制N个字节到rdi+L-N开始的N个字节中是指:所述第一复制单元从rsi+L-min开始,复制min个字节到rdi+L-min开始的min个字节中。
22.如权利要求9?14中任一项所述的装置,其特征在于,还包括: 第三判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,判断长度L是否大于第二长度阈值; 第二复制单元,用于当所述第三判断单元的判断结果为长度L不大于第二长度阈值时,从rsi+L-CL开始,复制CL个字节到rdi+L_CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂; 地址对齐单元,用于将目的地址32字节对齐; 第三复制单元,用于从rsi开始复制CL个字节到rdi开始的CL个字节中;复制后将rsi和rdi各增加CL个字节,将L减去CL ; 第四判断单元,用于判断L是否小于CL,如果是,则完成复制;如果不是则指示所述第三复制单元再次进行从rsi开始复制CL个字节到rdi开始的CL个字节中的操作。
23.如权利要求15所述的装置,其特征在于: 所述第二长度阈值为2048个字节,所述CL为128个字节。
24.一种内存复制装置,其特征在于,包括: 第一判断单元,用于判断用于保存待复制数据的内存的长度L是否小于第一长度阈值; 第二判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间; 第一复制单元,用于将待复制数据保存到内存中目的地址rdi开始的min个字节中;将待复制数据保存到内存中rdi+L-N开始的N个字节中;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且L彡N彡max-min。
25.如权利要求24所述的装置,其特征在于: 所述N为大于或等于max-min、且最接近max-min的2的整数次幂。
26.如权利要求25所述的装置,其特征在于: 所述多个预定的长度区间的上、下限值分别为2--、2Η ;所述N为所确定的长度区间的min ;i为正整数且21等于所述第一长度阈值。
27.如权利要求26所述的装置,其特征在于,所述第一复制单元对于min大于或等于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中是指: 所述第一复制单元从目的地址rdi开始,向内存中依次写入P次16个字节的待复制数据;P为min除以16的商; 所述第一复制单元将待复制数据保存到内存中rdi+L-N开始的N个字节中是指: 所述第一复制单元从rdi+L-min开始,向内存中依次写入P次16个字节的待复制数据。
28.如权利要求26所述的装置,其特征在于,对于min小于16的长度区间,所述将待复制数据保存到内存中目的地址rdi开始的min个字节中是指: 从目的地址rdi开始,向内存中写入min个字节的待复制数据; 将待复制数据保存到内存中rdi+L-N开始的N个字节中是指: 从rdi+L-min开始,向内存中写入min个字节的待复制数据。
29.如权利要求24?28中任一项所述的装置,其特征在于,还包括: 第三判断单元,用于当所述第一判断单元的判断结果为长度L大于或等于第一长度阈值时,判断长度L是否大于第二长度阈值; 第二复制单元,用于当所述第三判断单元的判断结果为长度L不大于第二长度阈值时,将待复制数据保存到内存中rdi+L-CL开始的CL个字节中,CL为小于第一长度阈值、且最接近该第一长度阈值的2的整数次幂; 地址对齐单元,用于将目的地址32字节对齐; 第三复制单元,用于将待复制数据保存到内存中目的地址rdi开始的CL个字节中;保存后将rdi增加CL个字节,将L减去CL ; 第四判断单元,用于判断L是否小于CL,如果是,则完成复制;如果不是则指示所述第三复制单元进行所述将待复制数据保存到内存中目的地址rdi开始的CL个字节中的操作。
30.一种内存复制装置,其特征在于,包括: 第一判断单元,用于判断待复制内存的长度L是否小于第一长度阈值; 第二判断单元,用于当长度L小于第一长度阈值时,在多个预定的长度区间中,确定长度L对应的长度区间; 第一复制单元,用于从所述待复制内存的源地址rsi开始复制min个字节,从rsi+L-N处开始复制N个字节;其中,所述max、min分别为所确定的长度区间的上、下限值;N为固定整数,且 L > N > max-min。
【文档编号】G06F12/04GK104281537SQ201310282831
【公开日】2015年1月14日 申请日期:2013年7月5日 优先权日:2013年7月5日
【发明者】马凌, 姚四海, 张磊 申请人:阿里巴巴集团控股有限公司