首页> 中国专利> 一种隐藏异构并行编程中的多线程的关联结构及基于其的映射方法

一种隐藏异构并行编程中的多线程的关联结构及基于其的映射方法

摘要

本发明公开了一种隐藏异构并行编程中的多线程的关联结构及基于其的映射方法,属于计算机编程语言技术领域。通过属性系统指定了数据的输入输出属性、单一数据到计算过程对应数据接口的划分属性以及属性之间的关联性质,描述了计算数据到计算过程数据接口的映射关系,使得编译系统可以根据关联结构中保留的并行信息自动完成上层应用向底层运行时环境的映射,从而避免了由用户在异构并行编程过程中通过多线程的方式显式绑定计算过程和数据,实现了并行性的隐式表达。本发明能够有效简化异构并行编程逻辑,减轻编程人员的负担,提高应用的可移植性和可扩展性。在异构并行编程和高性能计算领域具有较强的实用价值和广泛的应用前景。

著录项

  • 公开/公告号CN108228189A

    专利类型发明专利

  • 公开/公告日2018-06-29

    原文格式PDF

  • 申请/专利权人 西安交通大学;

    申请/专利号CN201810036868.5

  • 申请日2018-01-15

  • 分类号

  • 代理机构西安通大专利代理有限责任公司;

  • 代理人徐文权

  • 地址 710049 陕西省西安市碑林区咸宁西路28号

  • 入库时间 2023-06-19 05:46:55

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-07-28

    授权

    授权

  • 2018-07-24

    实质审查的生效 IPC(主分类):G06F8/41 申请日:20180115

    实质审查的生效

  • 2018-06-29

    公开

    公开

说明书

技术领域

本发明属于计算机编程语言技术领域,具体涉及一种隐藏异构并行编程中的多线程的关联结构及基于其的映射方法。

背景技术

随着各行业对计算能力需求的不断增长和摩尔定律的失效,处理器向着多核和众核的方向发展,采用异构众核加速器和协处理器已经成为提升计算机系统性能的重要手段。现有的主流异构并行编程方法如CUDA和OpenCL等为 GPU和众核协处理器上的编程提供了类C的高级语言和编程接口,降低了异构处理器的使用门槛,同时也沿用了多线程编程思想,在程序=数据结构+算法的框架下,通过线程作为载体划分和绑定计算过程和数据,将计算任务映射为大量并发线程实现并行执行。线程和进程是对计算资源和程序执行过程的直接抽象,通过多线程编程实现的应用可以获得较高的执行效率,但多线程编程需要用户完成任务划分和线程映射等工作并负责运行时的线程管理、数据移动、通信和同步,编程逻辑复杂,编程困难且工作量大。异构处理器往往集成有成百上千的计算核心,需要巨量的并发线程来发挥系统的效能,这对用户的编程技巧提出很高的要求。

另一方面,使用多线程编程时为了获得良好的性能,任务分解和线程映射等操作需要与具体的硬件架构相适应,这暴露了底层细节,加重了用户的编程负担。同时,应用性能受限于特定的运行时环境,在系统架构和规模变化时难以高效执行,往往需要针对系统规模和架构重新开发,随着超级计算机系统规模和数量的增大,应用可扩展性和可移植性问题日益突出。

为了降低编程难度,提高应用的可扩展性和可移植性,需要研究高层编程抽象以屏蔽底层细节,同时又需要高层抽象能够方便的向底层映射以保证执行效率。OpenACC提供了一种基于指导语句的异构并行编程方法,通过编译器为用户屏蔽了底层细节,但其核心依然是多线程编程。基于流编程模型的 StreamIt、Brook等,摒弃了多线程的编程思想,但实现困难,应用范围较窄。 Intel的merge和IBM的Lime分别架构在Intel的EXOCHI编程环境和OpenCL 上,提供了高层编程接口和语言实现,但学习成本较高,缺乏灵活性。这些方法通过一定程度上缓解了异构编程困难以及可扩展性和可移植性问题,但研究和应用还不成熟。

