选择要在计算系统中执行的优化代码的方法和系统的制作方法

文档序号:6398101阅读:423来源:国知局

专利名称::选择要在计算系统中执行的优化代码的方法和系统的制作方法
技术领域
:本发明一般涉及基于多个不同处理器架构实现来优化代码,或者尤其涉及选择对于特定处理器的架构实现被优化的可执行代码。
背景技术
:源代码(S卩,使用编程语言的格式和语法编写的文本)可以被编译,使得被优化以在特定处理器上执行。例如,处理器可能具有可执行代码可以有利使用的特定功能单元。然而,如果对于特定处理器架构实现被优化的可执行代码在具有不同架构实现的处理器上执行,则可执行代码的性能可能受损害。
发明内容本发明的实施例提供用于选择要在包括第一和第二处理器的计算系统中执行的优化代码的方法、系统和计算机程序产品。在一个实施例中,方法和计算机程序产品包括:加载要由第一和第二处理器之一执行的可执行代码,其中,可执行代码基于计算机可读代码,以及其中,编译器优化计算机可读代码的至少一部分,以生成基于第一处理器的架构实现的第一编译代码部分以及基于第二处理器的架构实现的第二编译代码部分二者。另外,第一和第二处理器的各自架构实现是不同的。当确定可执行代码分配给第一处理器时,方法和计算机程序产品包括在第一处理器上执行第一编译代码部分而不是第二编译代码部分。当确定可执行代码分配给第二处理器时,方法和计算机程序产品包括在第二处理器上执行第二编译代码部分而不是第一编译代码部分。在另一个实施例中,该系统包括:第一处理器和第二处理器,其中第一和第二处理器的各自架构实现是不同的。该系统包括加载器,该加载器配置为加载要由第一和第二处理器之一执行的可执行代码,其中,可执行代码基于计算机可读代码。编译器优化至少一部分计算机可读代码,以生成基于第一处理器的架构实现的第一编译代码和基于第二处理器的架构实现的第二编译代码部分二者。当确定可执行代码分配给第一处理器时,第一处理器执行第一编译代码部分而不是第二编译代码部分。当确定可执行代码分配给第二处理器时,第二处理器执行第二编译代码部分而不是第一编译代码部分。在另一个实施例中,一种编译要在包括第一和第二处理器的计算系统中执行的计算机可读代码的方法,包括:优化计算机可读代码的至少一部分,以生成基于第一处理器的架构实现的第一编译代码部分。该方法包括优化计算机可读代码的该部分,以生成基于多个处理器的第二处理器的架构实现的第二编译代码部分,其中,第一和第二处理器的各自架构实现是不同的。该方法包括:通过操作一个或者多个计算机处理器,生成基于计算机可读代码的可执行代码,可执行代码包括(i)第一和第二编译代码部分以及(ii)对第一和第二编译代码部分的至少一个引用之一。这样,以实现以及可以详细理解上述方面的方式,可以通过参考附图获得上面简要总结的本发明的各实施例的更具体描述。然而,要注意,附图仅仅图示本发明的典型实施例并且因此不被视为限制本发明的范围,因为本发明可以允许其他同等效果的实施例。图1A-1B是图示根据本发明实施例的在多节点系统上进行客户端提交作业(job)的联网系统的框图。图2是图示根据本发明实施例的对于多个处理器优化的编译代码的图。图3是根据本发明的一个实施例的、用于执行在图1A-1B的系统中静态链接的优化代码的流程图。图4是根据本发明的一个实施例的、用于执行在图1A-1B的系统中动态地或者静态链接的优化代码的流程图。图5是图示根据本发明实施例的多节点作业结构的图。具体实施例方式并行计算系统典型地包括包含一个或者多个计算机处理器的多个计算节点。在一些情形中,计算机处理器是统一的,即共享相同架构实现。编译器可以优化源代码以在共享处理器架构实现上执行。这些计算系统然后可以分配编译代码给例如最不繁忙的处理器。因此,无论选择哪个计算机处理器执行编译的源代码,对于该计算机处理器的架构实现来优化该代码。然而,其他计算系统可以具有包含具有多种不同架构实现的处理器的计算节点。此外,这些计算系统还可以基于哪个处理器最不繁忙分配可执行代码给处理器。由此,如果对于特定处理器优化代码,但是该代码分配给具有不同架构实现的处理器,因为其具有最多可用的CPU处理能力,则代码可能比其如果完全没有被优化表现得更差。一种方案是强制可执行代码在对于其进行优化的处理器上执行,然而,如果该处理器繁忙,则这可能引起计算系统的性能受损害。替代地,编译器可以优化要在两个或者更多不同架构实现上运行的代码。例如,如果计算节点具有三种不同类型的处理器(即,三种不同处理器架构实现),则编译器可以被配置为优化源代码以在三种不同类型上执行。也就是说,在编译源代码之后,产生的可执行文件(theexecutable)可以包含执行对用于三种不同处理器架构实现优化的代码的必要信息。当程序加载器分配可执行文件给处理器时,系统确定处理器的类型并且确保仅仅对应该类型的优化代码被执行。由此,加载器自由地基于例如处理器的性能或者状态分配可执行代码到任何处理器(无论其是否具有可用的CPU处理能力),并且仍享受执行对于该处理器优化的代码的好处。下面将参照本发明的实施方式。然而应该理解,本发明不限于特定描述的实施例。相反,无论是否涉及不同实施例,设想下面特征和元素的任何组合来实现和实践本发明。此夕卜,虽然本发明的实施例可以实现超过其他可能解决方案和/或超过现有技术的优点,但是无论给定实施例是否实现具体优点不限制本发明。由此,下面的方面、特征、实施例和优点仅仅是图示性的并且不被视为所附权利要求的元素和限制,除非在权利要求中明确陈述。同样,参照“本发明”将不被解释为在此公开的任何发明性主题的概括并且不应该被视为所附权利要求的元素或限制,除非在权利要求中明确陈述。所属
技术领域
的技术人员知道,本发明可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是一但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括一但不限于一无线、电线、光缆、RF等等,或者上述的任意合适的组合。可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言一诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言一诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络一包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。下面将参照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规定的功能/操作的装置。也可以把这些计算机程序指令存储在能使得计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令(instructions)的制造品(anarticleofmanufacture)0也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框图中的方框中规定的功能/操作的过程。图1A-1B是图示根据本发明实施例的、在多节点系统上执行客户端提交作业的联网系统的框图。如所示,图1A是图示在多节点系统上执行客户端提交作业的联网系统的框图。在描绘的实施例中,系统100包括网络150连接的客户端系统120和多节点系统170。一般地,客户端系统120通过网络150向运行在多节点系统170上的文件系统提交作业。然而,任何请求实体可以向多节点系统170传送作业。例如,软件应用(诸如运行在客户端系统120上的应用之类)、操作系统、子系统、其他多节点系统170并且在最高等级,用户可以提交作业。术语“作业(job)”表示从多节点系统170请求资源并且使用这些资源的命令集合。诸如Java、Smalltalk、C++、C等的任何编程语言可以被实现为格式化该命令集合。此外,多节点系统170可以实现唯一编程语言或者提供特定模板。这些作业可以被预定义(即,硬编码为部分应用)或者可以响应于输入(例如,用户输入)被生成。当接收到作业时,多节点系统170执行请求并且然后返回结果。图1B是根据本发明实施例的、配置为在多节点系统上执行客户端提交作业的联网计算机系统的框图。如所示,系统100包含客户端系统120和多节点系统170。客户端系统120包含计算机处理器122、存储介质124、存储器128以及网络接口138。计算机处理器122可以是能够执行在此描述的功能的任何处理器。客户端系统120可以使用网络接口138连接到网络150。此外,如本领域普通技术人员将理解的,可以使用能够执行在此描述的功能的任何计算机系统。在描绘的实施例中,存储器128包含操作系统130和客户端应用132。虽然存储器128被示为单个实体,但是存储器128可以包括一个或者多个具有与物理地址相关联的存储器块(诸如随机存取存储器(RAM)、只读存储器(ROM)、闪存或者其他类型的易失性和/或非易失性存储器)的存储器设备。客户端应用132—般能够生成作业请求。一旦客户端应用132生成作业,该作业在网络150上被提交到文件系统172以进行执行。操作系统130可以是能够执行在此描述的功能的任何操作系统。多节点系统170包含文件系统172和至少一个节点190。每个作业文件174包含节点190完成提交作业的必要信息。更新器182维护作业文件未决的记录,即正由节点190执行。网络接口184连接到网络150并且接收从客户端系统120发送的作业文件174。另夕卜,如本领域的普通技术人员将理解的,可以使用能够执行在此描述的功能的任何计算机系统。在一个实施例中,作业文件174可以包括以编程语言(例如,C++、C、汇编语言等)编写的源代码或者可执行代码(例如,对象代码或者机器代码)。节点190包含计算机处理器192和存储器194。计算机处理器192可以是能够执行在此描述的功能的任何处理器。在此使用的“处理器”包括处理在可执行代码中找到的指令的至少一个执行单元。因此,多内核处理器的每个内核可以被视为独立的处理器。计算机处理器192可以被再分为不同的处理器类型,其中每个类型具有独特的架构实现。每个处理器类型可以通过例如单线程性能、吞吐量能力、消息处理、辅助浮点单元、矢量单元、浮点单元等来区分。由此,如在此使用的,具有“不同架构实现”的处理器仍然可以利用相同的指令集架构(x86、PowerPC等),但具有不同的功能单元或者那些硬件单元的不同排列。在一个实施例中,虽然两个或者更多计算机处理器192的架构实现不同,但是处理器192是软件兼容的。也就是,架构实现足够类似,使得可以在处理器192之一上执行的可执行代码还可以在计算机处理器192的任何其他处理器上执行,即使该代码对于架构实现之一被特定优化。然而,多节点系统170或者代码的性能可以基于分配来执行代码的处理器改变。例如,处理器192可以具有微代码引擎,以处理ISA中的某些指令。可以这样做以维持ISA兼容性,而不将过多硬件资源致力于指令提供的性能益处。如果是这样,则使用该指令可能会受到相对于避免指令和类似于微代码引擎使用的插入指令流的性能优点。这会允许处理器避免任何与微代码引擎相关联的开销。然而,不微编码这些指令而是与加速内核软件兼容的处理器内核也可以执行被优化的对象代码,以利用加速内核中的微代码引擎。由此,计算节点能够分配可执行代码给软件兼容的计算节点190中的任何计算机处理器192。存储器194包含操作系统198和编译器197。存储器194可以包括位于处理器192内的高速缓存存储器以及具有与物理地址相关联的存储器的块(诸如随机存取存储器(RAM)、只读存储器(ROM)、快闪存储器、或者其他类型的易失和/或非易失存储器)的一个或者多个存储器设备二者。操作系统198包括加载器195和链接器196,并且可以是能够执行在此描述的功能的任何操作系统。加载器195负责加载程序(即,可执行文件)到存储器以及准备它们用于执行。加载程序涉及读取包含可执行代码的可执行文件的内容到存储器194,并且实施任何其他所需预备任务以准备可执行代码。一旦加载器195已经执行其功能,操作系统198将控制传递到加载的可执行代码。在一个实施例中,加载器195可以确定将执行可执行代码的处理器类型。例如,力口载器195可以读取存储在计算机处理器192上的ID寄存器199中的识别号码。也就是,每个处理器(或者处理内核)192可以具有加载器195可以用于识别处理器架构实现,并且由此识别其类型的ID。一旦确定处理器的类型,加载器195确保执行对于该类型处理器优化的可执行代码。链接器196可以用于动态链接到库的程序。为了保留存储器空间并且减少可执行文件的大小,可执行代码可以包含对存储在一个或者多个库中的代码的引用。在运行时间,即在将可执行代码分配给特定处理器之后,链接器196解析引用并且将所需库引入存储器。链接器196还可以确定处理器192的类型以确保由处理器192执行正确优化的代码。后面将更详细讨论加载器195和链接器196的功能。编译器197配置为优化源代码使得产生的可执行文件(或者文件)被配置为运行对于在多节点系统170中的至少两种不同处理器类型优化的代码。例如,如果可执行代码被静态地链接(即,可执行代码是自包含的,使得其不包含对在运行时间需要被解析的库的引用),编译器197生成对于每种处理器类型优化的代码中的一个或多个子例程的单独版本。由此,如果节点190具有三种不同类型的处理器,则编译器197生成具有执行三种不同类型的可执行代码的正确版本的必要信息的可执行文件。虽然编译器197在多节点系统170中示出,但是在一个实施例中,客户端系统120(即,客户端应用132)可能具有带有在此描述的功能的编译器。由此,当向系统170提交作业文件174时,源代码可能之前已经被编译。此外,在一个实施例中,多节点系统170的处理器192可以被配置为在一个或者多个流水线上执行一个或者多个线程。由此,每个线程可能是编译器197生成的独立可执行文件。可执行文件可能是向多节点系统170提交的更大的作业的部分,这允许系统170执行可执行文件,并且由此并行执行作业。在其他实施例中,相同的方法被应用于生成在多个处理器上并行执行的可执行工作流的计算系统。图2是图示根据本发明一个实施例的、对于多个处理器优化的编译代码的图。源代码202可能是文本,编写为满足诸如Java、C、C++等之类的编程语言的格式化要求。作为典型,源代码202可以被编写以包括一个或者多个子例程204、206。依赖于编程语言,子例程204、206可以是过程、函数、例程、方法、子程序等。在此讨论的实施例公开基于处理器的特定架构实现优化一个或者多个子例程204和206。例如,编译器可能被配置为仅仅优化源代码202中的一个或者两个子例程204、206,或者可替代地所有子例程204、206。在一个实施例中,用户可以指令编译器对于计算系统中的多种处理器类型优化哪个子例程204、206。。虽然实施例讨论优化子例程,但是本发明不限于这样,并且可以与不具有子例程的编程语言共同使用,或者与优化整个源代码202而不管其中的子例程的编译器一起使用。用户子例程204代表可以通过程序员包括在源代码中的任何定制子例程。用户子例程204还可以是对包括源代码的另一个相关文件的引用或调用。相反,库子例程206代表源代码202中对在标准或者定制库中找到的子例程的调用。例如,C编程语言包括标准库stdi0.h,其允许用户使用printf函数(S卩,子例程)来显示信息。包括源代码202中的库子例程206允许程序员使用子例程功能,而不必包括所有伴随源代码。在执行编译源代码(即,可执行文件)之前或者期间,编译器或者链接器从库引入必要可执行代码,以执行库子例程206。在一个实施例中,源代码202可以被编译,使得其静态地链接。如本领域中已知的,静态链接在编译时间解析任何对库子例程206的调用(或者其他外部子例程和变量调用)。由此,编译器(或者链接器或者联编程序)产生不包括对库的任何引用的独立可执行代码(即,可执行文件内的对象代码)。因此,当可执行代码由处理器执行时,应用一定是其所有库存在并且在正确版本。这可以避免依赖性问题。例如,源代码202可以通过静态链接编译器208来编译。静态链接编译器208解析源代码中的任何对外部子例程(例如,库子例程206)的引用,以创建自包含可执行代码210(即,可执行文件或者部分可执行文件)。也就是,编译器208使用源代码202以及引用库(未示出),来生成可以由多节点系统170中的多个处理器192执行的可执行代码210,而不需要在运行时间解析引用。如图2所示,可执行代码210包括分别对应可以执行代码210的两种不同类型的处理器的两个选项214、220。每个选项214、220包含被优化运行在处理器的特定架构实现的代码。在此,选项214包含对于处理器I优化的可执行代码,而选项220包括对于处理器2优化的可执行代码。具体地,选项214包括用于在处理器I上运行用户子例程204的可执行代码(即,user_sub_on_procl216)、以及用于在处理器I上运行库子例程206的可执行代码(即,lib_sub_on_procl218)。编译器208分别使用用户子例程204和库子例程206的源代码生成这些可执行代码部分。可执行代码部分被特定对于处理器I优化。使用相同源代码202和库,编译器208还生成对于处理器2优化的可执行代码的不同版本,即选项220。该选项220包括用于在处理器2上运行用户子例程204的可执行代码(即,user_sub_on_proc2222)、以及用于在处理器2上运行库子例程206的可执行代码(即,lib_sub_on_proc2224)。在一个实施例中,编译器208将向处理器提供指令以选择适当选项来执行的选择代码212插入到可执行代码210中。特定地,选择代码212不对应源代码202的任何部分,而是被编译器208引入,以向代码210提供在两个选项214和220之间选择的能力。以这样的方式,可执行代码在优化代码部分之间选择的能力对于生成源代码202的程序员是透明的。选择代码210包括配置为以下的可执行代码,检测运行可执行代码210的处理器的类型,并且然后选择选项214、220来基于识别的处理器类型执行。例如,在加载器将可执行代码210移动到主存储器并且操作系统将对处理器的控制交给可执行代码210之后,处理器执行选择代码212。在执行期间,选择代码212可以访问ID寄存器,并且基于处理器的ID,确定处理器的架构实现(和类型)。选择代码210然后指令处理器执行正确的选项214、220。如果处理器是处理器1,则执行包含在选项214内的可执行代码,而不执行包含在选项220内的可执行代码。反之亦然。可替代地,可执行代码210不包括选择代码210,替代地加载器可以确定执行哪个选项214、220。也就是,加载器使用ID寄存器来识别可执行代码210被分配到的处理器的架构实现以及类型,并且指令处理器从什么地方开始执行代码210,即执行选项214或者执行选项220。以这样的方式,操作系统确定哪个选项214、220来执行,而不是可执行代码210包含执行分析的逻辑。在一个实施例,动态链接编译器226可以用于优化并且编译该源代码202、引用库以及对外部函数或者变量的调用。替代生成自包含可执行文件,编译器226生成包括对标准库或者用户创建库的引用(即,链接或者符号)的可执行代码228(即,可执行文件或者部分可执行文件)。在减小可执行文件的大小的努力中,很多编程语言允许代码被编译,而不使所有必要的可执行代码在可执行文件内。替代地,编译器插入稍后在运行时间解析的引用。这些引用可以是存储器地址或者到包含可执行代码的库的文件路径。如所示,可执行代码228具有每个链接到对于可以在多节点系统170中找到的不同处理器架构实现的可执行代码的不同版本的四种引用。处理器I的对用户子例程的引用230链接到user_sub_procl库238,user_sub_procl库238包含与被优化在处理器I上运行的用户子例程204相关联的可执行代码。处理器2的对用户子例程的引用232链接到user_sub_proc2库240。处理器I和处理器2的对库子例程的引用234和236分别链接到lib_sub_procl242和lib_sub_proc2244。由此,在处理器执行可执行代码228之前,引用必须被解析,即处理器需要找到在库246中找到可执行代码的方式。虽然图2示出对于用户或者库子例程204、206的每个编译版本在可执行代码226中插入单独引用,但是在一个实施例中,编译器197可以仅仅插入代表所有不同版本子例程的单个通用引用。该通用引用可以指向一个或者多个存储版本的库。在向处理器分配可执行代码228之后,链接器可以识别分配的处理器的架构实现,并且通过通用引用表示的一个或者多个库来发现包含与该架构实现对应的子例程版本的库(或者部分库)进行解析。链接器可以仅仅加载相关库到存储器并且排除通用引用链接的其他库。然后,链接器可以通过插入存储器地址到存储器中的相关库来解析引用。库246可以包括用于选择编程语言(例如,C编程语言中的printf函数)的标准库、或者基于在源代码202中找到的用户子例程204生成的库。lib_sub_procl242和Lib_sub_prOC1244可以是包括用于执行库子例程206的可执行代码的标准库。也就是,标准库可以包括之前编译的可执行代码。可替代地,或者此外,编译器226可以基于用户子例程204创建库。为了减少可执行代码228的大小,编译器226可以对于优化用户子例程204的每个不同可执行版本创建独立库,即user_sub_procl库238和user_sub_proc2库240。编译器228然后包括可执行代码228中的对这些用户库的引用。一旦将可执行代码228被分配给处理器,链接器解析引用230、232、234和236。在该实施例中,链接器是允许系统推迟解析引用230、232、234和236直至可执行代码228被分配用于执行的动态链接器。在执行可执行代码之前或者期间,链接器使用引用230、232、234和236以定位相关联的库并加载该库到存储器。通过确保处理器具有定位存储器中的相关联的库246的必要信息来解析引用。此外,链接器可以使用ID寄存器来确定处理器的架构类型。利用该知识,链接器可以选择性地选择库246来引入存储器,由此将其他库留在存储(S卩,硬驱动)中。例如,如果链接器确定处理器是处理器2,则链接器仅仅移动user_sub_proc2库240和lib_sub_proc2库244到主存储器。在一些实施例中,链接器还可以通过改变可执行代码228内的对这些库的引用230、236以指向库当前存储在存储器中的存储器地址来解析引用。由此,如果处理器到达引用230或者236同时运行可执行代码228,其可以从主存储器取回库240或244中找到的可执行代码并且继续执行线程。有利地,动态链接可以减小当与使用静态链接形成的自包含可执行代码210比较时,引入存储器194中的可执行代码量。在一个实施例中,可以使用混合编译器248来优化并且编译该源代码202、引用库以及对外部函数或者变量的调用。混合编译器250使用静态和动态链接二者的原理产生可执行代码250(即,可执行文件或者部分可执行文件)。可执行代码250包含优化可执行代码的不同版本,即选项254和258,以及在可执行代码250分配给处理器后动态解析的库的引用。可执行代码250的静态链接部分包括选择代码252以及包含在选项254和258中的可执行代码。如之前讨论的,选择代码252指令处理器选择用于在处理器I上运行用户子例程(即,user_sub_on_procl256)的可执行代码、或者用于对处理器2运行用户子例程(即,user_sub_on_proc2260)的可执行代码。可替代地,如之前讨论的,加载器195可以通过确定处理器192的架构类型以及加载优化代码的正确版本来执行相同功能。可执行代码250的动态链接部分包括链接到库266的引用262和264。在执行之前或者期间,链接器196可以解析引用262、264并且加载正确的标准库到存储器-即lib_sub_procl268或者lib_sub_proc2270。注意,也可以对于定制用户库完成相同处理。注意,可执行代码210、228或者250可以包含不是对于特定处理器特别优化的代码。例如,源代码202中的用户子例程204之一可以不对于特定架构实现优化。由此,如果静态链接可执行代码,则编译器将不需要生成针对子例程的可执行代码的两种不同版本。替代地,编译将仅生成基于用户子例程的可执行代码的一种版本。该版本可以直接存储在可执行代码210、228、250中。类似地,如果非优化子例程被动态地链接,则编译器将需要仅仅插入一个包含用于该子例程的可执行代码的对外部库的引用。引用可能提供包含非优化可执行代码的仅到单个库(或者部分库)的链接。图3是根据本发明的一个实施例的、用于执行在图1A-1B的系统中静态链接的优化代码的流程图。在步骤305,编译器197可以使用静态链接生成包含对于多个不同处理器架构实现优化的自包含可执行代码的可执行文件。由此,在一个实施例中,可执行文件包含与相同源代码对应的优化的、编译代码的不同版本。对于优化源代码内的一个或者多个子例程的编译器,产生的可执行代码包含对于子例程的可执行代码的至少两种不同版本。此外,编译器197解析对库或者其他外部函数的任何引用或者调用。这要求编译器197将引用的代码引入自包含可执行文件。也就是,在一个实施例中,编译器197组合来自库或者外部函数的代码与源代码并且编译该代码以形成可执行文件。如果来自库或者外部函数的代码之前已经编译,则编译器197可以将该可执行代码插入可执行文件。当编译器197已经使用引用完成链接源代码时,产生的可执行文件不需要访问库或者外部函数以便执行。在步骤310,操作系统198可以指令加载器195将可执行文件分配到计算节点190上的特定处理器192。如之前提及的,可执行文件可以是代表向多节点系统170提交的部分作业的线程。操作系统198可以指令加载器195将可执行文件分配到当前具有例如CPU可用处理能力的最大量的处理器192。在步骤315,加载器195或者可执行代码本身可以确定要执行哪个版本的优化子例程。在一个实施例中,编译器197可能生成选择代码并且插入到可执行代码。编译器197生成选择代码以在优化子例程的不同可执行版本之间选择。当执行选择代码时,通过例如访问ID寄存器199确定处理器ID并且选择对于该处理器架构实现优化的代码版本。处理器192不执行其它版本。可替代地,加载器195可以确定正确版本并且确保处理器仅仅执行优化函数的该版本。然而,在另一实施例中,选择正确的优化代码,而不要求来自系统管理员或者程序员的任何干预。在步骤325,处理器192执行对于处理器192的特定架构实现优化的代码部分。具体地,不执行对于不同架构实现优化的其它代码部分。然而,可执行代码可以包括不对于任何特定处理器架构实现优化的、所执行的其它代码部分。例如,编译器197可以仅仅优化引用在标准库中找到的子例程的子例程,而不优化用户子例程。此外,系统可能具有在缺少特定版本的实现时在可执行文件中使用的子例程的默认版本。因此,非优化用户子例程可以不具有可执行代码内的不同编译版本。图4是根据本发明的一个实施例的、用于执行在图1A-1B的系统中动态地或者静态链接的优化代码的流程图。在步骤405,编译器197生成动态链接到一个或者多个库的可执行文件。如之前提及,编译器197可以将引用(S卩,符号或者链接)插入到引用标准或者用户库的可执行文件。另外,编译器197可以将链接插入到包含优化代码的库的每个不同版本。可替代地,编译器197可以将通用链接插入到包含优化函数的不同版本的一个或者多个库。此外,编译器197可以生成包含子例程的不同可执行版本的可执行文件内的静态链接部分。在可执行代码内找到的子例程的正确版本可以在将可执行代码分配到处理器之后(即,运行时间期间)选择。在步骤410,操作系统198可以指令加载器195分配可执行文件到计算节点190上的特定处理器192。如之前提及的,可执行文件可以是代表向多节点系统170提交的部分作业的线程。操作系统198可以指令加载器195分配可执行文件到当前具有例如最低CPU利用的处理器192。在步骤415,通过使用加载器195、或者通过使用由在图3的步骤315中讨论的编译器197插入到可执行代码的选择代码,来选择可执行文件的静态链接部分。类似地,链接器196还可以识别处理器的架构实现以及动态链接可执行文件到包含与架构实现相关联的优化版本的库。如果编译器197将引用插入到用于子例程的每个优化版本的可执行文件,则在步骤425,链接器196仅仅解析(例如,插入存储器地址)链接到正确优化版本的引用。在另一个实施例中,如果编译器197将通用引用插入到可执行文件,则链接器196可以解析一个或者多个库,并且仅仅将与分配的处理器的架构实现对应的子例程的版本推入存储器194。链接器196可以在存储中留下子例程的其他版本。链接器196然后解析引用,以指向加载在存储器194中的库。在步骤430,分配的处理器192开始运行可执行代码。一旦处理器192执行与解析的引用相关联的对象代码,处理器192可以开始执行由链接器196加载到存储器194中的库中找到的对象代码。多节点系统的示例配置图5图示计算节点190的4x4x4环面(torus)501,其中为了清楚省略内部节点。虽然图5示出具有64个节点的4x4x4环面,但是将理解在并行计算系统中的计算节点的实际数量典型地大得多,例如,BlueGene/L系统包括65536个计算节点。环面501中的每个计算节点包括允许环面501中的每个计算节点与其六个紧邻的节点通信的一组六个节点对节点通信链接501A-F,两个节点在X、y和z坐标维度中的每个中。在一个实施例中,多节点系统170可以对于在系统170中执行的每个作业建立单独环面网络。可替代地,所有计算节点可以被连接,以形成一个环面。如在此使用,术语“环面”包括在多于一个的维度中的节点和节点间数据通信路径的任何规则图案,使得每个节点具有定义的一组邻域(neighbor),并且对于任何给定节点,可能确定该节点的邻域组。给定节点的“邻域”是通过直接节点间数据通信路径(即不必遍历通过另一节点的路径)链接到给定节点的任何节点。计算节点可以以三维环面501链接,如图5所示,但是还可以配置为具有更多或者更少维度。此外,给定节点的邻域是物理上最接近给定节点的节点是不必要的,虽然一般期望尽可能地以如此的方式布置节点。在一个实施例中,x、y或者Z维度中任意之一中的计算节点形成该维度中的环面,因为点对点通信链接逻辑地环绕。例如,这在图5中通过从X、y和z维度中的最后一个节点到第一节点环绕的链接50、505Ε和505F来表示。由此,虽然节点510表现为处于环面的“角”,但是节点对节点链接505A-F在环面501的x、y和z维度链接节点510到节点511、512和513。结论编译器可以优化源代码和任何引用库,以在多个不同的处理器架构实现上执行。例如,如果计算节点具有带有三种不同架构实现的三种不同类型的处理器,则编译器可以编译源代码并且生成三种版本的对象代码,其中对于三种不同处理器类型之一优化每种版本。在编译源代码之后,产生的可执行代码可以包括用于在三种版本之间选择的必要信息。例如,当程序加载器分配可执行代码给处理器时,系统确定处理器的类型并且确保仅仅执行与该类型对应的优化版本。由此,操作系统自由地基于例如处理器的性能或者状态分配可执行代码给任何处理器,并且仍然享受执行对于被分配可执行代码的任一处理器优化的代码的好处。附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。虽然以上针对本发明的各实施例,在不偏离本发明的基本范围的情况下,可以设想本发明的其他和进一步实施例,并且本发明的范围由下面的权利要求确定。权利要求1.一种选择要在包括第一处理器和第二处理器的计算系统中执行的优化代码的方法,包括:加载要由第一和第二处理器之一执行的可执行代码,其中,可执行代码基于源代码,其中,编译器优化源代码的至少部分,以生成基于第一处理器的架构实现的第一编译代码部分以及基于第二处理器的架构实现的第二编译代码部分二者,其中第一和第二处理器的各自架构实现是不同的;当确定可执行代码分配给第一处理器时,在第一处理器上执行第一编译代码部分而不是第二编译代码部分;以及当确定可执行代码分配给第二处理器时,在第二处理器上执行第二编译代码部分而不是第一编译代码部分。2.如权利要求1所述的方法,其中,可执行代码包括以下之一:(i)第一和第二编译代码部分,以及(ii)对第一和第二编译代码部分的至少一个引用。3.如权利要求2所述的方法,其中,可执行代码包括至少一个引用,还包括:存储第一和第二编译代码部分作为各自的库,其中至少一个引用代表到各自库的链接。4.如权利要求3所述的方法,还包括,当加载要由第一和第二处理器之一执行的可执行代码时,使用至少一个引用将第一和第二编译代码部分之一动态链接到可执行代码。5.如权利要求2所述的方法,还包括:在编译源代码的同时,将可执行代码静态链接到第一和第二编译代码部分;以及将在第一和第二编译代码部分之间选择的代码部分插入可执行代码,其中,在编译源代码的同时将该代码部分插入可执行代码。6.如权利要求1所述的方法,其中,确定可执行代码分配给第一或者第二处理器还包括评估存储在第一和第二处理器上各自寄存器中的处理器ID。7.如权利要求1所述的方法,其中,第一处理器的架构实现包括不包括在第二处理器的架构实现中的功能硬件单元。8.一种系统,包括:第一处理器;第二处理器,其中第一和第二处理器的各自架构实现是不同的;加载器,配置为加载要由第一和第二处理器之一执行的可执行代码,其中,可执行代码基于源代码,其中,编译器优化至少部分源代码,以生成基于第一处理器的架构实现的第一编译代码和基于第二处理器的架构实现的第二编译代码部分二者,其中,当确定可执行代码分配给第一处理器时,第一处理器执行第一编译代码部分而不是第二编译代码部分;以及其中,当确定可执行代码分配给第二处理器时,第二处理器执行第二编译代码部分而不是第一编译代码部分。9.如权利要求8所述的系统,其中,可执行代码包括以下之一:(i)第一和第二编译代码部分,以及(ii)对第一和第二编译代码部分的至少一个引用。10.如权利要求9所述的系统,其中,可执行代码包括至少一个引用,还包括:存储第一和第二编译代码部分作为各自的库,其中至少一个引用代表到各自库的链接。11.如权利要求10所述的系统,还包括,当加载要由第一和第二处理器之一执行的可执行代码时,使用至少一个引用将第一和第二编译代码部分之一动态链接到可执行代码。12.如权利要求9所述的系统,还包括:在编译源代码的同时,将可执行代码静态链接到第一和第二编译代码部分;以及将在第一和第二编译代码部分之间选择的代码部分插入可执行代码,其中,在编译源代码的同时将该代码部分插入可执行代码。13.如权利要求8所述的系统,其中,确定可执行代码分配给第一或者第二处理器还包括评估存储在第一和第二处理器上各自寄存器中的处理器ID。14.如权利要求8所述的系统,其中,第一处理器的架构实现包括不包括在第二处理器的架构实现中的功能硬件单元。15.一种编译要在包括第一处理器和第二处理器的计算系统中执行的源代码的方法,包括:优化源代码的至少部分,以生成基于第一处理器的架构实现的第一编译代码部分;优化源代码的该部分,以生成基于多个处理器的第二处理器的架构实现的第二编译代码部分,其中,第一和第二处理器的各自架构实现是不同的;以及通过操作一个或者多个计算机处理器,生成基于源代码的可执行代码,该可执行代码包括以下之一:(i)第一和第二编译代码部分,以及和(ii)对第一和第二编译代码部分的至少一个引用。16.如权利要求15所述的方法,还包括,在可执行代码传送以在多个处理器之一上执行之后:确定可执行代码分配给第一还是第二处理器;如果可执行代码分配给第一处理器,则在第一处理器上执行第一编译代码部分而不是第二编译代码部分;以及如果可执行代码分配给第二处理器,则在第二处理器上执行第二编译代码部分而不是第一编译代码部分。全文摘要编译器可以优化源代码以及任何引用库以在多种不同处理器架构实现上执行。例如,如果计算节点具有带有三种不同架构实现的三种不同类型的处理器,则编译器可以编译源代码并且生成三种版本的对象代码,其中对于三种不同处理器类型之一优化每种版本。在编译源代码之后,产生的可执行代码可以包含在三种版本之间选择的必要信息。例如,当程序加载器分配可执行代码给处理器时,系统确定处理器的类型并且确保仅仅执行与该类型对应的优化版本。由此,操作系统基于例如处理器的当前状态(例如,其CPU是否被完全利用)自由分配可执行代码给任何处理器,并且仍然享受执行对于被分配可执行代码的任一处理器优化的代码的好处。文档编号G06F9/45GK103218245SQ201310019878公开日2013年7月24日申请日期2013年1月18日优先权日2012年1月18日发明者J.R.库塞尔,M.G.库普弗施米德,P.E.沙特,R.A.希勒申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1