MPI源代码程序到基于MPI线程的程序的自动转换.pdf

上传人:e2 文档编号:1031642 上传时间:2018-03-27 格式:PDF 页数:16 大小:509.82KB
返回 下载 相关 举报
摘要
申请专利号:

CN201010221296.1

申请日:

2010.06.30

公开号:

CN101937367A

公开日:

2011.01.05

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 9/46申请日:20100630|||公开

IPC分类号:

G06F9/46; G06F9/54

主分类号:

G06F9/46

申请人:

英特尔公司

发明人:

A·V·索巴洛夫; R·F·范德韦恩加特; S·J·惠特洛克

地址:

美国加利福尼亚

优先权:

2009.06.30 US 12/459,314

专利代理机构:

永新专利商标代理有限公司 72002

代理人:

王英;刘炳胜

PDF下载: PDF下载
内容摘要

一种方法、系统和包含指令的计算机程序产品,用于将MPI源代码程序自动地转换为基于MPI线程的程序。响应于MPI源代码程序的形式的输入和命令,转换器将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量。识别用于支持在基于MPI线程的程序的执行期间将进程转换为线程的库,并且使用所述识别的库建立所述基于MPI线程的程序的可执行版本。所述识别的库可以包括用于以下操作的代码:在基于MPI线程的程序执行时识别新进程的实例化,并且作为响应,使得用于基于MPI线程的程序的对应线程被实例化。

权利要求书

1: 一种方法, 包括 : 响应于将 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 线程的程序的执行期间执行以下操作 : 2 识别新进程的实例化 ; 响应于识别到新进程的实例化, 使得用于所述基于 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 线程的程序的执行期间执行以下操作的代码 : 识别由所述第一线程对第一文件的访问 ; 使得所述第一线程通过第一文件句柄来访问所述第一文件 ; 3 识别由所述第二线程对所述第一文件的访问 ; 使得所述第二线程通过第二文件句柄来访问所述第一文件, 其中, 所述第二文件句柄 不同于所述第一文件句柄。
14: 根据权利要求 8 所述的系统, 其中, 所述识别的库包括用于在所述基于 MPI 线程的程序的执行期间执行以下操作的代码 : 识别新进程的实例化 ; 响应于识别到新进程的实例化, 使得用于所述基于 MPI 线程的程序的对应线程被实例 化。
15: 一种装置, 包括 : 用于响应于将 MPI 源代码程序转换为基于 MPI 线程的程序的命令的模块, 所述模块包 括: 用于将所述 MPI 源代码程序的全局变量声明为线程私有变量, 以创建用于第一线程的 第一私有变量和用于第二线程的第二私有变量的模块 ; 用于识别用于建立所述基于 MPI 线程的程序的可执行版本的库的模块 ; 以及 用于使用所述识别的库建立所述基于 MPI 线程的程序的可执行版本的模块。

说明书