发明内容

本发明的目的在于提供一种隐藏异构并行编程中的多线程的关联结构及基于其的映射方法,该关联结构能够有效简化异构并行编程逻辑,减轻编程负担,提高应用的可移植性和可扩展性;该方法基于关联结构通过编译和运行时自动线程映射方法保证应用的有效执行,达到简化异构并行编程逻辑的效果

本发明是通过以下技术方案来实现:

一种隐藏异构并行编程中的多线程的关联结构,该关联结构由三级属性及三级属性分别对应语义规则构成;所述三级属性包括:数据输入输出属性、单个数据到计算过程对应数据接口的划分属性和数据划分属性之间的关联性与并行度的属性;其中,

数据输入输出属性对应的语义规则为:

1)在计算过程中被修改或作为计算结果的数据都被指定为输出属性;

2)被计算过程读取而不进行修改的数据为输入属性;

单个数据到计算过程对应数据接口的划分属性对应的语义规则为:根据数据接口与计算数据集合的对应关系,分为元素属性、子集属性和全集属性;

1)设置数据的划分属性为元素属性时,语义表示数据集中的每个元素都满足一次独立计算过程的需要,并行程度最高,具体并行度取决于数据规模;

2)设置数据的划分属性为子集属性时,语义表示数据集切分为几个较小的数据集来并行计算,并行度由具体的切分数量决定;

3)设置数据的划分属性为全集属性时,计算过程的访问范围包括整个数据集,数据集不能切分,对并行度没有贡献,当有多个并行实例时,则需要数据共享或有写冲突;

数据划分属性之间的关联性与并行度的属性对应的语义规则为:

1)处于同一元素属性作用范围内的不同数据遵循相同的划分方式,数据元素一一对应;

2)处于同一子集属性作用范围的不同数据,按照同样的数量进行切分,不同的子数据集按序对应;

3)处于同一属性作用范围内的各个数据不重复计算并行度;

4)应用并行度的计算满足加乘原则。

优选地,根据是否被计算过程修改指定数据为输出属性或输入属性,如果在计算过程中数据只被读取,则指定为输入属性;如果在计算过程中对数据或数据元素有任何写入操作,则指定为输出属性。

优选地,根据数据接口与计算数据集合的对应关系,分为元素属性、子集属性和全集属性,具体条件为:

其中,δ为满足计算过程某个数据接口的最小数据单元,Σ为与数据接口对应的计算数据集。

进一步优选地,数据划分属性为元素属性时,数据集中的每个元素都满足一次独立的计算过程的需要,对应元素属性的并行度等同于数据规模;

其中,同一元素属性能够作用于多个数据集,属性作用范围内的不同数据遵循相同的划分方式,划分后的数据元素应一一对应。

进一步优选地,数据划分属性为子集属性时,数据集能够切分为几个较小的数据集来并行计算,对应子集属性的并行度等同于切分数量;

其中,同一子集属性能够作用于多个数据集,属性作用范围内的不同数据按照同样的数量进行切分,切分后的子数据集应按序对应。

进一步优选地,数据划分属性为全集属性的时,数据集不能切分,属性的并行度为1,当有多个并行实例时,指示需要数据共享或有写冲突。

优选地,所述应用并行度的计算满足加乘原则,具体是指:每个计算任务的并行度为各个独立的划分属性的并行度的乘积;能够并行执行的不同计算任务,并行度为各计算任务的并行度之和。

本发明还公开了基于上述的关联结构的编译和运行时自动线程映射方法,包括以下步骤:

步骤1:解析构成计算任务的数据、关联结构和计算过程,确定数据规模以及关联结构所定义的数据输入输出属性、独立的数据划分属性;

步骤2:根据数据规模确定各个独立的数据划分属性所提供的并行度;对于元素属性,其并行度为其标识的数据集的元素数量;对于子集属性,根据数据规模和处理单元的数量指定切分数量;

