首页> 中国专利> 使用双字节序编译器优化代码

使用双字节序编译器优化代码

摘要

在一个实施例中,一种方法包括识别字节交换操作,构建包括字节交换操作和其它表达式的域,识别与所述域相关联的域入口和域出口,确定通过执行所述域的交换将获得益处,并且响应于所述确定执行所述域的交换,并且将所交换的域存储在存储介质中。还描述并要求了其它实施例。

著录项

  • 公开/公告号CN102804142A

    专利类型发明专利

  • 公开/公告日2012-11-28

    原文格式PDF

  • 申请/专利权人 英特尔公司;

    申请/专利号CN200980160069.8

  • 发明设计人 M·Y·莱奥克;

    申请日2009-06-25

  • 分类号G06F9/45;

  • 代理机构永新专利商标代理有限公司;

  • 代理人刘瑜

  • 地址 美国加利福尼亚

  • 入库时间 2023-12-18 07:31:27

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-06-07

    未缴年费专利权终止 IPC(主分类):G06F 9/45 专利号:ZL2009801600698 申请日:20090625 授权公告日:20160302

    专利权的终止

  • 2016-03-02

    授权

    授权

  • 2013-01-23

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20090625

    实质审查的生效

  • 2012-11-28

    公开

    公开

说明书

背景技术

