异构系统程序启动方法和装置制造方法

文档序号:6504334阅读:128来源:国知局
异构系统程序启动方法和装置制造方法
【专利摘要】本发明实施例提供一种异构系统程序启动方法和装置,该方法包括:在通过编译器编译开放计算语言程序核心部分时,确定核心部分的输入参数是否被修改;保存各输入参数是否被修改的结果;通过运行时系统启动核心部分时,根据所述输入参数是否被修改的结果,对被修改的输入参数执行复制操作。本发明实施例提供的异构系统程序启动方法和装置,避免运行时系统对核心部分输入参数的冗余复制操作,降低OpenCL运行时系统的开销,提高OpenCL程序执行效率。
【专利说明】异构系统程序启动方法和装置

【技术领域】
[0001] 本发明涉及计算机程序处理技术,尤其涉及一种异构系统程序启动方法和装置。

【背景技术】
[0002] 异构计算平台是由两种或多种性质不同的计算部件构成的计算平台。较为常见的 异构计算平台是由指令集不同的计算部件构成的,例如:中央处理器(Central Processing Unit,简称:CPU)和图形处理器(Graphic Processing Unit,简称:GPU)构成异构计算平台。
[0003] 近年来,异构计算平台异军突起,在异构平台上如何编写程序也成为关注的焦点。 在这种背景下,开放计算语言(Open Computing Language,简称:0penCL)被作为一种异 构平台上的并行编程规范推出,得到了较为广泛的关注和使用。OpenCL程序由两部分组 成--由C/C++语言编写的"主机(Host)"部分和由OpenCL C语言编写的"核心(Kernel)" 部分,其中,核心部分由主机部分启动。OpenCL程序在异构平台上执行时,需要软件提供编 译时刻,以及运行时刻的支持。在编译时刻,由编译器对所有OpenCL的主机部分和各核心 部分进行编译。在运行时刻,由运行时系统执行编译好的程序,即执行主机部分的程序,且 在执行过程中可调用启动编译好的核心部分。
[0004] 然而,现有技术对OpenCL程序的编译时刻支持与运行时刻支持是完全分立的。例 如,在某些OpenCL程序中,核心部分被多次启动,核心部分每次被启动时,无论输入参数是 否改变,运行时系统都需将核心部分的输入参数复制到运行时系统保留的内存区域中,现 有的处理方式造成了一些冗余的内存复制操作,增加了 OpenCL运行时系统的开销,影响 OpenCL程序的整体性能。


【发明内容】