步骤3:为每个独立的划分属性指定对应的线程域,线程域内线程的数量和属性提供的并行度相等,各个线程域之间正交,根据乘法原则,线程总数量为各线程域内线程数量的乘积,每个线程由各个线程域内的子线程id组成的多维向量(id1,id2,…,idn)唯一标识;每个线程有唯一的线程ID,线程ID与子线程id向量的关系为:

其中,idi为第i个线程域内的子线程id,wj为第j个线程域的线程数,线程ID和子线程id向量能够通过公式互相转化;

步骤4:根据线程标识重构计算过程中的数据索引;

步骤5:检查当前计算设备中的数据状态,根据需要进行数据拷贝,保证所有的计算数据都在当前所用计算设备的存储空间中且为最新;

步骤6:检查为输出属性的数据,若其划分属性为全集属性时,需要添加临界区,将数据访问原子化,在计算完成后,进行数据拷回,保证整个执行过程的正确结束。

9、根据权利要求8所述的编译和运行时自动线程映射方法,其特征在于,步骤4中,根据线程标识重构计算过程中的数据索引,具体操作为:根据数据被标识的划分属性,找到对应的线程域:

当被元素属性标识时,其数据索引转换为对应线程域的子线程ID;

当被子集属性标识时,根据数据规模和切分数量确定子数据集规模,数据索引要加上偏移量,即子线程ID×子数据集规模。

与现有技术相比,本发明具有以下有益的技术效果:

本发明公开的一种隐藏异构并行编程中的多线程的高层语法结构,即关联结构及其语义规则。关联结构通过属性系统指定了数据的输入输出属性、单一数据到计算过程对应数据接口的划分属性以及属性之间的关联性质,描述了计算数据到计算过程数据接口的映射关系,使得编译系统可以根据关联结构中保留的并行信息自动完成上层应用向底层运行时环境的映射,从而避免了由用户在异构并行编程过程中通过多线程的方式显式绑定计算过程和数据,实现了并行性的隐式表达。关联结构能够有效的简化异构并行编程逻辑,减轻编程人员的负担,同时为用户屏蔽了底层硬件细节,提高应用的可移植性和可扩展性。它在异构并行编程和高性能计算领域具有较强的实用价值和广泛的应用前景。

本发明从还公开了根据关联结构将高层应用映射为并行执行线程的一种具体方法,该方法中包含了线程映射和数据移动等执行细节,采用关联结构的代码组织清晰,结构简单,同时数据的划分属性和输入输出属性为编译器自动的线程映射和数据移动提供了依据,通过编译和运行时自动线程映射方法保证应用的有效执行,达到简化异构并行编程逻辑的效果。

附图说明

图1为是OpenCL编程中host代码的基本开发流程图。

具体实施方式

下面结合具体的实施例对本发明做进一步的详细说明,所述是对本发明的解释而不是限定。

本发明在“程序=数据结构+算法”的基础上设计了基于属性系统的关联语法结构并规定了其语义规则。通过对数据指定附加属性描述上层数据和并行处理的计算过程之间的对应关系,保留上层应用的并行信息。用于表示关联结构的属性系统采用的具体技术方案如下:

1、数据的输入输出属性

在异构系统中,异构处理器拥有自己独立的存储空间,与系统主存构成分离的存储架构,因此数据需要根据计算任务的要求在不同存储空间中移动,包括计算数据的读入和计算结果的写回。数据的输入输出属性明确指定了数据在计算过程中作为输入还是输出,为自动的数据移动提供了依据。数据输入输出属性的语义规则为:

1)只要在计算过程中被修改或作为计算结果的数据都应被指定为输出属性;

2)只被计算过程读取而不进行修改则为输入属性。

2、单个数据到对应计算过程数据接口的划分属性

多线程编程主要的工作在于划分原有的计算任务,生成多个实例对计算数据进行并行处理。线程最重要的作用是作为计算的载体确定了每个计算实例所处理的数据范围。划分属性则指定了数据到每个计算实例的划分方法,从而避免了在高层编程中使用多线程。