MPI 源代码程序到基于 MPI 线程的程序的自动转换

    版权声明
     本文包含的内容是受到版权保护的。 当专利公开出现在专利商标局的专利文件或 记录中时, 版权所有者不反对任何人复制本专利公开, 但是在其它情况下保留对版权的所 有权利。
     技术领域
     本公开总体上涉及将在消息传递基础结构中运行的计算机程序的自动转换。 背景技术 许多计算问题可以被细分为独立的或松散依赖的任务, 这些任务可以分布在一组 处理器或系统中并且可以并行地执行。 该技术通常允许比在由单个处理器或系统执行所有 任务时更快地解决主要问题。有时, 处理时间可以与在子任务上工作的处理器或系统的数 量成比例地降低。除了当需要与其它任务交换数据时, 每个进程可以独立地计算。
     可以根据需要, 通过在协作的处理器和系统之间发送消息来协调所述处理器和系 统。消息还可以用于分发工作以及收集结果。对问题的一些划分和分解会极大地需要消息 传递基础结构, 或者通过发送和接收大量的消息, 或者通过在消息内传输大量的数据。
     可以将消息通过许多不同的通信信道或 “结构 (fabric)” 从一个进程传输到另一 个进程。例如, 在同一物理机器上执行的进程能够使用多处理器机器上的共享存储器或点 对点处理器互连有效地进行通信。 在不同机器上的进程可以通过高速网络进行通信, 例如 :
     (InfiniBand 贸易协会的注册商标 )、(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 程序实例化 n 个进程 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 示出了根据本发明的一个实施例的、 在转换为线程的进程之间的数据传输。n 个进程 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 线程的程序的命令。例如, 假设用如 下命令来调用编译器以编译源代码程序 : test.c $ mpicc-o test_mpi_process test.c。 在响应于该命令编译完 test.c 之后, 输出程序 test_mpi_process 将作为基于进程的传统 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 还提供了经由互连 541n 的对网 络接口 550 的访问。
     一些部件 ( 例如 NIC) 可以被实现为具有用于与总线进行通信的接口 ( 例如, PCI 连接器 ) 的适配器卡。在一个实施例中, 使用例如可编程或不可编程逻辑器件或阵列、 专用 集成电路 (ASIC)、 嵌入式计算机、 智能卡等的部件, 可以将一个或多个设备实现为嵌入式控 制器。
     可以用硬件、 软件、 固件或这些实现方式的组合来实现本文公开的装置的实施例。 本发明的实施例可以被实现为在可编程系统上执行的计算机程序, 所述可编程系统包括至 少一个处理器、 数据存储系统 ( 包括易失性和非易失性存储器和 / 或存储元件 )、 至少一个 输入设备, 以及至少一个输出设备。
     可以将程序代码应用到输入数据以执行本文描述的功能并且生成输出信息。 本发 明的实施例还包括包含指令或包含设计数据的机器可访问介质, 所述指令用于执行本发明 的操作, 所述设计数据例如是 HDL, 其定义了本文描述的结构、 电路、 装置、 处理器和 / 或系 统特征。这些实施例还可以被称为程序产品。
     这种机器可访问存储介质可以包括由机器或设备制造或形成的粒子的有形排列, 包括存储介质, 例如硬盘, 任何其它类型的盘 ( 包括软盘、 光盘、 光盘只读存储器 (CD-ROM)、 可重写光盘 (CD-RW) 和磁光盘 )、 半导体设备 ( 例如只读存储器 (ROM)、 诸如动态随机存取 存储器 (DRAM) 和静态随机存取存储器 (SRAM) 这样的随机存取存储器 (RAM)、 可擦除可编程 只读存储器 (EPROM)、 闪速可编程存储器 (FLASH)、 电可擦除可编程只读存储器 (EEPROM))、 磁卡或光卡、 或适合于存储电子指令的任何其它类型的介质, 但机器可访问存储介质并不 限于此。
     可以按照已知的方式将输出信息应用到一个或多个输出设备。为了该应用, 处理系统包括具有处理器的任何系统, 处理器例如 : 数字信号处理器 (DSP)、 微控制器、 专用集 成电路 (ASIC) 或微处理器。
     可以用高级过程式或面向对象编程语言来实现程序以与处理系统进行通信。 如果 期望的话, 还可以以汇编或机器语言来实现程序。 事实上, 本文描述的机制在范围上并不限 于任何特定的编程语言。在任何情况下, 语言可以是编译的或是解释的语言。
     本文呈现了用于将 MPI 源代码程序自动地转换为基于 MPI 线程的程序的方法和系 统的实施例。虽然已经示出并描述了本发明的特定实施例, 但是对本领域的技术人员来说 显而易见的是, 可以在不脱离所附权利要求的范围的情况下, 进行大量改变、 修改和更改。 因此, 本领域的技术人员将意识到, 在不脱离本发明的更宽的方面的情况下, 可以进行改变 和更改。 所附权利要求将在它们的范围内包括落入本发明的真实范围和精神内的所有这种 改变、 修改和更改。

MPI源代码程序到基于MPI线程的程序的自动转换.pdf_第1页
第1页 / 共16页
MPI源代码程序到基于MPI线程的程序的自动转换.pdf_第2页
第2页 / 共16页
MPI源代码程序到基于MPI线程的程序的自动转换.pdf_第3页
第3页 / 共16页
点击查看更多>>
资源描述

《MPI源代码程序到基于MPI线程的程序的自动转换.pdf》由会员分享,可在线阅读,更多相关《MPI源代码程序到基于MPI线程的程序的自动转换.pdf(16页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN101937367A43申请公布日20110105CN101937367ACN101937367A21申请号201010221296122申请日2010063012/459,31420090630USG06F9/46200601G06F9/5420060171申请人英特尔公司地址美国加利福尼亚72发明人AV索巴洛夫RF范德韦恩加特SJ惠特洛克74专利代理机构永新专利商标代理有限公司72002代理人王英刘炳胜54发明名称MPI源代码程序到基于MPI线程的程序的自动转换57摘要一种方法、系统和包含指令的计算机程序产品,用于将MPI源代码程序自动地转换为基于MPI线程的程序。响应于。

2、MPI源代码程序的形式的输入和命令,转换器将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量。识别用于支持在基于MPI线程的程序的执行期间将进程转换为线程的库,并且使用所述识别的库建立所述基于MPI线程的程序的可执行版本。所述识别的库可以包括用于以下操作的代码在基于MPI线程的程序执行时识别新进程的实例化,并且作为响应,使得用于基于MPI线程的程序的对应线程被实例化。30优先权数据51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书3页说明书8页附图4页CN101937368A1/3页21一种方法,包括响应于将M。

3、PI源代码程序转换为基于MPI线程的程序的命令,由处理器执行的转换器来执行以下操作将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量;识别用于建立所述基于MPI线程的程序的可执行版本的库;以及使用所述识别的库建立所述基于MPI线程的程序的可执行版本。2根据权利要求1所述的方法,还包括在所述基于MPI线程的程序的可执行版本在第二处理器上执行期间,通过将所述第一私有变量的内容直接提供给所述第二线程,从而将数据从所述第一线程传输到所述第二线程。3根据权利要求2所述的方法,其中,将所述数据从所述第一线程传输到所述第二线程不使用共享存储器段来。

4、传输所述数据。4根据权利要求1所述的方法,其中所述识别的库支持多线程。5根据权利要求1所述的方法,还包括检查所述MPI源代码程序以发现下列状况中的一个第一状况,其中,当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具有第一大小,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据具有第二大小,其中,所述第一大小和所述第二大小不同;第二状况,其中,当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具有第一格式,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据具有第二格式,其中,所述第一格式和所述第二格式不同;第三状况,其中,所述MPI源代。

5、码程序的组件具有一变量,该变量将来自所述组件的第一实例的值保留到所述组件的第二实例;第四状况,其依赖于所述处理器的状态;以及第五状况,其依赖于所述处理器的控制字的状态;以及响应于发现了所述第一、第二、第三、第四和第五状况中的一个状况,拒绝转换所述MPI源代码程序的命令。6根据权利要求1所述的方法,其中所述识别的库包括代码以在所述基于MPI线程的程序的执行期间执行以下操作识别由所述第一线程对第一文件的访问;使得所述第一线程通过第一文件句柄来访问所述第一文件;识别由所述第二线程对所述第一文件的访问;使得所述第二线程通过第二文件句柄来访问所述第一文件,其中,所述第二文件句柄不同于所述第一文件句柄。7。

6、根据权利要求1所述的方法,其中所述识别的库包括代码以在所述基于MPI线程的程序的执行期间执行以下操作权利要求书CN101937367ACN101937368A2/3页3识别新进程的实例化;响应于识别到新进程的实例化,使得用于所述基于MPI线程的程序的对应线程被实例化。8一种系统,包括至少一个处理器;以及存储器,其包括用于使在所述处理器上执行的转换器响应于将MPI源代码程序转换为基于MPI线程的程序的命令来执行以下操作的指令将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量;识别用于建立所述基于MPI线程的程序的可执行版本的库;以及使。

7、用所述识别的库建立所述基于MPI线程的程序的可执行版本。9根据权利要求8所述的系统,其中,所述存储器还包括用于执行以下操作的指令在所述基于MPI线程的程序的可执行版本在第二处理器上执行期间,通过将所述第一私有变量的内容直接提供给所述第二线程,从而将数据从所述第一线程传输到所述第二线程。10根据权利要求9所述的系统,其中将所述数据从所述第一线程传输到所述第二线程不使用共享存储器段来传输所述数据。11根据权利要求8所述的系统,其中所述识别的库支持多线程。12根据权利要求8所述的系统,其中,用于所述转换器的指令还包括用于执行以下操作的指令检查所述MPI源代码程序以发现下列状况中的一个第一状况,其中,。

8、当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具有第一大小,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据具有第二大小,其中,所述第一大小和所述第二大小不同;第二状况,其中,当被所述MPI源代码程序的第一组件访问时,空白公共块中的数据具有第一格式,并且当被所述MPI源代码程序的第二组件访问时,所述空白公共块中的数据具有第二格式,其中,所述第一格式和所述第二格式不同;第三状况,其中,所述MPI源代码程序的组件具有一变量,该变量将来自所述组件的第一实例的值保留到所述组件的第二实例;第四状况,其依赖于所述处理器的状态;以及第五状况,其依赖于所述处理器的控制字的状态。

9、;以及响应于发现了所述第一、第二、第三、第四和第五状况中的一个状况,拒绝转换所述MPI源代码程序的命令。13根据权利要求8所述的系统,其中,所述识别的库包括用于在所述基于MPI线程的程序的执行期间执行以下操作的代码识别由所述第一线程对第一文件的访问;使得所述第一线程通过第一文件句柄来访问所述第一文件;权利要求书CN101937367ACN101937368A3/3页4识别由所述第二线程对所述第一文件的访问;使得所述第二线程通过第二文件句柄来访问所述第一文件,其中,所述第二文件句柄不同于所述第一文件句柄。14根据权利要求8所述的系统,其中,所述识别的库包括用于在所述基于MPI线程的程序的执行期间。

10、执行以下操作的代码识别新进程的实例化;响应于识别到新进程的实例化,使得用于所述基于MPI线程的程序的对应线程被实例化。15一种装置,包括用于响应于将MPI源代码程序转换为基于MPI线程的程序的命令的模块,所述模块包括用于将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量的模块;用于识别用于建立所述基于MPI线程的程序的可执行版本的库的模块;以及用于使用所述识别的库建立所述基于MPI线程的程序的可执行版本的模块。权利要求书CN101937367ACN101937368A1/8页5MPI源代码程序到基于MPI线程的程序的自动转换0001。

11、版权声明0002本文包含的内容是受到版权保护的。当专利公开出现在专利商标局的专利文件或记录中时,版权所有者不反对任何人复制本专利公开,但是在其它情况下保留对版权的所有权利。技术领域0003本公开总体上涉及将在消息传递基础结构中运行的计算机程序的自动转换。背景技术0004许多计算问题可以被细分为独立的或松散依赖的任务,这些任务可以分布在一组处理器或系统中并且可以并行地执行。该技术通常允许比在由单个处理器或系统执行所有任务时更快地解决主要问题。有时,处理时间可以与在子任务上工作的处理器或系统的数量成比例地降低。除了当需要与其它任务交换数据时,每个进程可以独立地计算。0005可以根据需要,通过在协作。

12、的处理器和系统之间发送消息来协调所述处理器和系统。消息还可以用于分发工作以及收集结果。对问题的一些划分和分解会极大地需要消息传递基础结构,或者通过发送和接收大量的消息,或者通过在消息内传输大量的数据。0006可以将消息通过许多不同的通信信道或“结构FABRIC”从一个进程传输到另一个进程。例如,在同一物理机器上执行的进程能够使用多处理器机器上的共享存储器或点对点处理器互连有效地进行通信。在不同机器上的进程可以通过高速网络进行通信,例如INFINIBAND贸易协会的注册商标、MYRICOM公司ARCADIA,CALIFORNIA的注册商标、可缩放相干接口“SCI”、或由QUADRICS有限公司B。

13、RISTOL,UNITEDKINGDOM提供的QSNET。这些网络可以提供自然操作模式NATIVEOPERATIONALMODE以及仿真模式EMULATIONMODE,自然操作模式暴露可从结构获得的所有特征,仿真模式允许由遗留软件LEGACYSOFTWARE使用网络。进程还可以经由传统网络例如以太网来通信。0007可以定义一组标准的消息传递函数,并且可以提供库以在每种类型的结构上执行标准函数。消息传递接口“MPI”是定义基本应用编程接口API的工业标准,用于在消息传递方面对分布式存储器和共享存储器系统进行编程。由MPI论坛的成员定义了MPI标准参见MPI“AMESSAGEPASSINGINTE。

14、RFACESTANDARD”21版,消息传递接口论坛,2008年6月23日,其可从XWWWXMPIFORUMORG/DOCS/获得,其中,在URL中用“XWWWX”替换了“WWW”以避免从该文档内的有效链接。MPI或类似的库可以提供在一个或多个结构上的标准函数。0008在进程内的多个线程有时用于共享资源,例如存储器,这具有以下优点线程不需要使用消息传递机制来进行通信。线程在利用多处理器系统中的不同处理器核心方面特别有用。多处理器系统中的操作系统可以在运行于不同处理器核心上的线程之间分配任务,并且可以利用对于线程可行的数据共享,所述线程运行在公共地址空间内,并且在多处理说明书CN10193736。

15、7ACN101937368A2/8页6器环境内有处理器互连可用。0009但是,在MPI环境中,在一个进程内的多个线程需要遵循特定的实现技术。在MPI标准下,每个MPI进程通常被映射到唯一的操作系统进程。进程的地址空间仅可以由另一个进程通过调用MPI库函数来访问。如在MPI2规范的124节“MPI和线程”中所指出的,在进程内的每个线程可以发出MPI调用;但是,线程不是独立可寻址的,因为在发送或接收调用中的参数识别进程而不是线程。发送到一进程的消息可以由该进程中的任何线程接收。进程具有多线程的事实不影响进程的外部接口。0010为了遵守MPI标准,如在MPI2规范的124节“MPI和线程”中所规定的。

16、,适应线程的实现必须确保所有MPI调用是线程安全的并且阻塞MPI调用仅阻塞调用线程,允许其它线程执行,如果有的话。但是,为了满足该标准,需要使用例如允许一次仅由一个线程进行访问的互斥原语PRIMITIVE来保护由发出MPI调用的线程使用的静态和全局变量。适应线程的实现通常需要由程序员使用例如POSIX线程这样的技术或根据混合的MPI/OPENMP标准来写源代码程序。这些复杂的编程模式PROGRAMINGPARADIGM增加了程序复杂性,并且会降低整体的程序性能。这种实现将抵销使用线程的多个优点中的一个优点,线程可以使用静态和全局变量进行通信,而没有通过共享存储器机制发送消息的开销。附图说明00。

17、11图1示出了在使用共享存储器段的MPI基础结构中运行的进程之间的数据传输。0012图2说明了根据本发明的一个实施例的、在转换为线程的进程之间的数据传输。0013图3是示出了根据本发明的一个实施例的、MPI源代码程序到基于MPI线程的程序的转换器的操作的流程图。0014图4是根据本发明的一个实施例的、图3的转换器的操作的流程图。0015图5是描述了一个适当的数据处理环境的框图,其中,可以实现本发明的示例性实施例的某些方面。具体实施方式0016本发明的实施例包括用于将MPI源代码程序自动地转换为基于MPI线程的程序MPITHREADBASEDPROGRAM的方案。基于MPI线程的程序可用在不损害。

18、利用其它MPI功能的能力的情况下,利用线程的更快的数据传输能力。此外,通过将非线程化的MPI程序自动地转换为基于MPI线程的程序,可以在程序员不参与的情况下,自动地转换在此之前不能利用多处理器环境的许多遗留的MPI程序。该自动转换可以使得公司能够自动地并且便宜地将它们的MPI源代码程序库存移植到多处理器环境。0017响应于MPI源代码程序形式的输入和命令,转换器将所述MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量。识别用于支持在基于MPI线程的程序的执行期间将进程转换为线程的库,并且使用所述识别的库建立所述基于MPI线程的程序的可执行。

19、版本。所述识别的库可以包括用于以下操作的代码当基于MPI线程的程序执行时识别新进程的实例化,并且作为响应,使得用于基于MPI线程的程序的对应线程被实例化。可以通过将与全局变量相对应的线程的相应私有变量的内容直接提供给其它线程,从而将数据从一个线程传输到另一个线程。该数说明书CN101937367ACN101937368A3/8页7据传输不使用共享存储器段在线程之间传输所述数据。0018图1示出了在使用共享存储器段的MPI基础结构中运行的进程之间的数据传输。在通常的实现中,MPI程序实例化N个进程0到N1,在图1中显示为进程110、120和130。这些进程中的每一个具有其各自的地址空间,进程11。

20、0具有进程地址空间112,进程120具有进程地址空间122,并且进程130具有进程地址空间132。为了将数据102从进程110传输到进程120,必须由进程110将数据102从进程地址空间112传输到共享存储器段140,然后必须由进程120将数据102从共享存储器段140复制到进程地址空间122。这种数据传输操作需要两个存储器复制操作。0019共享存储器段140在进程之间被共享,并且可以是更大的主存储器的一部分,由不同进程对该部分的访问被协调。可以使用进程间通信来控制对共享存储器140的访问,其中,一个进程在随机存取存储器中创建其它进程可以访问的区域;或者可以通过使用虚拟存储器映射,将对通常是一。

21、段数据的多个副本的访问指引到单个实例来控制对共享存储器140的访问。可以由例如操作系统和/或虚拟化软件这样的资源来提供对共享存储器140的协调的访问。0020图2示出了根据本发明的一个实施例的、在转换为线程的进程之间的数据传输。N个进程0到N1被实例化为公共进程地址空间250内的线程0到N1。线程210、220和230中的每一个具有各自的一组私有变量,其中,线程210具有私有变量212,线程220具有私有变量222,线程230具有私有变量232。为了完成将数据102从线程210传输到线程220,可以将数据102从私有变量212内的地址直接传输到私有变量222内的地址。可以直接地来执行该数据传输。

22、,而不是间接地通过共享存储器段例如图1的共享存储器段140来进行,这是因为在公共进程地址空间250内的地址由线程210、220和230共享。执行直接传输而不是需要两个复制操作直接增加了程序的性能。0021图3是示出了根据本发明的一个实施例的、MPI源代码程序到可执行的基于MPI线程的程序的转换器的操作的流程图。转换器360将MPI源代码程序362和命令364作为输入,并且提供可执行的基于MPI线程的程序366作为输出。命令364可以是例如到转换器360的、将基于MPI源代码的程序编译为基于MPI线程的程序的命令。例如,假设用如下命令来调用编译器以编译源代码程序TESTCMPICCOTEST_M。

23、PI_PROCESSTESTC。在响应于该命令编译完TESTC之后,输出程序TEST_MPI_PROCESS将作为基于进程的传统MPI应用来执行。相反,用类似于如下形式的命令调用本发明的转换器以编译源代码程序TESTCMPICCMPI_ON_THREADSOTEST_TEST_MPITHREADTESTC。命令中的MPI_ON_THREADS这一部分将命令提供给编译器以产生输出程序TEST_MPI_THREAD作为可执行的基于MPI线程的程序。0022响应于命令364,转换器360将MPI源代码程序的全局变量声明为线程私有变量,以创建用于第一线程的第一私有变量和用于第二线程的第二私有变量。如本。

24、文所使用的,术语“全局变量”用于描述在进程内具有全局范围的变量,例如被声明为全局或静态变量的变量。当基于MPI线程的程序366被执行时,可以通过将与全局变量相对应的线程的相应私有变量的内容直接提供给其它线程,将数据从一个线程传输到另一个线程。这种数据传输不使用共享存储器段在线程之间传输数据。基于MPI线程的程序366可以在不损害利用其它MPI功能的能力的情况下,利用线程的更快的数据传输能力。说明书CN101937367ACN101937368A4/8页80023图4是根据本发明的一个实施例的、图3的转换器的操作的流程图。如上所述,转换器360接收MPI源代码程序362和命令364作为输入。处理。

25、在“响应于将MPI源代码程序转换为基于MPI线程的程序的命令,检查MPI源代码以发现指示问题代码的状况”的步骤410处开始。在该步骤中,转换器360检查MPI源代码程序362,以发现当将MPI进程转换为线程时有问题的多个不同状况。例如,通常用于建立MPI应用程序的一些语言例如,FORTRAN和C提供了可能不会被在进程内运行的线程正确处理的存储器管理特征。例如在FORTRAN中,在FORTRAN源代码程序的不同组件或子例程之间,在空白公共块中的数据在大小和格式LAYOUT方面可以改变。在空白公共块中的数据是在MPI进程内运行的线程之间共享的一种类型的全局变量。如果每个进程被转换为具有其自己版本的。

26、空白公共块的线程,则不同的组件之间的这种不同大小和格式可能不会被贯彻到每个组件。因为FORTRAN编译器通常独立地编译每个组件或子例程,所以转换器360需要检查MPI源代码以发现所有组件或子例程,以识别这种问题代码。0024为了识别这种特征,转换器360检查MPI源代码程序以发现以下状况其中,当由MPI源代码程序的第一组件访问时,在空白公共块中的数据具有第一大小,当由MPI源代码程序的第二组件访问时,在空白公共块中的数据具有第二大小,其中,所述第一大小和第二大小不同。在发现这种状况后,转换器360会将这种代码识别为对于到基于线程的实现的转换是有问题的。转换器360还可以检查MPI源代码程序以发。

27、现以下状况其中,当由MPI源代码程序的第一组件访问时,在空白公共块中的数据具有第一格式,并且当由MPI源代码程序的第二组件访问时,在空白公共块中的数据具有第二格式,其中,所述第一格式和第二格式不同。在发现这种状况时,转换器360会将这种代码识别为对于到基于线程的实现的转换是有问题的。0025转换器360搜索的其它类型的问题代码包括将数据从组件的一个实例保存到组件的下一实例中的代码。例如,FORTRAN提供了如下特征其中,组件可以拥有如下所述的变量,即,不管是否在同一线程内对组件进行实例化,所述变量都将它们的值从组件的一个实例保留到下一个实例。为了发现这种特征,转换器360检查MPI源代码程序,。

28、以发现MPI源代码程序的具有如下变量的组件,所述变量将来自该组件的第一实例的值保留到该组件的第二实例。在发现这种状况后,转换器360会将这种代码识别为对于到基于线程的实现的转换是有问题的。0026转换器360搜索的其它类型的问题代码包括依赖于处理器的状态或其控制字CONTROLWORD的代码。例如,如果程序的结果依赖于利用处理器的不同设置而工作的不同的MPI进程,那么如下所述的代码可能无法正确地转换为基于线程的实现,所述代码依赖于在特定状态中操作、或者以特定控制字操作以处理浮点操作的处理器。在发现这种状况后,转换器360会将这种代码识别为对于到基于线程的实现的转换是有问题的。0027响应于发现。

29、了指示问题代码的状况,转换器360进行到“指示问题代码的状况”决定点420的“是”分支,其中,所述问题代码针对到基于线程的实现的转换。控制进行到“拒绝转换MPI源代码程序的命令并且正常地生成MPI源代码程序的目标代码”步骤425。响应于发现所述状况,转换MPI源代码程序的命令被拒绝,并且正常地生成MPI源代码程序的目标代码。在另一个实施例中,不是生成MPI源代码程序的目标代码,而是转换器360可以拒绝转换MPI源代码程序的命令,并且在不产生MPI源代码程序的可执行版本的情况下说明书CN101937367ACN101937368A5/8页9终止。0028响应于未发现指示了问题代码的状况,转换器3。

30、60进行到“指示了问题代码的状况”决定点420的“否”分支。控制进行到“生成目标代码以将MPI源代码程序的全局变量声明为线程私有变量”步骤430。在该步骤,转换器360生成目标代码以将MPI源代码程序的每一个全局变量声明为线程私有变量。这种声明的结果是将为在公共父进程地址空间内的每一个线程创建单独的私有变量,类似于图2的公共进程地址空间250内的线程私有变量212、222和232。为了确保线程私有变量是有效的,应当由转换器360所产生的基于MPI线程的程序中的对应的线程来实例化由MPI源代码程序来实例化的每一个进程。0029为了确保当执行基于MPI线程的程序时,线程而不是MPI进程被实例化,必。

31、须使用合适的库以建立基于MPI线程的程序的可执行版本。因此,控制从“生成目标代码以将MPI源程序的全局变量声明为线程私有变量”步骤430进行到“识别合适的库以建立可执行代码”步骤440。例如,用于建立基于MPI线程的程序的可执行版本的每一个库应当支持多线程。通过使用多线程系统库,操作系统可以利用多核处理器内的多个核心来实例化不同线程,以执行任务,由此加速了基于MPI线程的程序的执行。0030还预见到,正确地处理基于MPI线程的程序可能需要使用特定的库以使得能够将MPI进程转换为线程。这些库可以包括用于使得特定功能将在初始化MPI进程或在建立MPI执行环境时被调用的代码。例如,在库内的代码可以用。

32、于在基于MPI线程的程序的执行期间识别新进程的实例化。响应于识别到新进程的实例化,所述库可以调用代码以使得用于基于MPI线程的程序的对应线程被实例化。新进程的实例化可以被识别为响应于MPI_INIT命令而发生,该命令产生MPI进程。代替产生一新的MPI进程,针对MPI_INIT命令的代码可以实例化一线程。然后,该线程可以执行本应由原始的MPI源代码程序中的正被初始化的MPI进程执行的功能。0031或者可以响应于MPI_INIT命令,或者可以更早地在建立MPI执行环境时,来创建替代MPI进程执行MPI功能的线程。例如,MPIEXEC命令可以用于初始化MPI执行环境,并且响应于MPIEXEC命令可。

33、以实例化许多线程。在线程被实例化之后,当调用MPI_INIT以实例化新进程时,针对MPI_INIT命令的代码可以映射已经存在的线程中的一个线程以代替MPI进程执行功能。0032在MPI进程的基于线程的实现中可能有问题的另一个类型的状况是文件输入/输出I/O。当不同的进程读和写公共文件时,通常操作系统的文件系统组件处理文件I/O的协调,以确保由不同进程进行的操作的正确排序。如果这些进程被转换为线程,则由不同线程对访问文件I/O单元或句柄的尝试应当被当做它们在应用层与不同的文件有关来处理。可能需要来自合适的库的支持,以处理文件I/O的协调。这种库可以包括例如用于以下操作的代码识别由第一线程对第一文。

34、件的访问,使得第一线程通过第一文件句柄来访问第一文件,识别由第二线程对第一文件的访问,并且使得第二线程通过第二文件句柄访问第一文件,其中,所述第二文件句柄不同于所述第一文件句柄。0033在问题代码被识别并且MPI源代码程序的目标代码被正常地生成的情况下,控制从“拒绝转换MPI源代码程序的命令并且正常地生成MPI源代码程序的目标代码”步骤425进行到“识别合适的库以建立可执行代码”步骤440。在该情况下,将被使用的库不需要具有多线程的能力,而应当是为建立MPI源代码程序的可执行版本而正常需要的库。说明书CN101937367ACN101937368A6/8页100034从“识别合适的库以建立可执。

35、行代码”步骤440,控制进行到“使用识别的库以建立可执行代码”步骤450。使用识别的库来建立MPI源代码程序的可执行版本。如果没有发现问题代码,那么MPI源代码程序的可执行版本可以是基于MPI线程的程序,或者如果发现了问题代码,那么可以根据MPI源代码程序的正常生成的目标代码来建立可执行版本。0035一旦是线程而不是不同的MPI进程被实例化,就可以如参照图2所描述的在线程之间直接传输数据,而无需执行如参照图1所描述的到共享存储器段的复制操作以及从其进行的复制操作。在基于MPI线程的程序的可执行版本的执行期间,通过将第一私有变量的内容直接提供给第二线程,可以将数据从第一线程传输到第二线程。这种从。

36、第一线程到第二线程的数据传输不使用共享存储器段来传输数据。0036根据本发明的由转换器执行的转换过程是自动的。不需要为了产生具有基于MPI线程的程序366的形式的、使用线程的可执行程序,而对图3的MPI源代码程序362的源代码进行改变。通过自动地将MPI源代码程序362转换为基于线程的模式,基于MPI线程的程序366可以利用在多处理器环境中提供的线程功能以及在线程之间的数据传输的其它功效。该自动转换与当前通常需要的、用于通过重写上述MPI源代码程序来转换MPI源代码程序以使用线程功能的技术形成对比。例如,在对在共享存储器或集群CLUSTER环境中实现MPI功能的尝试中,加利福尼亚大学圣巴巴拉分。

37、校的研究人员已经开发了称为TMPI的技术,其包括了针对MPI环境中的线程的编译时间和运行时间支持。编译时间转换采用线程特定数据结构来消除C代码中的全局和静态变量的使用。运行时间支持包括基于无锁队列管理方案的点对点通信协议。但是,源代码程序必须被修改以使用该点对点通信协议,并且不能对将使用线程功能在MPI环境中运行的未修改的源代码程序进行自动转换。0037图5是描述了合适的数据处理环境501的框图,在该环境中可以实现本发明的示例性实施例的某些方面。数据处理环境501包括处理系统500,其包括一个或多个处理器或中央处理单元CPU,在图中显示为处理器510A和510B。本领域的技术人员将意识到,虽然。

38、示出了两个处理器,但是单个处理器或任意数量的多个处理器可以向处理系统500提供处理器功能。处理器510A和510B中的每一个可以是单核的或多核的处理器。处理器510A和510B被显示为经由一个或多个系统总线540或其它通信路径或介质可通信地耦合到包括存储器520在内的各种其它部件。处理器510A和510B还被显示为经由点对点处理器互连511而连接,所述互连511例如HYPERTRANSPORT链路或INTEL快速路径互连QPI。0038如以上参照图3和4所描述的,转换器560将MPI源代码程序转换为基于MPI线程的程序。转换器560可以被实现为在存储器520内的、由处理器510A和/或处理器5。

39、10B所执行的指令。0039如本文所使用的,术语“处理系统”和“数据处理系统”旨在广泛地涵盖单个机器或可通信地耦合在一起并一同工作的机器或设备的系统。示例性处理系统包括分布式计算系统、超级计算机、高性能计算系统、计算集群、大型计算机、小型计算机、客户服务器系统、个人计算机、工作站、服务器、便携式计算机、膝上型计算机、平板电脑、电话、个人数字助理PDA、手持设备、诸如音频和/或视频设备这样的娱乐设备、以及用于处理或传送信息的其它设备,但是处理器系统不限于此。0040可以至少部分地由来自传统的输入设备例如,键盘、鼠标等的输入和/或由从另一个机器、生物反馈BIOMETRICFEEDBACK或其它输入。

40、源或信号接收的命令,来控制处说明书CN101937367ACN101937368A7/8页11理系统500。处理系统500可以使用到一个或多个远程数据处理系统没有示出的一个或多个连接,例如通过网络接口控制器NIC550、调制解调器、或其它通信端口或耦合。0041可以通过物理和/或逻辑网络502例如,局域网LAN、广域网WAN、内联网、互联网等将处理系统500互连到其它处理系统没有示出。涉及网络502的通信可以使用各种有线和/或无线短距离或长距离载波和协议,包括射频RF、卫星、微波、电气和电子工程师协会IEEE80211、蓝牙、光、红外线、电缆、激光等。0042在处理系统500内,处理器510A。

41、和510B可以被可通信地耦合到一个或多个易失性的或非易失性的数据存储设备,例如存储器520。处理器510A和510B经由系统总线540和互连541A、541B和541M连接到存储器520。存储器520可以包括随机存取存储器RAM、只读存储器ROM、大容量存储设备,例如集成驱动电子设备IDE硬盘驱动器,和/或其它设备或介质,例如软盘、光存储、磁带、闪速存储器、记忆棒、数字视频盘、生物存储等。为了该公开,术语“ROM”通常可以用于指非易失性存储器设备,例如可擦除可编程ROMEPROM、电可擦除可编程ROMEEPROM、闪存ROM、闪速存储器等。处理器510A和510B还可以可通信地耦合到另外的部件。

42、,例如视频控制器、小型计算机系统接口SCSI控制器、网络控制器、通用串行总线USB控制器、输入设备,例如键盘和鼠标等。处理系统500还可以包括一个或多个桥或中心,例如存储器控制器中心、输入/输出I/O控制器中心、PCI根桥PCIROOTBRIDGE等,它们用于可通信地耦合各种系统部件。如本文所使用的,术语“总线”可以用于指共享的通信路径,以及点对点路径。系统总线540还提供了经由互连541N的对网络接口550的访问。0043一些部件例如NIC可以被实现为具有用于与总线进行通信的接口例如,PCI连接器的适配器卡。在一个实施例中,使用例如可编程或不可编程逻辑器件或阵列、专用集成电路ASIC、嵌入式。

43、计算机、智能卡等的部件,可以将一个或多个设备实现为嵌入式控制器。0044可以用硬件、软件、固件或这些实现方式的组合来实现本文公开的装置的实施例。本发明的实施例可以被实现为在可编程系统上执行的计算机程序,所述可编程系统包括至少一个处理器、数据存储系统包括易失性和非易失性存储器和/或存储元件、至少一个输入设备,以及至少一个输出设备。0045可以将程序代码应用到输入数据以执行本文描述的功能并且生成输出信息。本发明的实施例还包括包含指令或包含设计数据的机器可访问介质,所述指令用于执行本发明的操作,所述设计数据例如是HDL,其定义了本文描述的结构、电路、装置、处理器和/或系统特征。这些实施例还可以被称为。

44、程序产品。0046这种机器可访问存储介质可以包括由机器或设备制造或形成的粒子的有形排列,包括存储介质,例如硬盘,任何其它类型的盘包括软盘、光盘、光盘只读存储器CDROM、可重写光盘CDRW和磁光盘、半导体设备例如只读存储器ROM、诸如动态随机存取存储器DRAM和静态随机存取存储器SRAM这样的随机存取存储器RAM、可擦除可编程只读存储器EPROM、闪速可编程存储器FLASH、电可擦除可编程只读存储器EEPROM、磁卡或光卡、或适合于存储电子指令的任何其它类型的介质,但机器可访问存储介质并不限于此。0047可以按照已知的方式将输出信息应用到一个或多个输出设备。为了该应用,处理说明书CN10193。

45、7367ACN101937368A8/8页12系统包括具有处理器的任何系统,处理器例如数字信号处理器DSP、微控制器、专用集成电路ASIC或微处理器。0048可以用高级过程式或面向对象编程语言来实现程序以与处理系统进行通信。如果期望的话,还可以以汇编或机器语言来实现程序。事实上,本文描述的机制在范围上并不限于任何特定的编程语言。在任何情况下,语言可以是编译的或是解释的语言。0049本文呈现了用于将MPI源代码程序自动地转换为基于MPI线程的程序的方法和系统的实施例。虽然已经示出并描述了本发明的特定实施例,但是对本领域的技术人员来说显而易见的是,可以在不脱离所附权利要求的范围的情况下,进行大量改变、修改和更改。因此,本领域的技术人员将意识到,在不脱离本发明的更宽的方面的情况下,可以进行改变和更改。所附权利要求将在它们的范围内包括落入本发明的真实范围和精神内的所有这种改变、修改和更改。说明书CN101937367ACN101937368A1/4页13图1说明书附图CN101937367ACN101937368A2/4页14图2说明书附图CN101937367ACN101937368A3/4页15图3图4说明书附图CN101937367ACN101937368A4/4页16图5说明书附图CN101937367A。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1