[0005] 本发明提供一种异构系统程序启动方法和装置,以有效避免OpenCL运行时系统 的冗余内存复制操作,并可有效降低OpenCL运行时系统的开销,从而提高OpenCL程序执行 效率。
[0006] 第一方面,本发明实施例提供一种异构系统程序启动方法,包括:
[0007] 在通过编译器编译开放计算语言程序核心部分时,确定核心部分的输入参数是否 被修改;
[0008] 保存各输入参数是否被修改的结果;
[0009] 通过运行时系统启动核心部分时,根据所述输入参数是否被修改的结果,对被修 改的输入参数执行复制操作。
[0010] 结合第一方面,在第一方面的第一种可能的实现方式中,在通过编译器编译开放 计算语言程序核心部分时,确定核心部分的输入参数是否被修改,包括:
[0011] 在通过编译器编译开放计算语言程序核心部分时,遍历所述开放计算语言程序, 获取并记录各所述核心部分的输入参数;
[0012] 分析所述核心部分的各输入参数是否有外部定值,若是,则确定被修改,若否,则 确定未被修改。
[0013] 结合第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式 中,保存各输入参数是否被修改的结果,包括:
[0014] 将所述核心部分的各输入参数是否被修改的结果记录于集合中,其中,所述集合 中各条记录包含对应输入参数的索引、名称、是否被修改状态和该输入参数所在的核心部 分的索引。
[0015] 结合第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式 中,通过运行时系统启动核心部分时,根据所述输入参数是否被修改的结果,对被修改的输 入参数执行复制操作,包括:
[0016] 通过运行时系统启动核心部分,并根据启动的核心部分的索引在所述集合中查找 对应的核心部分索引;
[0017] 在查找到的核心部分中,逐一获取各输入参数的是否被修改状态;
[0018] 根据所述是否被修改状态,将被修改的输入参数执行复制到运行时系统的内存区 域中。
[0019] 结合第一方面、第一方面的第一种至第三种可能的实现方式中的任意一种,在第 一方面的第四种可能的实现方式中,通过运行时系统启动核心部分时,根据所述输入参数 是否被修改的结果,对被修改的输入参数执行复制操作包括:
[0020] 通过运行时系统启动核心部分,根据该核心部分的启动次数判断该核心部分是否 为初次启动;
[0021] 若是,则直接执行输入参数复制操作,并将该核心部分的启动次数加1 ;
[0022] 否则,根据所述输入参数是否被修改的结果,对被修改的输入参数执行复制操作。
[0023] 第二方面,本发明实施例提供一种异构系统程序启动装置,包括:
[0024] 确定模块,用于在通过编译器编译开放计算语言程序核心部分时,确定核心部分 的输入参数是否被修改;
[0025] 存储模块,用于保存各输入参数是否被修改的结果;
[0026] 处理模块,用于通过运行时系统启动核心部分时,根据所述输入参数是否被修改 的结果,对被修改的输入参数执行复制操作。
[0027] 结合第二方面,在第二方面的第一种可能的实现方式中,所述确定模块包括:
[0028] 记录单元,用于在通过编译器编译开放计算语言程序核心部分时,遍历所述开放 计算语言程序,获取并记录各所述核心部分的输入参数;
[0029] 分析单元,用于分析所述核心部分的各输入参数是否有外部定值,若是,则确定被 修改,若否,则确定未被修改。
[0030] 结合第二方面的第一种可能的实现方式,在第二方面的第二种可能的实现方式 中,所述存储模块具体用于将所述核心部分的各输入参数是否被修改的结果记录于集合 中,其中,所述集合中各条记录包含对应输入参数的索引、名称、是否被修改状态和该输入 参数所在的核心部分的索引。
[0031] 结合第二方面的第二种可能的实现方式,在第二方面的第三种可能的实现方式 中,所述处理模块包括:
[0032] 查找单元,用于通过运行时系统启动核心部分,并根据启动的核心部分的索引在 所述集合中查找对应的核心部分索引;
[0033] 获取单元,用于在查找到的核心部分中,逐一获取各输入参数的是否被修改状 态;
[0034] 第一复制单元,用于根据所述是否被修改状态,将被修改的输入参数执行复制到 运行时系统的内存区域中。
[0035] 结合第二方面、第二方面的第一种至第三种可能的实现方式中的任意一种,在第 二方面的第四种可能的实现方式中,所述处理模块包括:
[0036] 判断单元,用于通过运行时系统启动核心部分,根据该核心部分的启动次数判断 该核心部分是否为初次启动;
[0037] 第二复制单元,用于若判断单元输出结果为是,则直接执行输入参数复制操作,并 将该核心部分的启动次数加1 ;若判断单元输出结果为否,则根据所述输入参数是否被修 改的结果,对被修改的输入参数执行复制操作。
[0038] 本发明实施例提供一种异构系统程序启动方法和装置,通过判断OpenCL程序中 核心部分的输入参数是否改变,决定是否将输入参数复制到运行时系统保留的内存区域 中,从而避免运行时系统对核心部分输入参数的冗余复制操作,降低OpenCL运行时系统的 开销,提高OpenCL程序执行效率。

【专利附图】

【附图说明】
[0039] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发 明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以 根据这些附图获得其他的附图。
[0040] 图1为本发明异构系统程序启动方法实施例一的流程示意图;
[0041] 图2为本发明异构系统程序启动方法实施例二的流程示意图;
[0042] 图3为本发明异构系统程序启动装置实施例四的结构示意图;
[0043] 图4为本发明异构系统程序启动装置实施例五的结构示意图;
[0044] 图5为本发明异构系统程序启动装置实施例六的结构示意图。

