[发明专利]使用双字节序编译器优化代码有效
申请号: | 200980160069.8 | 申请日: | 2009-06-25 |
公开(公告)号: | CN102804142A | 公开(公告)日: | 2012-11-28 |
发明(设计)人: | M·Y·莱奥克 | 申请(专利权)人: | 英特尔公司 |
主分类号: | G06F9/45 | 分类号: | G06F9/45 |
代理公司: | 永新专利商标代理有限公司 72002 | 代理人: | 刘瑜;王英 |
地址: | 美国加*** | 国省代码: | 美国;US |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 使用 字节 编译器 优化 代码 | ||
背景技术
字节的排列顺序是数据存储和检索的属性,其中存储和检索支持多种访问大小(例如,8比特、16比特、32比特、64比特)。更细粒度的访问允许程序员看到在存储器中更大的访问存储字节的顺序。将大字节序变量以与小字节序变量相反的字节顺序存储在存储器中。以最低有效字节位于最低存储器字节地址的方式来存储小字节序变量。当存在于处理器寄存器中时,包含相同值的大字节序和小字节序变量是相同的。仅在存储器中的顺序是不同的。
16比特、32比特和64比特数据中的字节的顺序对程序员而言是可见的。在C编程语言中,程序员能够通过使用共用体(一种覆盖数据结构的类型)或者通过将指向多个字节的数据的指针转换为指向单个字节的指针,来访问字节。历史上,使用这些技术来提高性能。因此,在不同字节序的架构上运行的相同C/C++代码可能产生不同的结果。例如,对于C代码:int i=0x12345678;以及char c=*((char*)&i),如果代码在大字节序架构上编译和运行,则‘c’的值将是0x12,而如果代码在小字节序架构上编译和运行,其将是0x78。
使用双字节序(bi-endian)技术的编译器允许对初始针对大字节序架构开发的源代码进行编译,以在小字节序架构上运行。如果以特殊模式来编译代码,则在大多数情况下,该代码以与其在大字节序架构上编译和运行情况下其将工作的方式相同的方式来工作,即,在上面的示例中‘c’等于0x12。通过在将被指定为大字节序的数据加载和存储到存储器中之前添加“字节交换”操作来实现该行为。
使用双字节序技术的编译器通常用于编译遗留代码以在现代的小字节序架构上运行。程序员通常将所有的遗留代码标记为大字节序,而并非确定每个特定的数据块必须是大字节序还是小字节序。因此,编译器在数据的加载和存储之前添加字节交换,即使在其字节序对程序员而言并不重要的情况下。这不利地影响了性能。
附图说明
图1是根据本发明的一个实施例的用于执行字节交换消除的方法的流程图。
图2是根据本发明的一个实施例的用于通过控制数据字节顺序来优化代码的方法的流程图。
图3是根据本发明的一个实施例的用于存储性能统计的各种数据存储设备的框图。
图4是根据本发明的实施例的系统的框图。
具体实施方式
实施例可以基于域交换的概念通过消除字节交换操作/将字节交换操作移动到更冷的路径来提高所生成的代码的性能。此外,在可能时,实施例可以不考虑数据字节顺序类型的选择以提高性能。
如本文中所使用的,交换容忍(swap-tolerant)表达式是能够利用相对表达式来替代的正在被编译的代码的表达式,其中所述相对表达式对不同字节顺序的一些(或全部)参数进行操作并且产生相同或不同字节顺序的有效结果。作为某些示例,与常量(例如,x==0x12345678)的比较是交换容忍的,这是因为它具有相对部(y==0x78563412),如果对该相对部给予交换参数SWAP(x),则该相对部将产生与原始表达式相同的结果,其中,SWAP是执行字节交换操作的表达式。比特AND操作是交换容忍的,这是因为存在操作(相同的比特AND)使得采用交换参数将产生正确但不同字节顺序的结果。然而,算数(例如,+、-、*、/)操作不是交换容忍的,这是因为它们严格地要求特定字节顺序的数据并且在采用交换参数的情况下会产生错误的结果。
域是正在被编译的代码的一组表达式,而域入口是域外部的表达式,其结果用作属于该域的表达式的参数。域出口是采用属于该域的表达式的结果作为参数的域外部的表达式。交换容忍域是一组交换容忍表达式,其能够由其相对表达式替代,以使得如果一些(或所有)域入口被不同字节顺序的数据替代,则所有的域出口将是相同或不同字节顺序的有效结果。
域交换是正在被编译的代码的变换,其:(1)通过在必要的域入口和出口处放置或移除字节交换操作来改变一些或所有域入口和出口的字节顺序;以及(2)利用以不同字节顺序操作的相对表达式来替换域中的所有表达式,以使得保持代码语义。对于与入口和出口有关的域交换,如果该入口或出口表达式是字节交换的,则可以移除字节交换,否则可以插入字节交换。
作为示例,
T1=SWAP(A)
T2=SWAP(B)
RES=T1==T2
表达式“T1==T2”是交换容忍的域,表达式“SWAP(A)”和“SWAP(B)”是域入口,赋值“RES=”是域出口。针对该代码的域交换可以如下:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于英特尔公司,未经英特尔公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/200980160069.8/2.html,转载请声明来源钻瓜专利网。