Mpi源代码程序到基于mpi线程的程序的自动转换的制作方法

文档序号:6605563阅读:233来源:国知局
专利名称:Mpi源代码程序到基于mpi线程的程序的自动转换的制作方法
技术领域
本公开总体上涉及将在消息传递基础结构中运行的计算机程序的自动转换。
背景技术
许多计算问题可以被细分为独立的或松散依赖的任务,这些任务可以分布在一组 处理器或系统中并且可以并行地执行。该技术通常允许比在由单个处理器或系统执行所有 任务时更快地解决主要问题。有时,处理时间可以与在子任务上工作的处理器或系统的数 量成比例地降低。除了当需要与其它任务交换数据时,每个进程可以独立地计算。可以根据需要,通过在协作的处理器和系统之间发送消息来协调所述处理器和系 统。消息还可以用于分发工作以及收集结果。对问题的一些划分和分解会极大地需要消息 传递基础结构,或者通过发送和接收大量的消息,或者通过在消息内传输大量的数据。可以将消息通过许多不同的通信信道或“结构(fabric) ”从一个进程传输到另一 个进程。例如,在同一物理机器上执行的进程能够使用多处理器机器上的共享存储器或点 对点处理器互连有效地进行通信。在不同机器上的进程可以通过高速网络进行通信,例如 InfiniBand (InfiniBand 贸易协会的注册商标)、Myrinet (Myricom 公司(Arcadia, California)的注册商标)、可缩放相干接口(“SCI”)、或由Quadrics有限公司(Bristol, United Kingdom)提供的QSNet。这些网络可以提供自然操作模式(native operational mode)以及仿真模式(emulation mode),自然操作模式暴露可从结构获得的所有特征,仿真 模式允许由遗留软件(legacy software)使用网络。进程还可以经由传统网络(例如以太 网)来通信。可以定义一组标准的消息传递函数,并且可以提供库以在每种类型的结构上执行 标准函数。消息传递接口( “MPI”)是定义基本应用编程接口(API)的工业标准,用于在 消息传递方面对分布式存储器和共享存储器系统进行编程。由MPI论坛的成员定义了 MPI 标准(参见 MPI :"A Message-Passing Interface Standard"(2. 1 版,消息传递接口论坛, 2008 年 6 月 23 日),其可从 xwwwx. mpi-forum, org/docs/ 获得,其中,在 URL 中用"xwwwx" 替换了“www”以避免从该文档内的有效链接)。MPI (或类似的)库可以提供在一个或多个 结构上的标准函数。在进程内的多个线程有时用于共享资源,例如存储器,这具有以下优点线程不需 要使用消息传递机制来进行通信。线程在利用多处理器系统中的不同处理器核心方面特别 有用。多处理器系统中的操作系统可以在运行于不同处理器核心上的线程之间分配任务, 并且可以利用对于线程可行的数据共享,所述线程运行在公共地址空间内,并且在多处理器环境内有处理器互连可用。但是,在MPI环境中,在一个进程内的多个线程需要遵循特定的实现技术。在MPI 标准下,每个MPI进程通常被映射到唯一的操作系统进程。进程的地址空间仅可以由另一 个进程通过调用MPI库函数来访问。如在MPI-2规范的12. 4节“MPI和线程”中所指出的, 在进程内的每个线程可以发出MPI调用;但是,线程不是独立可寻址的,因为在发送或接收 调用中的参数识别进程而不是线程。发送到一进程的消息可以由该进程中的任何线程接 收。进程具有多线程的事实不影响进程的外部接口。为了遵守MPI标准,如在MPI-2规范的12. 4节“MPI和线程”中所规定的,适应线程 的实现必须确保所有MPI调用是线程安全的并且阻塞MPI调用仅阻塞调用线程,允许其它 线程执行,如果有的话。但是,为了满足该标准,需要使用例如允许一次仅由一个线程进行 访问的互斥原语(primitive)来保护由发出MPI调用的线程使用的静态和全局变量。适应 线程的实现通常需要由程序员使用例如Posix线程这样的技术或根据混合的MPI/OpenMP 标准来写源代码程序。这些复杂的编程模式(programing paradigm)增加了程序复杂性, 并且会降低整体的程序性能。这种实现将抵销使用线程的多个优点中的一个优点,线程可 以使用静态和全局变量进行通信,而没有通过共享存储器机制发送消息的开销。