【具体实施方式】
[0045] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例 中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是 本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员 在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0046] 实施例一
[0047] 图1为本发明异构系统程序启动方法实施例一的流程示意图。本发明实施例提供 了一种异构系统程序启动方法,该方法可以由任意的异构系统程序启动装置来执行,该装 置可以通过软件和/或硬件实现,配置在异构系统中。如图1所示,本实施例的方法包括:
[0048] 步骤101、在通过编译器编译开放计算语言程序核心部分时,确定核心部分的输入 参数是否被修改。
[0049] 具体地,本发明实施例的实现具体体现在OpenCL程序的编译时刻和运行时刻两 个阶段,分别涉及到编译器和OpenCL运行时系统。在编译时刻,由编译器对所有OpenCL的 主机部分和各核心部分进行编译。利用编译时刻的数据流分析技术,分析各核心部分的输 入参数在多次启动过程中是否发生改变,以确定核心部分的输入参数是否被修改。
[0050] 步骤102、保存各输入参数是否被修改的结果。
[0051] 具体地,在编译时刻,确定核心部分的输入参数是否被修改之后,保存各输入参数 是否被修改的结果,其中,保存方式可以采用多种形式,例如,实际应用中比较常见的二进 制文件形式,或者文本文件(textfile,简称:txt)等其它形式。
[0052] 步骤103、通过运行时系统启动核心部分时,根据所述输入参数是否被修改的结 果,对被修改的输入参数执行复制操作。
[0053] 具体地,在运行时刻,由运行时系统执行编译好的程序,即执行主机部分的程序, 且在执行过程中可调用编译好的核心部分。运行时系统启动核心部分时,获取步骤102中 保存的各输入参数是否被修改的结果,该结果表明核心部分启动时各输入参数是否被修 改,对被修改的输入参数执行复制操作,对未被修改的输入参数不执行复制操作。
[0054] 在本发明实施例中,通过编译器首先判断各核心部分的输入参数是否被修改,然 后由运行时系统根据输入参数是否被修改的结果决定是否进行复制操作,从而避免了现有 方案中在每次核心部分被启动时先将核心部分的输入参数全部复制到运行时系统保留的 内存区域,实现降低OpenCL运行时系统的开销,提高OpenCL程序的执行效率。
[0055] 实施例二
[0056] 图2为本发明异构系统程序启动方法实施例二的流程示意图。如图2所示,本发 明实施例在上述实施例的基础上进行进一步的细化,所述方法可以包括:
[0057] 步骤201、在通过编译器编译开放计算语言程序核心部分时,遍历所述开放计算语 言程序,获取并记录各所述核心部分的输入参数。
[0058] 具体地,编译器遍历OpenCL程序,获取并记录所述OpenCL程序所有核心部分的全 部输入参数。例如,可以将各所述输入参数以集合的形式进行记录,假设将所述输入参数记 录入集合屯中,记录格式为0^_1(1,口_1(1,口_仙1116,8七3七6),其中,1^_1(1为各所述输入参数所 在的核心部分的索引,p_id为各所述输入参数的索引,p_name为各所述输入参数的名称, state为各所述输入参数的初始状态,可以设定该初始状态为FALSE。
[0059] 步骤202、分析所述核心部分的各输入参数是否有外部定值,若是,则确定被修改, 若否,则确定未被修改。
[0060] 具体地,利用编译器现有的数据流分析技术,OpenCL程序范围内分析集合Ψ中记 录的各输入参数是否有外部定值,若是,则确定被修改,将该有外部定值的输入参数对应的 初始状态,即state修改为TRUE ;若否,则确定未被修改,不改变该输入参数对应的初始状 态,即state仍为FALSE。其中,所述外部定值是指输入参数会在OpenCL程序中除核心部分 以外的部分被修改。
[0061] 步骤203、将所述核心部分的各输入参数是否被修改的结果记录于集合中。
[0062] 其中,所述集合中各条记录包含对应输入参数的索引、名称、是否被修改状态和该 输入参数所在的核心部分的索引。对应所述集合Ψ,state的值即可反应各所述输入参数 是否被修改状态,若某一个输入参数对应的state的值为FALSE,说明该输入参数不会被修 改,只需在该输入参数所在的核心部分初次启动时复制,无需重复复制;若该输入参数对应 的state的值为TRUE,说明该输入参数会被修改,则在该输入参数所在的核心部分多次启 动时,都要进行复制,从而避免未修改输入参数的冗余复制。
[0063] 另外,可以将该集合保存在二进制文件或txt,也可以以其它形式保存该集合,在 此不进行限制。
[0064] 步骤204、通过运行时系统启动核心部分,并根据启动的核心部分的索引在所述集 合中查找对应的核心部分索引。
[0065] 步骤205、在查找到的核心部分中,逐一获取各输入参数的是否被修改状态。
[0066] 具体地,逐一获取所查找到的核心部分的各输入参数,查询所述各输入参数是否 被修改状态。
[0067] 步骤206、根据所述是否被修改状态,将被修改的输入参数执行复制到运行时系统 的内存区域中。
[0068] 具体地,若输入参数被修改状态,则执行复制操作,将被修改的输入参数复制到运 行时系统的内存区域中;若输入参数没有被修改状态,则不进行复制操作。
[0069] 在本发明实施例中,将核心部分的输入参数是否被修改的结果以集合的形式进行 记录,该集合中包含所述输入参数的信息,便于根据所述信息进行查找等操作,加快复制操 作,提高OpenCL程序的执行效率。
[0070] 在上述实施例的基础上,通过运行时系统启动核心部分时,根据所述输入参数是 否被修改的结果,对被修改的输入参数执行复制操作还可以进一步细化为:
[0071] 1、通过运行时系统启动核心部分,根据该核心部分的启动次数判断该核心部分是 否为初次启动。
[0072] 具体地,在OpenCL运行时系统中加入核心部分启动计数数组k_count,该数组的 长度为该OpenCL程序中所有核心部分的总数,各核心部分在该数组中对应的位置根据所 述各核心部分初次启动的时间顺序进行设定,该数组中各元素值的初始值均为0,即对所述 OpenCL程序刚开始运行时,所有核心部分被启动的次数均为0。
[0073] 当运行时系统启动核心部分时,首先判断该核心部分的启动次数,在k_count中 查找该核心部分所在的位置对应的元素值是否为〇,若为〇,说明是初次启动;否则,该核心 部分不是初次启动。
[0074] 2、若是,则直接执行输入参数复制操作,并将该核心部分的启动次数加1。
[0075] 若核心部分是初次被启动,则将该核心部分的所有输入参数都复制到运行时系统 的内存区域,并将该核心部分的启动次数加1,例如,将k_count中该核心部分的索引减1的 位置处的元素值加1。
[0076] 3、否则,根据所述输入参数是否被修改的结果,对被修改的输入参数执行复制操 作。
[0077] 获取保存的各输入参数是否被修改的结果,例如获取集合Ψ,对于集合Ψ中的每 条记录:若k_id与当前启动的核心部分的索引一致,且state为TRUE,则将该核心部分的 第?」(1个输入参数复制到执行时系统的内存区域中,并读取集合中的下一条记录;gk_id 与当前启动的核心部分的索引一致,且state为FALSE,或者,k_id与当前启动的核心部分 的索引不一致,则直接读取集合中的下一条记录。
[0078] 需要说明的是,判断OpenCL程序中核心部分是否为初次启动的方式有多种途径, 本发明实施例中只以数组k_c 〇unt为例,不对其它方式详尽说明。
[0079] 实施例三
[0080] 本发明实施例以具体的OpenCL程序为例进行说明,该OpenCL程序中核心部分为 kmeansOCL函数。OpenCL程序片段如下所示:

【权利要求】
1. 一种异构系统程序启动方法,其特征在于,包括: 在通过编译器编译开放计算语言程序核心部分时,确定核心部分的输入参数是否被修 改; 保存各输入参数是否被修改的结果; 通过运行时系统启动核心部分时,根据所述输入参数是否被修改的结果,对被修改的 输入参数执行复制操作。
2. 根据权利要求1所述的方法,其特征在于,在通过编译器编译开放计算语言程序核 心部分时,确定核心部分的输入参数是否被修改,包括 : 在通过编译器编译开放计算语言程序核心部分时,遍历所述开放计算语言程序,获取 并记录各所述核心部分的输入参数; 分析所述核心部分的各输入参数是否有外部定值,若是,则确定被修改,若否,则确定 未被修改。
3. 根据权利要求2所述的方法,其特征在于,保存各输入参数是否被修改的结果,包 括: 将所述核心部分的各输入参数是否被修改的结果记录于集合中,其中,所述集合中各 条记录包含对应输入参数的索引、名称、是否被修改状态和该输入参数所在的核心部分的 索引。
4. 根据权利要求3所述的方法,其特征在于,通过运行时系统启动核心部分时,根据所 述输入参数是否被修改的结果,对被修改的输入参数执行复制操作,包括: 通过运行时系统启动核心部分,并根据启动的核心部分的索引在所述集合中查找对应 的核心部分索引; 在查找到的核心部分中,逐一获取各输入参数的是否被修改状态; 根据所述是否被修改状态,将被修改的输入参数执行复制到运行时系统的内存区域 中。
5. 根据权利要求1-4任一所述的方法,其特征在于,通过运行时系统启动核心部分时, 根据所述输入参数是否被修改的结果,对被修改的输入参数执行复制操作包括: 通过运行时系统启动核心部分,根据该核心部分的启动次数判断该核心部分是否为初 次启动; 若是,则直接执行输入参数复制操作,并将该核心部分的启动次数加1 ; 否则,根据所述输入参数是否被修改的结果,对被修改的输入参数执行复制操作。
6. -种异构系统程序启动装置,其特征在于,包括: 确定模块,用于在通过编译器编译开放计算语言程序核心部分时,确定核心部分的输 入参数是否被修改; 存储模块,用于保存各输入参数是否被修改的结果; 处理模块,用于通过运行时系统启动核心部分时,根据所述输入参数是否被修改的结 果,对被修改的输入参数执行复制操作。
7. 根据权利要求6所述的装置,其特征在于,所述确定模块包括: 记录单元,用于在通过编译器编译开放计算语言程序核心部分时,遍历所述开放计算 语言程序,获取并记录各所述核心部分的输入参数; 分析单元,用于分析所述核心部分的各输入参数是否有外部定值,若是,则确定被修 改,若否,则确定未被修改。
8. 根据权利要求7所述的装置,其特征在于,所述存储模块具体用于将所述核心部分 的各输入参数是否被修改的结果记录于集合中,其中,所述集合中各条记录包含对应输入 参数的索引、名称、是否被修改状态和该输入参数所在的核心部分的索引。
9. 根据权利要求8所述的装置,其特征在于,所述处理模块包括: 查找单元,用于通过运行时系统启动核心部分,并根据启动的核心部分的索引在所述 集合中查找对应的核心部分索引; 获取单元,用于在查找到的核心部分中,逐一获取各输入参数的是否被修改状态; 第一复制单元,用于根据所述是否被修改状态,将被修改的输入参数执行复制到运行 时系统的内存区域中。
10. 根据权利要求6-9任一所述的装置,其特征在于,所述处理模块包括: 判断单元,用于通过运行时系统启动核心部分,根据该核心部分的启动次数判断该核 心部分是否为初次启动; 第二复制单元,用于若判断单元输出结果为是,则直接执行输入参数复制操作,并将该 核心部分的启动次数加1 ;若判断单元输出结果为否,则根据所述输入参数是否被修改的 结果,对被修改的输入参数执行复制操作。
【文档编号】G06F9/445GK104239080SQ201310239648
【公开日】2014年12月24日 申请日期:2013年6月17日 优先权日:2013年6月17日
【发明者】刘颖 申请人:华为技术有限公司, 中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1