专利名称:实现cpu/gpu异构平台的虚拟执行环境的方法
技术领域:
本发明涉及的是一种电信技术领域的方法,特别是一种实现CPU/GPU异构平台的 虚拟执行环境的方法。
背景技术:
多核技术是目前处理器发展的趋势,但是通过纯粹增加CPU内核的数量来提升处 理器的并行处理性能存在一定的极限。因此为了满足日益增长的计算需求,引入了针对某 些特定计算类型涉及的处理核,就形成了异构多核体系结构,针对特定的领域,异构核可以 弥补传统CPU计算的不足,而CPU/GPU就是近年来发展较快一种异构多核架构。GPU(图形 加速单元)适用于处理大量计算密集型的任务,诸如图像和多媒体处理等。由于它本身独 特的并行架构设计,使得它在很多时候可以比传统的x86处理器有更好的性能。可以将可 并行的高密度浮点计算放在GPU上执行,而CPU则执行传统处理器的主要任务,如运行操作 系统。因此针对GPU这种硬件的特定的编程环境已经成为目前学术界和企业界研究的热 点。NVIDIA推出的CUDA就是这样一个编程环境,它使得程序员可以充分利用GPU的功能来 进行编程,它为程序开发人员提供了 C语言的编程模式的API和SDK,但是对于程序开发人 员来讲,用CUDA编程依旧是很复杂的。这种特定的编程环境虽然可以利用GPU的性能,但 该方法主要存在着两个问题1、代码重写代价问题由于CPU上的程序无法直接在GPU上运行,需要按照并行模 型修改或重写源代码,目前有大量计算密集型程序是用通用的C/C++开发的,这样移植CPU 上的程序就是耗时长,工作量极大的任务。而且很多程序的源代码是难以获得的。2、二进制兼容性问题特定的编程环境会带来兼容性的问题,由于不同硬件的存 储系统以及处理器核心数目的的差异,编译后的程序在不同GPU产品上,有的甚至在同GPU 的不同代产品上也不兼容。由于以上不足之处,针对GPU的程序自动并行技术是一个比较好的方法。由于X86 架构上的程序是串行执行的,要使其运行在GPU上,就必须将其转化为并行的程序。自动并 行技术就是将用户编写的串行程序通过并行编译器编译,自动生成适合在并行计算机体系 结构上运行的代码。其中基于多面体模型的自动并行技术是目前应用比较多的,它可以将 可执行代码映射到多个核上面。目前基于多面体模型的技术主要用在编译时的优化方面, 尽管这在一定程度上减少了开发人员为使程序并行化重写代码的工作量,但是它是源代码 到源代码的转换,没有从根本上解决异构核上程序设计问题。比如针对NVIDIA的GPU,在 调用主机端函数或使用指针的时候会有些限制,仍然需要程序员去手动修改一些C/C++代 码。另外,它并不能解决二进制程序的兼容性问题。
发明内容
本发明的目的在于针对现有技术的不足,提供一种实现CPU/GPU异构平台的虚拟 执行环境的方法。本发明的虚拟执行环境GXBIT,在不用修改源代码的前提下,使得现有的
4由串行语言编译好的程序可以直接运行在GPU/CPU异构平台上,并且可以利用GPU来实现 程序的加速执行。本发明是通过以下技术方案实现的本发明利用动态二进制翻译技术使得程序运行在X86CPU和NVIDIA GPU混合架构 上,并且利用动态二进制翻译技术来收集程序的静态信息和动态信息,利用这些信息寻找 程序执行嵌套的循环、循环之间的依赖关系和进出热块的数据流;执行中分两阶段实施第一阶段、收集信息和优化热块,并存储到文件中;第二阶段、生成包含串行指令和并行指令的混合程序,执行含有混合指令的程序。本发明包括以下步骤①、首先对整个二进制程序文件进行静态分析,找到和标记出其中的嵌套循环部 分;②、然后对这部分单独执行,获得该块的控制流和数据流信息;③、利用这些信息建立多面体模型,检测循环之间的依赖;④、为后续生成并行指令的算法提供信息;⑤、静态分析结束后,开始动态执行。步骤①中所述的二进制程序中for循环进行分析、优化和并行化处理。所述的并行化处理,是指CPU的执行是线性的,而GPU采用了流计算模型,要在 GPU上运行传统的程序,必须改变程序的结构,将传统串行的程序转换变为流计算模型,包 括将串行的指令转换为并行的指令。所述的并行化处理的一个基本原则是保持原有程序运行的正确性。即必须要保 证并行化以后的程序中的数据流和控制流和原来在CPU上的串行程序是一样的。因此在 CPU切换到GPU时保存处理器的状态,并且在GPU的执行的时候要保持CPU状态寄存器的一 致性。所述的优化,是指结合了动态分析和静态分析,用静态分析找到二进制程序中的 循环部分,利用动态分析中获得循环的索引、循环的边界等信息,通过静态二进制分析得到 程序的全局信息,而程序执行时是单路径的,得不到全局信息;静态分析也有其缺陷,因为 有些信息只能在程序执行的时候获得,如条件跳转时的目的地址只能在执行的阶段获得, 而且静态分析要扫描所有的执行路径,因此开销较大;动态分析是在程序执行的时候进行 的,执行的路径取决于程序的输入,它获取的是程序在执行时的信息。所述的动态二进制翻译技术,是指基于Crossbit实现了一个CPU/GPU异构平台的 虚拟执行环境GXBIT,使得x86平台上程序可并行在X86CPU和NVIDIA GPU异构平台上,前 端将源机器指令翻译为自行设计的中间指令块,后端将中间指令翻译为目标机器指令并执 行。所述的执行的第一阶段、收集信息和优化热块,并存储到文件中,实施步骤如下1读入某个二进制可执行文件,首先扫描该文件中的可执行的代码段,找出其中所 有嵌套循环,将它们作为备选的热块。2然后只执行找到的嵌套循环部分,在执行的过程中,在每个访存指令后面插入额 外的指令,在执行的时候,所有的访存地址都会被记录下来。在最外层的循环执行了一次以 后,动态分析工具利用上述记录的访存地址信息建立多面体模型,该模型可以确定循环之间是否有依赖,如果没有依赖,则这些循环就可以被并行化在GPU上执行,并将这些循环设 置为热块。3优化器针对特定GPU架构对热块进行某些优化,最后将收集的信息和优化后的 热块存储到文件中。所述的执行的第二阶段、生成包含串行指令和并行指令的混合程序,执行含有混 合指令的程序,实施步骤如下1第二次读入该可执行文件,并装载上一阶段收集到的信息和优化后的热块,并获 取热块的入口和出口地址。2执行整个二进制文件,当执行流进入某一个热块中时,启动并行翻译引擎,将优 化后的热块翻译为GPU上可运行的并行指令。这样就生成了一个混合的二进制文件,它同 时包含串行指令和并行指令。3将上一步生成的混合指令放到CPU/GPU异构平台上执行,并且处理内存的一致 性问题。本发明目的是实现程序加速执行,在刚开始分析程序获取信息时要耗费时间,所 以为了减少开销,本发明采用两阶段的执行,第一个阶段是只执行程序一部分,目的在于分 析程序。在执行程序循环部分的时候,收集足够的信息以提取循环中可以并行化的部分,这 个策略是基于以下的假设在部分执行阶段可以收集到循环间依赖,内存访问等足够的信 息,用CUDA SDKSample和Parboil Benchmark进行实验得到的数据可以证明这一假设的正 确性。第二个阶段是执行整个程序,利用上一阶段执行所获取的信息,将循环中可以并行的 部分翻译为并行指令,这样就生成了包含串行指令和并行指令的混合程序,最后执行含有 混合指令的程序,性能会有很大的提高。而且由于热块中程序的执行流一般是不会改变的, 因此第一阶段只需要执行一次。本发明将所有输入流拷贝到全局内存中,将所有源寄存器和嵌套循环中的临时变 量映射到GPU的寄存器中。由于CPU与GPU异步内存系统,在GPU计算之前,数据先要拷贝 到GPU的内存中,这部分的数据的拷贝是通过调用GPU驱动中的API来完成的。另外,GPU 中内存架构包括混合cache和全局内存,不同存储层次上的数据作用不同。本发明的优点是在不修改程序源代码的情况下,利用了动态二进制翻译技术使得 传统的串行程序可以运行在CPU/GPU异构多核架构上,并且可以利用GPU实现程序执行的 加速。
具体实施例方式以下对本发明的实施例作详细说明以下实施例在以本发明技术方案为前提下进 行实施,给出了详细的实施方式和过程,但本发明的保护范围不限于下述的实施例。实施例GXBIT扩展了 Crossbit原有的中间指令VINST,设计了 GVINST。GVINST是一种底 层的、RISC类型的指令集,它定义了无限多个32位虚拟寄存器(vO到vn)和8个双精度的 浮点虚拟寄存器(f0到f7)。GVINST定义类RISC的访存指令(只有load和store才能访 问内存),唯一的寻址方式是偏移量寻址。大多数GVINST指令还有一个域指定了操作数的 类型。GVINST指令分为以下6大类
1状态映射2内存访问3数据移动4算术和逻辑计算5控制转移6特殊指令在GVINST指令中没有使用条件码,这是因为GXBIT的中间指令设计原则是易于分 析和传输,需要减少指令间依赖,因此引入了 COMPARE指令来模拟X86指令中条件码的行 为。这并不影响GPU计算的结果。GXBIT具体实现的步骤如下第一阶段主要目的是从源x86 二进制文件中提取流模型。1初始化GXBIT打开源可执行文件,读取程序头部,计算装载源映像所需的内存 空间大小,用系统调用mmap为源程序分配内存空间。然后读取节头部,找到.text节(.text 包含程序所有的可执行的代码)的位置,其中包含程序的可执行部分。在装载完源程序后, GXBIT为源程序建立堆栈,将所有参数和环境变量压入栈中,设置合适栈顶指针。2静态分析静态分析器在程序执行之前扫描.text节,找出其中所有的嵌套循 环。因为x86的指令格式是变长的,这里用boch中的解码函数来找到每一条x86指令。如 果碰到跳转指令,会通过比较该指令的地址和跳转的目标地址判断这是不是回跳。如果是, 就说明检测到一个循环,并且计算出它的嵌套层数。找到所有嵌套循环后,将它们存储在 vector结构中,这些循环都是候选的热块。这里假设所有的循环都是for循环。3profile收集在找到所有的嵌套循环后,GXBIT开始运行源二进制程序。将每 条源x86指令翻译成为若干条GVINST指令,当遇到跳转指令或者系统调用时,生成一个 VBlock。然后后端将VBlock翻译为目标机器代码并在本地执行。当执行到某个嵌套循环 中时,在中间语言层对每个VBlock插桩,插桩是指为了收集程序运行的一些信息在嵌套循 环中的每个VBlock中插入若干条GVINST。在本发明中,GXBIT为了检测每个VBlock的内 存访问情况,设计了一个名为MemoryAccess的VFilter,它在每条访存的GVINST后插入若 干指令。这样在后端代码执行的时候,就可以收集到程序运行的实时信息以供接下来的分 析。这里详细说明在动态二进制翻译中的插桩技术和上述VFilter的实现插桩是为了在二进制级别上监视和统计程序的行为,在二进制程序中插入某些特 定的指令来完成程序行为监测,如程序的内存访问情况。当程序含有这些指令时,就可以用 分析工具来评估程序的性能和对监测程序的出现的错误。而动态二进制翻译中插桩是在程 序运行的时候插入指令,这样做的好处是不需要修改及重新编译源代码。本发明中采取的是在中间指令层(GVINST)插桩,而没有选择在x86指令层插桩。 这是因为一条x86指令可能包含多个访存操作,不能精确通过插桩来检测内存操作。而将 x86指令翻译成为多条GVINST中间指令后,每条中间指令就只有一次访存操作,这样就可 以精确的检测到每次访存操作。中间指令中只有LD和ST指令才能访问内存,因此只需在 每个LD/ST指令前插入一些指令就可以检测到所有的访存操作。当中间指令被翻译为后端
7目标代码,然后在运行目标代码时,就可以收集到这些访存信息。下面举例说明VFilter的实现假设中间指令中有一条访问指令LD. s32v5 (0x0),v7。这条指令含义是将内存地 址为v5(0x0)中一个32位数装载到虚拟寄存器v7中,虚拟寄存器v5是基址,0x0为偏移量。则VFilter在该指令前面添加如下三条指令Li. s320x0, v27ADD. s32v27, v5, v28ST. s32v28, vO (0x800dd800)它们的含义是首先将偏移地址0x0存到v27中,将v27中值与v5中值相加,结果 存到v28中,最后将v28中值存到一个指定内存地址,该地址是一个临时数组的地址。在这三条中间指令翻译成为后端x86指令然后执行时,GXBIT将检测到每条 GVINST的访存地址,并把这些地址存到一个临时数组中,然后建立一个map容器,该map的 key是源基本块的入口地址,value是一个vector容器,该容器存储着所有被访问的内存地 址。(map和vector是STL中的两个常用容器)。4动态分析上一步是在执行最外层嵌套循环时收集的信息,然后GXBIT利用这些 信息为当前的嵌套循环建立一个多面体模型,该模型可以检测到内层循环之间是否有数据 依赖,如果没有则说明当前的循环部分可以并行化并放到GPU上执行。然后将这些循环设 置为真正的热块,接着再利用动态分析器得到该热块中循环索引、循环边界、矩阵大小和临 时变量的地址和矩阵基址。5优化和输出CPU和GPU的存储体系结构是不同的。x86架构的CPU中只有8个 通用寄存器,但GPU中有超过1000个寄存器。在x86架构的CPU上进行计算时,首先必须 把数据从内存中拷贝到空闲的寄存器中,但在GPU中就不需要这么做了,因为GPU中有足够 多的寄存器。所以这里又设计了另外一个VFilter来对VBlock进行优化,减少块中访存指 令。x86中访存指令翻译到GVINST都一个固定的模式,可以根据这个模式进行优化,将某 些指令替换为MOV指令,它可以在虚拟寄存器和GPU寄存器之间拷贝数据。最后将优化后 VBlock及上一步获得的每个热块的出口和入口地址、循环的信息、矩阵的信息和临时变量 都存储到磁盘文件当中。第二阶段该阶段主要是利用上一阶段提取的流信息将源程序中计算密集部分转移到GPU 上执行。1并行的翻译模块该模块将GVINST分别翻译为x86指令和PTX指令。该模块分 为两个部分指令选择和内存管理。因为GXBIT是在运行时翻译,复杂的指令选择算法会有 很大的开销,这里使用一个比较简单的方法,即将一个GVINST翻译为多个目标指令。同样, 传统的内存管理方法也会有很大开销,这里采用一个简单有效的方法,GPU上的内存分配策 略如下(1)将循环中要计算的数据存在全局内存中。(2)将输入和输出流存在全局内存中。(3)将临时变量映射到GPU的特殊寄存器中。
8
2并行的执行模块在为源二进制文件初始化执行环境后,GXBIT从文件中装入第 一阶段生成的热块。然后在翻译基本块的时候,判断该基本块是否是热块的一部分。若不 是,则将其翻译为x86指令,若不是,则装入对应优化过的块,将其交给翻译模块翻译为PTX 指令,并生成Ptx文件,然后执行模块调用CUDA的API将要用的数据从CPU的内存拷贝到 GPU的全局内存中,并生成足够的块和线程,执行ptx文件。当GPU计算完后,将结果从GPU 拷贝到CPU的内存中,继续翻译基本块,重复上述过程直到执行完成。
权利要求
一种实现CPU/GPU异构平台的虚拟执行环境的方法,其特征在于,利用动态二进制翻译技术使得程序运行在X86 CPU和NVIDIA GPU混合架构上,并且利用动态二进制翻译技术来收集程序的静态信息和动态信息,利用这些信息寻找程序执行嵌套的循环、循环之间的依赖关系和进出热块的数据流;执行中分两阶段实施第一阶段、收集信息和优化热块,并存储到文件中;第二阶段、生成包含串行指令和并行指令的混合程序,执行含有混合指令的程序。
2.根据权利要求1所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,包 括以下步骤①、首先对整个二进制程序文件进行静态分析,找到和标记出其中的嵌套循环部分;②、然后对这部分单独执行,获得该块的控制流和数据流信息;③、利用这些信息建立多面体模型,检测循环之间的依赖;④、为后续生成并行指令的算法提供信息;⑤、静态分析结束后,开始动态执行。
3.根据权利要求2所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,步 骤①中所述的二进制程序中for循环进行分析、优化和并行化处理。
4.根据权利要求3所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,所 述的并行化处理,是指CPU的执行是线性的,而GPU采用了流计算模型,要在GPU上运行传 统的程序,必须改变程序的结构,将传统串行的程序转换变为流计算模型,包括将串行的指 令转换为并行的指令。
5.根据权利要求1所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,所 述的并行化处理,在CPU切换到GPU时保存处理器的状态,并且在GPU的执行的时候要保持 CPU状态寄存器的一致性。
6.根据权利要求1所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,所 述的优化,是指结合了动态分析和静态分析,用静态分析找到二进制程序中的循环部分, 利用动态分析中获得循环的索引、循环的边界等信息,通过静态二进制分析得到程序的全 局信息,而程序执行时是单路径的,得不到全局信息;静态分析也有其缺陷,因为有些信息 只能在程序执行的时候获得,如条件跳转时的目的地址只能在执行的阶段获得,而且静态 分析要扫描所有的执行路径,因此开销较大;动态分析是在程序执行的时候进行的,执行的 路径取决于程序的输入,它获取的是程序在执行时的信息。
7.根据权利要求1所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,所 述的动态二进制翻译技术,是指基于Crossbit实现了一个CPU/GPU异构平台的虚拟执行环 境GXBIT,使得x86平台上程序可并行在X86CPU和NVIDIA GPU异构平台上,前端将源机器 指令翻译为自行设计的中间指令块,后端将中间指令翻译为目标机器指令并执行。
8.根据权利要求1所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,所 述的执行的第一阶段、收集信息和优化热块,并存储到文件中,实施步骤如下①、读入某个二进制可执行文件,首先扫描该文件中的可执行的代码段,找出其中所有 嵌套循环,将它们作为备选的热块;②、然后只执行找到的嵌套循环部分,在执行的过程中,在每个访存指令后面插入额外 的指令,在执行的时候,所有的访存地址都会被记录下来;在最外层的循环执行了一次以后,动态分析工具利用上述记录的访存地址信息建立多面体模型,确定循环之间是否有依 赖,如果没有依赖,则这些循环就被并行化在GPU上执行,并将这些循环设置为热块;③、优化器针对特定GPU架构对热块进行某些优化,最后将收集的信息和优化后的热 块存储到文件中。
9.根据权利要求1所述的实现CPU/GPU异构平台的虚拟执行环境的方法,其特征是,所 述的执行的第二阶段、生成包含串行指令和并行指令的混合程序,执行含有混合指令的程 序,实施步骤如下①、第二次读入该可执行文件,并装载上一阶段收集到的信息和优化后的热块,并获取 热块的入口和出口地址;②、执行整个二进制文件,当执行流进入某一个热块中时,启动并行翻译引擎,将优化 后的热块翻译为GPU上可运行的并行指令,这样就生成了一个混合的二进制文件,它同时 包含串行指令和并行指令;③、将上一步生成的混合指令放到CPU/GPU异构平台上执行,并且处理内存的一致性 问题。
全文摘要
一种电信技术领域的实现CPU/GPU异构平台的虚拟执行环境的方法。利用动态二进制翻译技术使得程序运行在X86CPU和NVIDIA GPU混合架构上,并且利用动态二进制翻译技术来收集程序的静态信息和动态信息,利用这些信息寻找程序执行嵌套的循环、循环之间的依赖关系和进出热块的数据流;执行中分两阶段实施第一阶段、收集信息和优化热块,并存储到文件中;第二阶段、生成包含串行指令和并行指令的混合程序,执行含有混合指令的程序。本发明的优点是在不修改程序源代码的情况下,利用了动态二进制翻译技术使得传统的串行程序可以运行在CPU/GPU异构多核架构上,并且可以利用GPU实现程序执行的加速。
文档编号G06F15/16GK101963918SQ20101051951
公开日2011年2月2日 申请日期2010年10月26日 优先权日2010年10月26日
发明者章一超, 管海兵, 董国星, 贾昭元, 陈凯 申请人:上海交通大学