图1示出了在使用共享存储器段的MPI基础结构中运行的进程之间的数据传输。图2说明了根据本发明的一个实施例的、在转换为线程的进程之间的数据传输。图3是示出了根据本发明的一个实施例的、MPI源代码程序到基于MPI线程的程 序的转换器的操作的流程图。图4是根据本发明的一个实施例的、图3的转换器的操作的流程图。图5是描述了一个适当的数据处理环境的框图,其中,可以实现本发明的示例性 实施例的某些方面。
具体实施例方式本发明的实施例包括用于将MPI源代码程序自动地转换为基于MPI线程的程序 (MPI thread-based program)的方案。基于MPI线程的程序可用在不损害利用其它MPI功 能的能力的情况下,利用线程的更快的数据传输能力。此外,通过将非线程化的MPI程序自 动地转换为基于MPI线程的程序,可以在程序员不参与的情况下,自动地转换在此之前不 能利用多处理器环境的许多遗留的MPI程序。该自动转换可以使得公司能够自动地并且便 宜地将它们的MPI源代码程序库存移植到多处理器环境。响应于MPI源代码程序形式的输入和命令,转换器将所述MPI源代码程序的全局 变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私 有变量。识别用于支持在基于MPI线程的程序的执行期间将进程转换为线程的库,并且使 用所述识别的库建立所述基于MPI线程的程序的可执行版本。所述识别的库可以包括用于 以下操作的代码当基于MPI线程的程序执行时识别新进程的实例化,并且作为响应,使得 用于基于MPI线程的程序的对应线程被实例化。可以通过将与全局变量相对应的线程的相 应私有变量的内容直接提供给其它线程,从而将数据从一个线程传输到另一个线程。该数据传输不使用共享存储器段在线程之间传输所述数据。图1示出了在使用共享存储器段的MPI基础结构中运行的进程之间的数据传输。 在通常的实现中,MPI程序实例化η个进程0到n-1,在图1中显示为进程110、120和130。 这些进程中的每一个具有其各自的地址空间,进程110具有进程地址空间112,进程120具 有进程地址空间122,并且进程130具有进程地址空间132。为了将数据102从进程110传 输到进程120,必须由进程110将数据102从进程地址空间112传输到共享存储器段140, 然后必须由进程120将数据102从共享存储器段140复制到进程地址空间122。这种数据 传输操作需要两个存储器复制操作。共享存储器段140在进程之间被共享,并且可以是更大的主存储器的一部分,由 不同进程对该部分的访问被协调。可以使用进程间通信来控制对共享存储器140的访问, 其中,一个进程在随机存取存储器中创建其它进程可以访问的区域;或者可以通过使用虚 拟存储器映射,将对通常是一段数据的多个副本的访问指引到单个实例来控制对共享存储 器140的访问。可以由例如操作系统和/或虚拟化软件这样的资源来提供对共享存储器 140的协调的访问。图2示出了根据本发明的一个实施例的、在转换为线程的进程之间的数据传输。η 个进程0到n-1被实例化为公共进程地址空间250内的线程0到n-1。线程210、220和230 中的每一个具有各自的一组私有变量,其中,线程210具有私有变量212,线程220具有私有 变量222,线程230具有私有变量232。为了完成将数据102从线程210传输到线程220, 可以将数据102从私有变量212内的地址直接传输到私有变量222内的地址。可以直接地 来执行该数据传输,而不是间接地通过共享存储器段(例如图1的共享存储器段140)来进 行,这是因为在公共进程地址空间250内的地址由线程210、220和230共享。执行直接传 输而不是需要两个复制操作直接增加了程序的性能。图3是示出了根据本发明的一个实施例的、MPI源代码程序到可执行的基于MPI 线程的程序的转换器的操作的流程图。转换器360将MPI源代码程序362和命令364作为 输入,并且提供可执行的基于MPI线程的程序366作为输出。命令364可以是例如到转换 器360的、将基于MPI源代码的程序编译为基于MPI线程的程序的命令。例如,假设用如 l^miilffllSif^^lSifillft石马禾呈:test. c $ mpicc-o test_mpi_process test, c。 在响应于该命令编译完test, c之后,输出程序test_mpi_pr0cess将作为基于进程的传统 MPI应用来执行。相反,用类似于如下形式的命令调用本发明的转换器以编译源代码程序 test, c$ mpicc-mpi_on_threads-o test_test—mpi thread test, c。命令中的 _mpi_on_ threads这一部分将命令提供给编译器以产生输出程序teSt_mpi_thread作为可执行的基 于MPI线程的程序。响应于命令364,转换器360将MPI源代码程序的全局变量声明为线程私有变量, 以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量。如本文所使用的, 术语“全局变量”用于描述在进程内具有全局范围的变量,例如被声明为全局或静态变量的 变量。当基于MPI线程的程序366被执行时,可以通过将与全局变量相对应的线程的相应 私有变量的内容直接提供给其它线程,将数据从一个线程传输到另一个线程。这种数据传 输不使用共享存储器段在线程之间传输数据。基于MPI线程的程序366可以在不损害利用 其它MPI功能的能力的情况下,利用线程的更快的数据传输能力。
图4是根据本发明的一个实施例的、图3的转换器的操作的流程图。如上所述,转 换器360接收MPI源代码程序362和命令364作为输入。处理在“响应于将MPI源代码程 序转换为基于MPI线程的程序的命令,检查MPI源代码以发现指示问题代码的状况”的步 骤410处开始。在该步骤中,转换器360检查MPI源代码程序362,以发现当将MPI进程转 换为线程时有问题的多个不同状况。例如,通常用于建立MPI应用程序的一些语言(例如, Fortran和C)提供了可能不会被在进程内运行的线程正确处理的存储器管理特征。例如在 Fortran中,在Fortran源代码程序的不同组件或子例程之间,在空白公共块中的数据在大 小和格式(layout)方面可以改变。在空白公共块中的数据是在MPI进程内运行的线程之 间共享的一种类型的全局变量。如果每个进程被转换为具有其自己版本的空白公共块的线 程,则不同的组件之间的这种不同大小和格式可能不会被贯彻到每个组件。因为Fortran 编译器通常独立地编译每个组件或子例程,所以转换器360需要检查MPI源代码以发现所 有组件或子例程,以识别这种问题代码。为了识别这种特征,转换器360检查MPI源代码程序以发现以下状况其中,当由 MPI源代码程序的第一组件访问时,在空白公共块中的数据具有第一大小,当由MPI源代码 程序的第二组件访问时,在空白公共块中的数据具有第二大小,其中,所述第一大小和第二 大小不同。在发现这种状况后,转换器360会将这种代码识别为对于到基于线程的实现的 转换是有问题的。转换器360还可以检查MPI源代码程序以发现以下状况其中,当由MPI 源代码程序的第一组件访问时,在空白公共块中的数据具有第一格式,并且当由MPI源代 码程序的第二组件访问时,在空白公共块中的数据具有第二格式,其中,所述第一格式和第 二格式不同。在发现这种状况时,转换器360会将这种代码识别为对于到基于线程的实现 的转换是有问题的。转换器360搜索的其它类型的问题代码包括将数据从组件的一个实例保存到组 件的下一实例中的代码。例如,Fortran提供了如下特征其中,组件可以拥有如下所述的 变量,即,不管是否在同一线程内对组件进行实例化,所述变量都将它们的值从组件的一个 实例保留到下一个实例。为了发现这种特征,转换器360检查MPI源代码程序,以发现MPI 源代码程序的具有如下变量的组件,所述变量将来自该组件的第一实例的值保留到该组件 的第二实例。在发现这种状况后,转换器360会将这种代码识别为对于到基于线程的实现 的转换是有问题的。转换器360搜索的其它类型的问题代码包括依赖于处理器的状态或其控制字 (control word)的代码。例如,如果程序的结果依赖于利用处理器的不同设置而工作的不 同的MPI进程,那么如下所述的代码可能无法正确地转换为基于线程的实现,所述代码依 赖于在特定状态中操作、或者以特定控制字操作以处理浮点操作的处理器。在发现这种状 况后,转换器360会将这种代码识别为对于到基于线程的实现的转换是有问题的。响应于发现了指示问题代码的状况,转换器360进行到“指示问题代码的状况?,, 决定点420的“是”分支,其中,所述问题代码针对到基于线程的实现的转换。控制进行到 “拒绝转换MPI源代码程序的命令并且正常地生成MPI源代码程序的目标代码”步骤425。 响应于发现所述状况,转换MPI源代码程序的命令被拒绝,并且正常地生成MPI源代码程序 的目标代码。在另一个实施例中,不是生成MPI源代码程序的目标代码,而是转换器360可 以拒绝转换MPI源代码程序的命令,并且在不产生MPI源代码程序的可执行版本的情况下终止。响应于未发现指示了问题代码的状况,转换器360进行到“指示了问题代码的状 况?,,决定点420的“否”分支。控制进行到“生成目标代码以将MPI源代码程序的全局变 量声明为线程私有变量”步骤430。在该步骤,转换器360生成目标代码以将MPI源代码程 序的每一个全局变量声明为线程私有变量。这种声明的结果是将为在公共父进程地址空 间内的每一个线程创建单独的私有变量,类似于图2的公共进程地址空间250内的线程私 有变量212、222和232。为了确保线程私有变量是有效的,应当由转换器360所产生的基于 MPI线程的程序中的对应的线程来实例化由MPI源代码程序来实例化的每一个进程。为了确保当执行基于MPI线程的程序时,线程而不是MPI进程被实例化,必须使用 合适的库以建立基于MPI线程的程序的可执行版本。因此,控制从“生成目标代码以将MPI 源程序的全局变量声明为线程私有变量”步骤430进行到“识别合适的库以建立可执行代 码”步骤440。例如,用于建立基于MPI线程的程序的可执行版本的每一个库应当支持多线 程。通过使用多线程系统库,操作系统可以利用多核处理器内的多个核心来实例化不同线 程,以执行任务,由此加速了基于MPI线程的程序的执行。还预见到,正确地处理基于MPI线程的程序可能需要使用特定的库以使得能够将 MPI进程转换为线程。这些库可以包括用于使得特定功能将在初始化MPI进程或在建立 MPI执行环境时被调用的代码。例如,在库内的代码可以用于在基于MPI线程的程序的执行 期间识别新进程的实例化。响应于识别到新进程的实例化,所述库可以调用代码以使得用 于基于MPI线程的程序的对应线程被实例化。新进程的实例化可以被识别为响应于MPI_ Init命令而发生,该命令产生MPI进程。代替产生一新的MPI进程,针对MPI_Init命令的 代码可以实例化一线程。然后,该线程可以执行本应由原始的MPI源代码程序中的正被初 始化的MPI进程执行的功能。或者可以响应于MPI_Init命令,或者可以更早地在建立MPI执行环境时,来创建 替代MPI进程执行MPI功能的线程。例如,mpiexec命令可以用于初始化MPI执行环境,并 且响应于mpiexec命令可以实例化许多线程。在线程被实例化之后,当调用MPI_Init以实 例化新进程时,针对MPI_Init命令的代码可以映射已经存在的线程中的一个线程以代替 MPI进程执行功能。在MPI进程的基于线程的实现中可能有问题的另一个类型的状况是文件输入/输 出(I/O)。当不同的进程读和写公共文件时,通常操作系统的文件系统组件处理文件I/O的 协调,以确保由不同进程进行的操作的正确排序。如果这些进程被转换为线程,则由不同线 程对访问文件I/O单元或句柄的尝试应当被当做它们在应用层与不同的文件有关来处理。 可能需要来自合适的库的支持,以处理文件I/O的协调。这种库可以包括例如用于以下操 作的代码识别由第一线程对第一文件的访问,使得第一线程通过第一文件句柄来访问第 一文件,识别由第二线程对第一文件的访问,并且使得第二线程通过第二文件句柄访问第 一文件,其中,所述第二文件句柄不同于所述第一文件句柄。在问题代码被识别并且MPI源代码程序的目标代码被正常地生成的情况下,控制 从“拒绝转换MPI源代码程序的命令并且正常地生成MPI源代码程序的目标代码”步骤425 进行到“识别合适的库以建立可执行代码”步骤440。在该情况下,将被使用的库不需要具 有多线程的能力,而应当是为建立MPI源代码程序的可执行版本而正常需要的库。
从“识别合适的库以建立可执行代码”步骤440,控制进行到“使用识别的库以建 立可执行代码”步骤450。使用识别的库来建立MPI源代码程序的可执行版本。如果没有 发现问题代码,那么MPI源代码程序的可执行版本可以是基于MPI线程的程序,或者如果发 现了问题代码,那么可以根据MPI源代码程序的正常生成的目标代码来建立可执行版本。一旦是线程而不是不同的MPI进程被实例化,就可以如参照图2所描述的在线程 之间直接传输数据,而无需执行如参照图1所描述的到共享存储器段的复制操作以及从其 进行的复制操作。在基于MPI线程的程序的可执行版本的执行期间,通过将第一私有变量 的内容直接提供给第二线程,可以将数据从第一线程传输到第二线程。这种从第一线程到 第二线程的数据传输不使用共享存储器段来传输数据。根据本发明的由转换器执行的转换过程是自动的。不需要为了产生具有基于MPI 线程的程序366的形式的、使用线程的可执行程序,而对图3的MPI源代码程序362的源代 码进行改变。通过自动地将MPI源代码程序362转换为基于线程的模式,基于MPI线程的 程序366可以利用在多处理器环境中提供的线程功能以及在线程之间的数据传输的其它 功效。该自动转换与当前通常需要的、用于通过重写上述MPI源代码程序来转换MPI源代 码程序以使用线程功能的技术形成对比。例如,在对在共享存储器或集群(cluster)环境 中实现MPI功能的尝试中,加利福尼亚大学圣巴巴拉分校的研究人员已经开发了称为TMPI 的技术,其包括了针对MPI环境中的线程的编译时间和运行时间支持。编译时间转换采用 线程特定数据结构来消除C代码中的全局和静态变量的使用。运行时间支持包括基于无锁 队列管理方案的点对点通信协议。但是,源代码程序必须被修改以使用该点对点通信协议, 并且不能对将使用线程功能在MPI环境中运行的未修改的源代码程序进行自动转换。图5是描述了合适的数据处理环境501的框图,在该环境中可以实现本发明的示 例性实施例的某些方面。数据处理环境501包括处理系统500,其包括一个或多个处理器或 中央处理单元(CPU),在图中显示为处理器510A和510B。本领域的技术人员将意识到,虽 然示出了两个处理器,但是单个处理器或任意数量的多个处理器可以向处理系统500提供 处理器功能。处理器510A和510B中的每一个可以是单核的或多核的处理器。处理器510A 和510B被显示为经由一个或多个系统总线540或其它通信路径或介质可通信地耦合到包 括存储器520在内的各种其它部件。处理器510A和510B还被显示为经由点对点处理器互 连511而连接,所述互连511例如HyperTransport链路或Intel快速路径互连(QPI)。如以上参照图3和4所描述的,转换器560将MPI源代码程序转换为基于MPI线 程的程序。转换器560可以被实现为在存储器520内的、由处理器510A和/或处理器510B 所执行的指令。如本文所使用的,术语“处理系统”和“数据处理系统”旨在广泛地涵盖单个机器或 可通信地耦合在一起并一同工作的机器或设备的系统。示例性处理系统包括分布式计算 系统、超级计算机、高性能计算系统、计算集群、大型计算机、小型计算机、客户服务器系统、 个人计算机、工作站、服务器、便携式计算机、膝上型计算机、平板电脑、电话、个人数字助理 (PDA)、手持设备、诸如音频和/或视频设备这样的娱乐设备、以及用于处理或传送信息的 其它设备,但是处理器系统不限于此。可以至少部分地由来自传统的输入设备(例如,键盘、鼠标等)的输入和/或由从 另一个机器、生物反馈(biometric feedback)或其它输入源或信号接收的命令,来控制处理系统500。处理系统500可以使用到一个或多个远程数据处理系统(没有示出)的一个 或多个连接,例如通过网络接口控制器(NIC) 550、调制解调器、或其它通信端口或耦合。可以通过物理和/或逻辑网络502(例如,局域网(LAN)、广域网(WAN)、内联网、互 联网等)将处理系统500互连到其它处理系统(没有示出)。涉及网络502的通信可以使 用各种有线和/或无线短距离或长距离载波和协议,包括射频(RF)、卫星、微波、电气和电 子工程师协会(IEEE)802. 11、蓝牙、光、红外线、电缆、激光等。在处理系统500内,处理器510A和510B可以被可通信地耦合到一个或多个易失 性的或非易失性的数据存储设备,例如存储器520。处理器510A和510B经由系统总线540 和互连541a、541b和541m连接到存储器520。存储器520可以包括随机存取存储器(RAM)、 只读存储器(ROM)、大容量存储设备,例如集成驱动电子设备(IDE)硬盘驱动器,和/或其它 设备或介质,例如软盘、光存储、磁带、闪速存储器、记忆棒、数字视频盘、生物存储等。为了 该公开,术语“ROM”通常可以用于指非易失性存储器设备,例如可擦除可编程ROM(EPROM)、 电可擦除可编程ROM(EEPROM)、闪存ROM、闪速存储器等。处理器510A和510B还可以可通信 地耦合到另外的部件,例如视频控制器、小型计算机系统接口(SCSI)控制器、网络控制器、 通用串行总线(USB)控制器、输入设备,例如键盘和鼠标等。处理系统500还可以包括一 个或多个桥或中心,例如存储器控制器中心、输入/输出(I/O)控制器中心、PCI根桥(PCI root bridge)等,它们用于可通信地耦合各种系统部件。如本文所使用的,术语“总线”可 以用于指共享的通信路径,以及点对点路径。系统总线540还提供了经由互连541η的对网 络接口 550的访问。一些部件(例如NIC)可以被实现为具有用于与总线进行通信的接口(例如,PCI 连接器)的适配器卡。在一个实施例中,使用例如可编程或不可编程逻辑器件或阵列、专用 集成电路(ASIC)、嵌入式计算机、智能卡等的部件,可以将一个或多个设备实现为嵌入式控 制器。可以用硬件、软件、固件或这些实现方式的组合来实现本文公开的装置的实施例。 本发明的实施例可以被实现为在可编程系统上执行的计算机程序,所述可编程系统包括至 少一个处理器、数据存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个 输入设备,以及至少一个输出设备。可以将程序代码应用到输入数据以执行本文描述的功能并且生成输出信息。本发 明的实施例还包括包含指令或包含设计数据的机器可访问介质,所述指令用于执行本发明 的操作,所述设计数据例如是HDL,其定义了本文描述的结构、电路、装置、处理器和/或系 统特征。这些实施例还可以被称为程序产品。这种机器可访问存储介质可以包括由机器或设备制造或形成的粒子的有形排列, 包括存储介质,例如硬盘,任何其它类型的盘(包括软盘、光盘、光盘只读存储器(CD-ROM)、 可重写光盘(⑶-RW)和磁光盘)、半导体设备(例如只读存储器(ROM)、诸如动态随机存取 存储器(DRAM)和静态随机存取存储器(SRAM)这样的随机存取存储器(RAM)、可擦除可编程 只读存储器(EPROM)、闪速可编程存储器(FLASH)、电可擦除可编程只读存储器(EEPROM))、 磁卡或光卡、或适合于存储电子指令的任何其它类型的介质,但机器可访问存储介质并不 限于此。可以按照已知的方式将输出信息应用到一个或多个输出设备。为了该应用,处理系统包括具有处理器的任何系统,处理器例如数字信号处理器(DSP)、微控制器、专用集 成电路(ASIC)或微处理器。可以用高级过程式或面向对象编程语言来实现程序以与处理系统进行通信。如果 期望的话,还可以以汇编或机器语言来实现程序。事实上,本文描述的机制在范围上并不限 于任何特定的编程语言。在任何情况下,语言可以是编译的或是解释的语言。本文呈现了用于将MPI源代码程序自动地转换为基于MPI线程的程序的方法和系 统的实施例。虽然已经示出并描述了本发明的特定实施例,但是对本领域的技术人员来说 显而易见的是,可以在不脱离所附权利要求的范围的情况下,进行大量改变、修改和更改。 因此,本领域的技术人员将意识到,在不脱离本发明的更宽的方面的情况下,可以进行改变 和更改。所附权利要求将在它们的范围内包括落入本发明的真实范围和精神内的所有这种 改变、修改和更改。
权利要求
一种方法,包括响应于将MPI源代码程序转换为基于MPI线程的程序的命令,由处理器执行的转换器来执行以下操作将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量;识别用于建立所述基于MPI线程的程序的可执行版本的库;以及使用所述识别的库建立所述基于MPI线程的程序的可执行版本。
2.根据权利要求1所述的方法,还包括在所述基于MPI线程的程序的可执行版本在第二处理器上执行期间,通过将所述第一 私有变量的内容直接提供给所述第二线程,从而将数据从所述第一线程传输到所述第二线程。
3.根据权利要求2所述的方法,其中,将所述数据从所述第一线程传输到所述第二线程不使用共享存储器段来传输所述数据。
4.根据权利要求1所述的方法,其中 所述识别的库支持多线程。
5.根据权利要求1所述的方法,还包括检查所述MPI源代码程序以发现下列状况中的一个第一状况,其中,当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具 有第一大小,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据 具有第二大小,其中,所述第一大小和所述第二大小不同;第二状况,其中,当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具 有第一格式,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据 具有第二格式,其中,所述第一格式和所述第二格式不同;第三状况,其中,所述MPI源代码程序的组件具有一变量,该变量将来自所述组件的第 一实例的值保留到所述组件的第二实例;第四状况,其依赖于所述处理器的状态;以及 第五状况,其依赖于所述处理器的控制字的状态;以及响应于发现了所述第一、第二、第三、第四和第五状况中的一个状况,拒绝转换所述MPI 源代码程序的命令。
6.根据权利要求1所述的方法,其中所述识别的库包括代码以在所述基于MPI线程的程序的执行期间执行以下操作 识别由所述第一线程对第一文件的访问; 使得所述第一线程通过第一文件句柄来访问所述第一文件; 识别由所述第二线程对所述第一文件的访问;使得所述第二线程通过第二文件句柄来访问所述第一文件,其中,所述第二文件句柄 不同于所述第一文件句柄。
7.根据权利要求1所述的方法,其中所述识别的库包括代码以在所述基于MPI线程的程序的执行期间执行以下操作识别新进程的实例化;响应于识别到新进程的实例化,使得用于所述基于MPI线程的程序的对应线程被实例化。
8.一种系统,包括 至少一个处理器;以及存储器,其包括用于使在所述处理器上执行的转换器响应于将MPI源代码程序转换为 基于MPI线程的程序的命令来执行以下操作的指令将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一 私有变量和用于第二线程的第二私有变量;识别用于建立所述基于MPI线程的程序的可执行版本的库;以及 使用所述识别的库建立所述基于MPI线程的程序的可执行版本。
9.根据权利要求8所述的系统,其中,所述存储器还包括用于执行以下操作的指令 在所述基于MPI线程的程序的可执行版本在第二处理器上执行期间,通过将所述第一私有变量的内容直接提供给所述第二线程,从而将数据从所述第一线程传输到所述第二线 程。
10.根据权利要求9所述的系统,其中将所述数据从所述第一线程传输到所述第二线程不使用共享存储器段来传输所述数据。
11.根据权利要求8所述的系统,其中 所述识别的库支持多线程。
12.根据权利要求8所述的系统,其中,用于所述转换器的指令还包括用于执行以下操 作的指令检查所述MPI源代码程序以发现下列状况中的一个第一状况,其中,当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具 有第一大小,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据 具有第二大小,其中,所述第一大小和所述第二大小不同;第二状况,其中,当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具 有第一格式,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据 具有第二格式,其中,所述第一格式和所述第二格式不同;第三状况,其中,所述MPI源代码程序的组件具有一变量,该变量将来自所述组件的第 一实例的值保留到所述组件的第二实例;第四状况,其依赖于所述处理器的状态;以及 第五状况,其依赖于所述处理器的控制字的状态;以及响应于发现了所述第一、第二、第三、第四和第五状况中的一个状况,拒绝转换所述MPI 源代码程序的命令。
13.根据权利要求8所述的系统,其中,所述识别的库包括用于在所述基于MPI线程的程序的执行期间执行以下操作的代码识别由所述第一线程对第一文件的访问;使得所述第一线程通过第一文件句柄来访问所述第一文件;识别由所述第二线程对所述第一文件的访问;使得所述第二线程通过第二文件句柄来访问所述第一文件,其中,所述第二文件句柄 不同于所述第一文件句柄。
14.根据权利要求8所述的系统,其中,所述识别的库包括用于在所述基于MPI线程的程序的执行期间执行以下操作的代码 识别新进程的实例化;响应于识别到新进程的实例化,使得用于所述基于MPI线程的程序的对应线程被实例化。
15.一种装置,包括用于响应于将MPI源代码程序转换为基于MPI线程的程序的命令的模块,所述模块包括用于将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的 第一私有变量和用于第二线程的第二私有变量的模块;用于识别用于建立所述基于MPI线程的程序的可执行版本的库的模块;以及 用于使用所述识别的库建立所述基于MPI线程的程序的可执行版本的模块。
全文摘要
一种方法、系统和包含指令的计算机程序产品,用于将MPI源代码程序自动地转换为基于MPI线程的程序。响应于MPI源代码程序的形式的输入和命令,转换器将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量。识别用于支持在基于MPI线程的程序的执行期间将进程转换为线程的库,并且使用所述识别的库建立所述基于MPI线程的程序的可执行版本。所述识别的库可以包括用于以下操作的代码在基于MPI线程的程序执行时识别新进程的实例化,并且作为响应,使得用于基于MPI线程的程序的对应线程被实例化。
文档编号G06F9/54GK101937367SQ20101022129
公开日2011年1月5日 申请日期2010年6月30日 优先权日2009年6月30日
发明者A·V·索巴洛夫, R·F·范德韦恩加特, S·J·惠特洛克 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1