从计算理论和抽象数据类型的角度出发,数据和计算过程的定义域均可以通过集合表示。计算过程可以表示为:

有计算数据集Σ,其对应计算过程数据接口为xi,满足计算过程接口xi要求的最小数据元素或数据集为δ。那么数据集Σ能够划分为δ的数量就决定了能够生成的并行实例的数量。考虑数据到计算过程数据接口的对应关系,则包含以下几种情况:

1)δ∈Σ,δ为数据集Σ的一个元素;

2)δ为Σ的真子集;

3)δ=Σ,δ即数据集Σ。

对应的,数据划分属性的语义规则为:

1)对应第一种情况,设置数据的划分属性为元素属性。其语义表示数据集中的每个元素都可以满足一次独立的计算过程的需要,并行程度最高,具体的并行度取决于数据规模;

2)对应第二种情况,设置数据的划分属性为子集属性。语义上表示数据集可以切分为几个较小的数据集来并行计算。并行度由具体的切分数量决定;

3)对应第三种情况,设置数据的划分属性为全集属性。此时计算过程的访问范围包括整个数据集,数据集不能切分,对并行度没有贡献。当有多个并行实例时,意味着需要数据共享或有写冲突。

3、划分属性之间的关联性与并行度的计算

考虑计算数据之间的关联性,数据划分属性往往不是独立的,在数据属性之外需要额外的语义规则来根据属性的作用范围规定划分属性之间的关联性。语义规则定义如下:

1)处于同一元素属性作用范围内的不同数据遵循相同的划分方式,数据元素应一一对应;

2)处于同一子集属性作用范围的不同数据,应当按照同样的数量进行切分,不同的子数据集应按序对应;

3)处于同一属性作用范围内的各个数据不重复计算并行度;

4)应用并行度的计算满足加乘原则。其中,对于同一计算过程,其并行度为各个独立的划分属性提供的并行度的乘积;可并行执行的不同计算过程,并行度为各计算过程的并行度之和。

关联结构将应用的并行性隐式包含在划分属性的语义规则中,避免用户在编程时通过多线程实现并行表达,实现了对多线程的隐藏。根据关联结构及其语义规则,编译器和运行时系统可以实现高层应用向底层多线程的自动映射,隔离用户编程与底层硬件,降低编程难度的同时保证应用的执行效率,提高可移植性和可扩展性。

下面从语义层面上阐述根据关联结构将高层应用映射为并行执行线程的一种具体方法,该方法中包含了线程映射和数据移动等执行细节,包括以下步骤:

步骤1:解析构成计算任务的数据、关联结构和计算过程,确定数据规模以及关联结构所定义的数据输入输出属性、独立的数据划分属性。

步骤2:根据数据规模确定各个独立的数据划分属性所提供的并行度,对于元素属性,其并行度为其标识的数据集的元素数量;对于子集属性,根据数据规模和处理单元的数量指定切分数量。

步骤3:为每个独立的划分属性指定对应的线程域,线程域内线程的数量和属性提供的并行度相等,各个线程域之间正交,根据乘法原则,线程总数量为各线程域内线程数量的乘积,每个线程可以由各个线程域内的子线程id组成的多维向量(id1,id2,…,idn)唯一标识。每个线程有唯一的线程ID,线程ID与子线程id向量的关系为:

其中,idi为第i个线程域内的子线程id,wj为第j个线程域的线程数。线程ID和子线程id向量可以通过公式互相转化。

步骤4:根据线程标识重构计算过程中的数据索引。根据数据被标识的划分属性,找到对应的线程域,当被元素属性标识时,其数据索引转换为对应线程域的子线程ID;当被子集属性标识时,根据数据规模和切分数量确定子数据集规模,数据索引需要加上偏移量,即子线程ID×子数据集规模。

步骤5:要检查当前计算设备中的数据状态根据需要进行数据拷贝,保证所有的计算数据都在当前所用计算设备的存储空间中且为最新。