字节的排列顺序是数据存储和检索的属性,其中存储和检索支持多种 访问大小(例如,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=”是域出口。针对该代码的域交换可以如下:

T1=A//移除字节交换

T2=B//移除字节交换

RES=T1==T2//结果的字节顺序是相同的:没有任何增加或移除。

因此,对于每个交换容忍表达式,如果执行域交换,则知道入口(即, 参数)和出口(即,结果)中的哪个将改变字节顺序。例如,在表达式X?Y:Z (如果X,则Y,否则Z)中,Y和Z的字节顺序将改变而X的字节顺序 将保持:X?Y’:Z’。因此,知道域的入口和出口中的哪些改变它们的字节顺 序并且仅针对这些来插入/移除字节交换操作(SWAP)。

域交换益处是来自域交换的性能益处,以使得插入的代码量减去移除 的代码量(考虑放置/移除的特定指令的加权以及估计的执行计数器)得到 正数。

作为示例,

T1=A

T2=SWAP(B)

RES=T1==T2

域交换可以如下:

T1=SWAP(A)//放置字节交换

T2=B//移除字节交换

RES=T1==T2//没有任何增加或移除。

如果原始代码中的“T1=A”比“T2=SWAP(B)”冷,则域交换益处是正 的。注意,术语“冷”和“热”指的是给定代码段的相对频率或使用。“冷” 代码段相对于另一代码段而言使用得更不频繁或者以更长的时间间隔使 用。因此,如该示例所示,域交换可能导致在代码中移动SWAP。

现在参考图1,示出的是根据本发明的一个实施例,用于执行字节交换 消除的方法的流程图。可以由在计算机系统的一个或多个处理器上执行的 编译器来执行方法10。虽然本发明的范围不限于这一点,但是可以执行一 些实施例来优化针对大字节序架构写入的代码以用于小字节序架构。即, 编译器可以在小字节序架构的处理器上执行。

如图1中所见,可以通过确定要优化的代码的表达式是否包括字节交 换操作来开始方法10(菱形20)。如果没有,则控制可以循环到下一个表 达式(框30)。当遇到字节交换表达式时,控制进行到框40,在框40中可 以构建包括该表达式的域。虽然本发明的范围不限于这一点,但是实施例 可以寻求扩展域的范围从而能够在单遍中优化多个表达式。下面进一步论 述构建域的细节。在构建域的期间,如果可能的话,可以利用额外的表达 式来扩展域(框50)。下面还将论述扩展域的进一步的细节。当构建域结束 时,可以识别改变字节顺序的域的各个入口和出口(框60)。如上所论述的, 域入口可以是输入到域的各个参数,而出口可以是用作域的外部的参数的 各个结果。

仍然参考图1,在菱形70处,可以确定移除字节交换是否提供益处(菱 形70)。如上所论述的,可以由编译器基于各种简档信息来执行该确定,其 中简档信息包括插入到代码中的表达式的量与从代码中移除的表达式的量 之间的差的确定,以及与和这些表达式相关联的各种执行计数有关的简档 信息。还可以确定该益处是否大于阈值。在一个实施例中,用于指示提供 了益处的该阈值可以是0,以使得如果益处确定产生正数,则将提供益处。 注意,如果通过移除字节交换不能提供益处,则不执行字节交换消除并且 编译器可以循环到下一个表达式(关于上面所论述的框30)。

相反,如果确定移除提供益处,则控制进行到框80。在框80处,可以 移除字节交换表达式,从而利用相对表达式来替代该表达式。此外,可以 在域内的其它位置处插入/移除一个或多个额外的字节交换(框80)。此外, 可以在一个或多个域入口和/或出口中类似地插入或移除这些字节交换表达 式。然后,所修改的代码可以存储在诸如系统存储器或非电压存储设备等 的适当的存储设备中,以用于随后在调用包含该修改代码的程序时执行。 虽然在图1的实施例中示出了该特定的实现,但是应理解,本发明的范围 不限于这一点并且其它的实现也是可能的。

为了构建交换容忍域,可以以任何交换容忍表达式或者从期望被移除 的字节交换开始,并且利用连接的交换容忍表达式来扩展该域。如果进一 步的域扩展是不可能的或者不会产生性能意义,则可以执行域交换并且可 以构建其它的域。当存在相邻的交换容忍表达式时,域扩展是可能的。还 可以构建多个域,这是因为针对每个相邻的交换容忍表达式,可以确定不 将其添加到当前域,并且多个域将具有不同的域交换益处。因此,可以执 行完全搜索以寻找最佳构建域,或者可以应用某些试探法。某些实施例可 以基于试探法的使用。因此,字节交换消除可以识别和交换提供如上所述 的正交换益处的所有的交换容忍域。

因此,在各实施例中,对某字节顺序的数据的操作利用对不同字节顺 序的相同数据的等价操作来替代。此外,可以在单遍中同时优化多个连接 的表达式和多个连接的数据。作为优化的结果,不仅消除了一些字节交换, 而且还将其它的字节交换移动到更冷的路径。因此,可以利用对不同字节 顺序的数据进行操作的相对表达式来替代表达式,可以在代码中移动交换, 并且多个连接的数据可以改变其字节顺序。以这种方式,可以通过将对某 一字节顺序的数据进行操作的代码块利用对不同字节顺序的数据进行操作 的等价代码块替代,来消除字节交换。

现在参考表1,示出的是根据本发明的一个实施例,表示算法的可能实 现的伪代码。如在表1中所见,可以提供多个函数以用于字节交换消除和 构建域。如所见,字节交换函数调用域构建函数。此外,在确定移除字节 交换表达式是否具有益处时,可以执行称为BENEFIT的另一函数。如上面 所论述的,该函数可以确定在计算产生正值时存在益处。如果发现了该正 值,则可以执行称为SWAP_DOMAIN的另一函数以在域内的适当位置以及 域入口和出口处实现字节交换操作的实际移除和插入。注意,该伪代码是 示例性的,并且其它的实现也是可能的。

表1

实施例还可以控制数据字节顺序的选择。即,不是按照程序员所指定 的来选择数据字节顺序,而是编译器可以检查每个特定数据块的字节顺序 是否影响程序的语义,并且如果不影响的话,则可以从性能角度来设置该 特定数据块的字节顺序。

如本文所使用的,如果所有的数据存储和检索均是相同大小的,则数 据(例如,变量、数据结构、堆数据、函数参数等)的字节顺序对程序员 而言是不可见的。为了证明所有的数据存储和检索是相同大小的,编译器 确保以下:不能通过不同大小的其它变量(例如,共用体成员)来访问数 据;数据的地址(如果采用的话)不是从外部(即,正在被编译的代码的 外部)直接可见的,也不能存储到从外部可见的变量,也不能传递到外部 函数/从外部函数获得,也不能参与到编译器不能理解的表达式中/从编译器 不能理解的表达式获得;并且如果采用了数据的地址并且将数据的地址转 换为指向不同大小的数据的指针,则不存在由该指针进行的读取/写入。然 而,编译器可以允许针对诸如maloc/free等的外部函数从这些先决条件中进 行已知的排除,但仍然保证所有的检索和存储是相同大小的。

可以保守地计算数据字节顺序可见性。例如,如果没有证明不可见, 则可以将字节顺序视为是可见的。为了定义函数参数的字节顺序可见性, 编译器可以额外地确保对函数的所有调用(包括间接调用)均是已知的。 作为示例,其地址从未被采用的顶层静态变量的字节顺序对程序员而言是 不可见的,而每模块编译中的全局变量的字节顺序对程序员而言被认为是 可见的。

如果数据块必须具有相同的字节顺序,则它们构成组。在下面的示例 中,变量‘a’和‘b’必须具有相同的字节顺序并且因此编译器必须保持 该顺序:

int*ptr=condition?&a:&b

ptr[3]=10。

为了确定特定数据的哪种字节顺序会在性能上更有意义,根据本发明 的实施例的编译器检查如何使用数据。如果根据执行计数器数据在大字节 序上下文中被更频繁地使用,则在可能时编译器使该数据为大字节序。有 时上下文的字节顺序是未知的(例如,数据从一个变量拷贝到另一变量, 并且编译器还没有关于这两个变量的字节顺序作出决定)。在这种情况中, 可以使用试探法来选择具有更高可能性的更好的字节序。

因此,根据本发明的实施例的编译器可以执行以下:1)将程序操作的 所有数据分为必须具有相同字节顺序的组;2)选择组以使得该组中的所有 数据的字节顺序对程序员而言是不可见的;3)通过仅选择如果字节顺序改 变则将给出正性能益处的那些组来筛选选择;以及4)通过调整所选择组的 数据的所有读取/写入来改变所选择组的字节顺序。