步骤6:检查为输出属性的数据,若其划分属性为全集属性时,需要添加临界区,将数据访问原子化。在计算完成后,进行数据拷回,保证整个执行过程的正确结束。

由于语法结构本身的特殊性,在具体实施时可以根据需要设计不同的语句或标识符来表示关联结构和各种属性,但在编写编译器实现向底层的映射时都必须遵循关联结构制定的各种语义规则。下面结合示例和附图对本发明进行描述。显然,下述的实施例仅是本申请一部分实施例阐述,而非全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

矩阵相乘是数值线性代数中的典型算法,因其计算过程简单易懂且具有高度的并行性,常用作基本的测试用例。本实施例中展示了矩阵相乘在串行编程、异构并行编程和基于关联结构的编程下的代码实现,通过对比说明本发明的有益效果。

矩阵相乘的C语言串行版本如表1所示:

表1矩阵相乘的C语言串行版本示例代码

矩阵相乘的计算过程实现为函数matrixmul,计算数据在main函数中进行定义和初始化,通过在main函数中的调用matrixmul完成一次具体的矩阵相乘计算。矩阵相乘的算法过程为矩阵a的某一行和矩阵b的某一列相乘得到矩阵 c的一个元素,因此矩阵相乘的计算核心为向量相乘,可以通过同时计算多个向量相乘实现并行执行。

在多线程异构并行编程中,矩阵相乘被映射为多个线程,每个线程负责不同的向量相乘的计算。在典型的异构编程方法OpenCL中,计算核心称为kernel,表2所示即实现矩阵相乘的OpenCL kernel代码。

表2采用异构并行编程方法OpenCL实现的矩阵相乘kernel代码

函数get_global_id为OpenCL提供的运行时函数,用于在执行中获取当前线程的线程id,在kernel编程时需要通过线程id显式划分不同线程的计算范围完成计算任务到线程的映射。

多线程编程中,线程规模和组织方式需要根据底层处理器特征进行设置,这暴露了底层细节。因此在异构并行编程中,面对分离的底层硬件架构,除了完成线程映射和kernel编程外,还需要完成设备进行检查、执行环境的配置、不同存储之间数据移动的管理以及kernel的调度执行,这部分代码在OpenCL 中称为host代码。图1展示了host代码的基本编程流程,可见异构编程逻辑的复杂。

表3中展示了基于关联结构的代码。

表3基于关联结构的矩阵相乘代码

矩阵线程算法核心是向量相乘,计算过程的数据接口对应矩阵a的某一行向量、矩阵b的某一列向量和矩阵c的一个元素。矩阵可以视为由向量组成的集合,也可以视为由标量元素组成的集合,因此各个数据的划分属性均为元素属性,同时矩阵c的划分依赖于矩阵a和矩阵b。设计关联结构的一种语法表示,通过Association关键字标识关联结构。定义两个元素属性标识ep1和ep2,分别标记矩阵a和矩阵c的某一行以及矩阵b和矩阵c的某一列,划分后矩阵 c的元素与矩阵a的行向量以及矩阵b的列向量对应。元素属性ep1提供的并行度等于矩阵a的行向量数量10,元素属性ep2提供的并行度等于矩阵b的列向量数量10,ep1和ep2正交,因此应用的总并行度为ep1并行度与ep2并行度的乘积100。通过“=>”标识符区分输入输出数据,在标识符左侧的为输入,右侧的为输出。在main函数中,也通过“=>”连接数据、关联结构和计算过程构成完整的并行计算任务。

可以看出,本发明的公开的关联结构描述了如何划分数据到计算过程以生成并行计算实例,避免了使用多线程进行并行编程,提供了高层编程抽象。表 3中采用关联结构的代码组织清晰,结构简单,同时数据的划分属性和输入输出属性为编译器自动的线程映射和数据移动提供了依据,通过前文所述的编译和运行时自动线程映射方法保证应用的有效执行,达到简化异构并行编程逻辑的效果。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号