现在参考图2,示出的是根据本发明的一个实施例,用于通过控制数据 字节顺序来优化代码的方法的流程图。如图2中所示,可以使用在系统的 处理器(例如,具有小字节序架构的处理器)上执行的双字节序编译器来 实现方法100。如图2中所见,可以通过执行代码或者应用试探法来获得与 给定代码段有关的统计信息来开始方法100(框110)。可以在可以执行代 码或执行其它操作以获得统计信息的编译器的第一遍执行中获得这些统计 信息。然后,可以将数据解析为组(框120)。更具体地,可以将数据解析 为其中每个数据具有相同字节顺序的组。即,组的所有数据可以是大字节 序或小字节序的。

然后,对于每个组,可以确定组的字节顺序对程序员而言是否是可见 的(菱形130)。如下面将进一步论述的,可以执行各种分析来确定字节顺 序是否是可见的。该分析可以至少部分地基于在第一遍期间获得的统计信 息。如果字节顺序是可见的,则控制进行到框140,在框140中,当不可能 对该组数据进行优化时可以选择下一个组。

否则,控制从菱形130进行到菱形150,在菱形150中可以确定对该组 数据的字节顺序改变是否将有益于性能。如下面将在各个实现中进一步论 述的,可以执行不同的计算来确定是否将提供性能益处。如果将不提供益 处,则不执行优化并且可以选择下一个组(框140)。否则,如果字节顺序 改变将提供性能益处,则控制进行到框160,在框160中可以改变该组的字 节顺序。然后,该修改代码可以存储在诸如系统存储器或非电压存储设备 等的适当的存储设备中,以用于随后在调用包含该修改代码的程序时执行。 虽然在图2的实施例中示出了该特定的实现,但是本发明的范围不限于这 一点。

在一个实现中,编译器优化可以在两遍编译上工作。在第一遍,累计 与数据使用有关的信息并且从性能角度计算字节顺序优选。在第二遍,根 据针对每个特定数据块的所选择的字节顺序来调整数据使用。因此,可以 确定特定数据块的字节顺序是否是可见的。第二,可以识别从性能角度更 有意义的字节顺序。最后,可以转换特定数据的字节顺序。

每个数据块(变量、函数参数、函数等)具有DATA_ADDRESS假指 针,其被视为包含该数据的地址的正常指针。在一个实施例中,每个指针 (以及DATA_ADDRESS假指针)维持各数据结构。

在一个实施例中,这些结构可以存储在诸如图3中所示的性能监视表 150中,其中该性能监视表是根据本发明的一个实施例用于存储性能统计的 各种存储设备的框图。在一些实施例中,表150可以存储在系统存储器中, 但是在其它实现中,该表可以存储在编译器在其上执行的处理器的高速缓 存存储器中。如图3中所示,表150可以包括目的列表160,以针对每个指 针和数据地址假指针来存储指针列表,其中指针被拷贝到该指针列表。类 似地,源列表165存储与相应指针相关联的源的列表。此外,访问大小列 表170可以存储与相应指针相关联的读取/写入的大小。继而,取决于关于 与指针相关联的表达式字节顺序改变是否将(正面或负面)影响性能,益 处计数器175可以递增/递减。因此,每个指针和假指针可以维持这些列表 中的每一个。在一个实施例中,VALUE_COPIED_TO和 VALUE_COPIED_FROM列表(对应于目的列表160和源列表165)可以包 含其它指针;ACCESS_SIZE列表(其对应于访问列表170)包含整数;以 及益处计数器175累计数据使用统计。初始地,对应于外部可见符号(变 量、函数)以及能够通过其它变量(例如,共用体成员)访问的变量和具 有不同大小的那些其它变量的DATA_ADDRESS假指针的ACCESS_SIZE 列表包含0值(在实施例中,0访问大小指示可见的字节顺序)。其它列表 初始为空,并且益处计数器初始设置为0。

在第一遍,编译器用真实数据填充这些列表。每次将值从一个指针拷 贝到另一个指针时,适当地扩展源的VALUE_COPIED_TO列表和目的的 VALUE_COPIED_FROM列表。每次存储数据的地址时,适当地扩展源 ADDRESS_DATA的VALUE_COPIED_TO和目的的 VALUE_COPIED_EROM。

每次发现读取/写入时,利用读取/写入大小来扩展对应的 ACCESS_SIZE列表条目。而且,取决于字节顺序改变将如何修改表达式, 通过当前表达式的试探执行计数器来使益处计数器增加或者减小或者使益 处计数器保持不变。在下面的示例中,各表达式的改变反映了变量A的字 节顺序的改变:

A=SWAP(B)→A=B//益处计数器增加

A=0x12345678→A=0x78563412//益处计数器保持不变

A=B→A=SWAP(B)//益处计数器减小

每次发现对指针或数据地址的不支持的操作时,利用0值来扩展相应 的ACCESS_SIZE。在第一遍结束时,构建了所有的列表并且编译器具有足 够的信息来确定字节顺序可见性。如果针对给定的数据,通过 ADDRESS_DATA的VALUE_COPIED_TO列表传递地可达的所有指针变量 的ACCESS_SIZE列表的共用体包含不多于单个元素(并且该元素是非0 的),则所有的数据读取/写入是该特定大小的,因此该特定数据的字节顺序 对程序员而言是不可见的。

为了找到哪些数据块必须具有与给定数据(即,构成组的数据块)相 同的字节顺序,编译器构建通过VALUE_COPIED_TO和 VALUE_COPIED_FROM列表传递地可达的ADDRESS_DATA指针的列表。 如果通过VALUE_COPIED_TO和VALUE_COPIED_FROM列表传递地可达 的所有指针的ACCESS_SIZE列表的共用体包含不多于单个元素并且该元 素是非0的,则对整个组的优化是可能的。

如果整个组的字节顺序对程序员而言是不可见的,并且针对整个组的 不同字节顺序的选择将给出性能益处(例如,对于传递地可访问的所有指 针的BENEFIT的总和是正的),则编译器进行交换并且调整数据使用。

因此,实施例检查如何使用每个特定的数据块,并且基于执行计数器 和数据使用作出字节顺序决定。此外,实施例可应用于符合标准的所有数 据,而非特定的数据类(例如,仅返回值)。字节顺序选择是基于正在被编 译的应用中的数据使用的;针对每个特定应用的每个特定数据块来作出该 决定,而非“一体适用”模型。以这种方法,编译器可以决定哪些数据应 当是不同字节顺序的而非依赖于用户决定,使得所生成的代码具有更高的 性能。

现在参考表2,示出的是根据本发明的一个实施例的用于提供两遍的简 化的伪代码。如表2中所见,由编译器执行这两遍以控制针对特定数据的 字节顺序的选择。如所见,第一遍可以用来执行代码或执行其它试探法以 收集使用统计,该使用统计包括与代码的每个变量和指针相关联的各列表 的更新。然后,执行第二遍以基于所收集的使用统计来优化代码。当确定 字节顺序改变将优化代码时,插入/从代码中移除这些字节交换操作。

表2

第一遍:收集使用统计

第二遍:优化代码

如表2中所示,由于总的BENEFIT是正的,因此将很可能通过使用以 下变换中的一个来优化去除在这里应用的交换:

SWAP(SWAP(X))→X

SWAP(const)→const_swapped

因此表达式如:

X:=SWAP(SWAP(X)+1)//为大字节序的X首先被转换为:

X:=SWAP(SWAP(SWAP(SWAP(X))+1)))//X是小字节序并且随后被优化 为:

X:=X+1

可以以许多不同的系统类型来实现实施例。现在参考图4,示出的是根 据本发明的实施例的系统的框图。如图4中所示,多处理器系统300是点 到点互连系统,并且包括经由点到点互连350耦合的第一处理器370和第 二处理器380。如图4中所示,处理器370和380中的每一个可以是多核处 理器,包括第一和第二处理器核心(即,处理器核心374a和374b以及处 理器核心384a和384b)。

仍然参考图4,第一处理器370还包括存储器控制器中心(MCH)372 和点到点(P-P)接口376和378。类似地,第二处理器380包括MCH 382 和P-P接口386和388。如图4中所示,MCH 372和382将处理器耦合到 各自的存储器,即存储器332和存储器334,该存储器332和存储器334可 以是本地附接至各自的处理器的主存储器(例如,动态随机存取存储器 (DRAM))的部分。第一处理器370和第二处理器380可以分别经由P-P 互连352和354耦合到芯片集390。如图4中所示,芯片集390包括P-P接 口394和398。

此外,芯片组390包括接口392以将芯片集390与高性能图形引擎338 相耦合。继而,芯片集390可以经由接口396而耦合到第一总线316。如图 4中所示,各种I/O设备314可以耦合到第一总线316以及将第一总线316 耦合到第二总线320的总线桥318。各种设备可以耦合到第二总线320,各 种设备包括例如:键盘/鼠标322、通信设备326和诸如磁盘驱动器或其它 大容量存储设备等的数据存储单元328,在一个实施例中,数据存储单元 328可以包括代码330。这种代码可以包括根据本发明的实施例的编译器, 其可以在处理器370和380中的一个或多个上执行。此外,音频I/O 324可 以耦合到第二总线320。

实施例可以以代码来实现,并且可以存储在存储有指令的存储介质上, 该指令可以用于对系统进行编程,以执行这些指令。存储介质可以包括但 不限于是:任何类型的盘,包括软盘、光盘、光盘、固态驱动器(SSD)、 光盘只读存储器(CD-ROM)、可重写的光盘(CD-RW)以及磁光盘;半导 体设备,诸如只读存储器(ROM)、随机存取存储器(RAM)(诸如,动态 随机存取存储器(DRAM)、静态随机存取存储器(SRAM))、可擦除可编 程只读存储器(EPROM)、闪存、电可擦除可编程只读存储器(EEPROM)、 磁卡或光卡;或者适于存储电子指令的任何其它类型的介质。

虽然参照有限数量的实施例描述了本发明,但是本领域技术人员将理 解源自所描述实施例的许多修改和变形。期望所附权利要求覆盖落入本发 明的真实精神和范围内的所有这种修改和变形。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号