使用分析加速器的数据流分析处理的资源高效加速的制作方法

文档序号:17439304发布日期:2019-04-17 04:32阅读:273来源:国知局
使用分析加速器的数据流分析处理的资源高效加速的制作方法

本公开一般地涉及软件编程,并且更特别地涉及使用诸如分析加速协处理器之类的协处理器提高数据流处理的性能的系统和方法。

许多类型的应用(作为一个示例,诸如分析应用)可能包括大量的数据并行性(例如,显式数据并行性)。在通用中央处理单元(cpu)核心处理器上执行这些类型的应用通常导致高响应时间、高资源消耗、高能量消耗和/或大量热量耗散。因此,这些类型的应用传统上可能不容易诸如在基于云的执行环境中整合。



背景技术:

现今许多应用使用集合(collection),允许以对程序员友好的方式高效地分组和处理大量数据。例如,javatm包括java集合和流api。流api可以被认为利用集合api和/或构建在集合api上。集合的使用(例如,在一个基于java的示例中,集合上的流api的使用)的一个关键能力是以高效的方式,诸如以与使用数据库(例如,sql)查询类似的方式,处理集合中的数据。如此,用户可以利用集合api来编写抽象的类似查询的命令,而不需要编写在集合实体上迭代的细节。

传统上,基于集合的数据流操作的执行不被硬件加速。如此,执行可能是缓慢的并且可能使用处理器芯片上的大量资源——有可能导致较高的功率消耗和/或系统利用率。典型地,当在cpu核心上执行时,基于集合的数据流操作涉及创建潜在地持有芯片上的大量资源的许多线程。另外,较高的系统利用率和/或功率消耗可能不利于应用在现代联网环境中(例如,在云上)的整合。



技术实现要素:

包括分析加速协处理器的系统可以被配置为实现卸载引擎,卸载引擎可以代表应用尝试卸载要对数据流执行的一个或多个数据操作。数据操作和数据流可以由应用指定和/或提供,并且作为响应,卸载引擎可以被配置为使用分析加速协处理器而不是使用通用cpu核心来对数据流执行(或者尝试执行)数据操作。

卸载引擎可以拦截由应用执行的一个或多个数据操作,诸如可能是集合api的一部分。卸载引擎然后可以确定是否将数据操作卸载到分析加速协处理器。如果卸载引擎确定数据操作不适于卸载,卸载引擎然后可以使得数据操作使用系统上的一个或多个通用cpu核心来执行。另外,如果尝试卸载但是未成功,数据操作可以使用通用cpu核心来执行。在一些实施例中,无论数据操作被成功卸载还是使用通用cpu核心来执行,对于应用代码(例如,和/或对于用户)可以是透明的。

附图说明

图1是例示了根据一个实施例的包括卸载引擎的系统的逻辑框图。

图2是例示了如本文中描述的用于使用分析加速器执行数据流分析处理的资源高效加速的方法的一个实施例的流程图。

图3是例示了根据一个实施例的如本文中描述的通过利用卸载引擎的系统的示例性数据流动的逻辑框图。

图4是例示了如本文中描述的用于尝试卸载将对数据流执行的一个或多个数据操作的方法的一个实施例的流程图。

图5是例示了根据一个实施例的如本文中描述的通过利用卸载引擎的系统的示例性数据流动的逻辑框图。

图6是例示了被配置为实现本文中描述的机制的计算系统的一个实施例的框图。

虽然在本文中对于几个实施例和例示性附图以示例的方式描述了本公开,但是本领域技术人员将认识到,本公开不局限于所描述的实施例或者附图。应当理解,附图及其详细描述不打算将本公开局限于所公开的特定形式,而是相反,本公开将涵盖落在由所附权利要求书定义的精神和范围内的所有修改、等同和替代。本文中所使用的任何标题仅用于组织的目的并且不打算限制说明书或权利要求书的范围。如本文中使用的,词语“可以”是在允许的意义上(即,意指具有可能性)而不是在强制的意义上(即,意指必须)使用的。类似地,词语“包括”、“包含”和“含有”意指包括但不局限于。

具体实施方式

如上所述,卸载引擎可以代表应用尝试卸载将对数据流执行的一个或多个数据操作。数据操作和数据流可以由应用指定和/或提供,并且作为响应,卸载引擎可以被配置为使用协处理器,诸如数据分析加速器、分析加速协处理器或查询加速协处理器,而不是使用核心处理器(例如通用cpu核心)对数据流执行(或者尝试执行)数据操作。

图1是例示了如本文中描述的适于使用分析加速器来实现数据流分析处理的资源高效加速的系统的框图。诸如卸载引擎120之类的卸载引擎可以被实现为系统100的运行时环境110的部分,或者可以在系统100的运行时环境110的部分内执行。系统100可以包括一个或多个处理器,诸如通用cpu核心140以及至少一个协处理器150。根据各种实施例,协处理器150可以代表各种协处理器中的任何一种,诸如分析加速协处理器或者查询加速协处理器。例如,在一个示例实施例中,系统100可以代表sparctm系统(例如,m、t和/或s系列的sparctm系统)并且协处理器150可以代表作为该系统的部分的数据分析加速器(dax)协处理器。通常,术语“协处理器”、“数据分析加速器”、“分析加速协处理器”和“查询加速协处理器”在本文中可以可互换地使用。

根据一个示例实施例,在系统100内,运行时环境110可以代表平台独立的、面向对象的运行时环境,诸如基于javatm的运行时环境。根据一个示例实施例,应用130可以代表根据java开发工具包(jdk)开发的基于javatm的应用,jdk利用用于对数据的流(即,数据流)执行数据操作的一个或多个对象和/或方法。

虽然在本文中根据通过将数据操作卸载到sparctm系统上的dax协处理器来加速java流进行说明,但是根据各种实施例,本文中描述的方法、机制、函数和/或算法可以使用其他系统、处理器、协处理器、运行时环境、数据操作、软件库等来实现。如本文中描述的,通过将数据操作卸载到sparctm系统上的dax协处理器来加速java流的使用仅代表使用分析加速器的数据流分析处理的资源高效加速的一个可能的示例实施例。

不像使得java应用能够(例如,通过称作sumatra的openjdk项目)利用图形处理单元(gpu),其中仅对流的foreach操作可以卸载到gpu,如本文中描述的,使用分析加速器的数据流分析处理的资源高效加速可以涉及许多不同的流操作到分析加速协处理器(而不是gpu,这可能非常不同)的卸载。例如,(诸如在sumatra的情况下)利用gpu的应用可能需要lambda和/或流操作到具有gpu能力的内核(诸如基于开放计算语言(opencl)或者异构系统架构中间语言(hsail)的那些内核)的转换。另外,根据一个示例实施例,将各种流操作卸载到分析加速协处理器可能涉及从流api自身获取关于数据并行性的线索。在一些实施例中,分析加速协处理器实现方式可以包括到流操作的直接匹配,由此可能提供像扫描、选择等更高级别的分析加速器功能。

流api可以允许应用以高效且用户友好的方式访问数据/数据库。例如,作为一些示例,流api可以允许应用对于基于java的分析、存储器网格的基于java的实现方式(例如,oraclecoherence)、apachespark转换以及nosql数据库的高效和/或用户友好访问。传统地,流api操作的执行不使用分析加速器进行硬件加速。如此,执行可能是缓慢的并且可能使用处理器芯片上的大量资源——可能导致较高的功率消耗和/或系统利用率。较慢的执行时间可能导致对于客户应用的较高响应时间。典型地,当在cpu核心上执行时,基于集合的数据流操作(例如,经由流api)可能不允许实时分析,可能具有禁止性的启动成本,并且可能涉及创建潜在地攫取芯片上的大量资源的大量线程。另外,较高的系统利用率和/或功率消耗可能不利于云上应用的整合。

在一些实施例中,可以至少部分地基于操作的输入数据的大小来做出在协处理器上还是通用cpu核心上运行操作的运行时决策。另外,根据一些实施例,仅并行的流(例如,显式单指令多数据——其中程序员指定对象集合上的操作可以并行进行)可以被卸载到协处理器。在一些实施例中,可以对于集合的元素的子集独立地做出关于是否卸载操作的决策。

图2是例示了如本文中描述的使用分析加速器的数据流分析处理的资源高效加速的方法的一个实施例的流程图。如方框200中例示的,在平台独立的、面向对象的运行时环境内执行的应用(诸如应用130)可以调用一个或多个方法对数据流执行一个或多个数据操作。例如,使用基于java的示例,应用可以利用一个或多个java流接口对数据流进行加载、读取、分析、解析、修改等,并且因此可以(直接地或者间接地)调用java流对象的一个或多个方法。如方框210中,诸如卸载引擎120之类的卸载引擎可以拦截这一个或多个方法调用。例如,在一个实施例中,卸载引擎120可以被实现为软件库的部分,软件库同样实现由应用调用的方法的至少一部分。例如,继续基于java的示例,卸载引擎120可以至少部分地被实现为同样提供一个或多个java流方法的库的部分,并且当应用(直接地或者诸如通过实例化流对象而间接地)调用java流方法时,卸载引擎120的实现可被执行。在一些实施例中,可以修改库(例如,运行时库)以包括被配置为利用卸载引擎120的方法(例如,基于java的示例中的java流方法)的版本,以便执行如本文中描述的使用分析加速器的数据流分析处理的资源高效加速。如此,当应用调用一个或多个方法对数据流执行数据操作时,可以执行卸载引擎120的一个或多个方法,而不是所调用的方法的旧有或者现有版本。

如方框220中,卸载引擎120的方法可以尝试使用诸如分析加速协处理器之类的协处理器对数据流执行数据操作。例如,在一个实施例中,卸载引擎120可以被配置为利用提供用于与协处理器(诸如分析加速协处理器150)交互的对象、方法、函数等的软件库来对数据流执行一个或多个数据操作。在使用java流的一个示例实现方式中,卸载引擎120可以被配置为把要对数据流执行的一个或多个数据操作映射到一个或多个相应的协处理器调用,以便使用协处理器对数据流执行数据操作。另外,卸载引擎120可以被配置为检验、分析或以其他方式检查要执行的数据操作以及要对其执行数据操作的数据流,以便确定数据操作当被应用于数据流时是否适于卸载到协处理器。在一些实施例中,使用协处理器对数据流执行数据操作的尝试可以包括确定是否真的将数据操作卸载到协处理器。如此,方框220中所例示的使用分析加速协处理器对数据流执行数据操作的尝试也可以包括确定数据操作是否适于卸载。

如果尝试成功,如由决策框230的肯定输出所例示的,根据一些实施例,如方框250中,卸载引擎120可以被配置为将对数据流执行数据操作的结果返回给应用。如此被,如果一个或多个数据操作成功地卸载到协处理器并且由协处理器成功地执行,那么卸载引擎120可以将结果返回给应用。根据各种实施例,由卸载引擎120返回给应用的结果可以包括关于数据操作和/或数据流的各种信息和/或数据中的任何。例如,一个或多个数据操作可以涉及对数据流进行解析、扫描、检查或修改以便确定关于数据流的格式或者内容的信息,并且因此,在一些实施例中,卸载引擎120可以返回关于数据流的格式或者内容的信息。通常,卸载引擎120可以被配置为将与从使用现有或者旧有的库对数据流执行数据操作返回的结果对应或等同的结果返回给应用。而且,在一些实施例中,卸载引擎120可以被配置为将与从使用现有或者旧有的库对数据流执行数据操作返回的结果相同的结果返回给应用。

例如,使用基于java的示例,应用可以利用java流库对数据流执行数据操作,并且卸载引擎120可以拦截一个或多个方法调用,以便将那些数据操作卸载到分析加速协处理器。如果卸载数据操作的尝试成功,根据一个示例实施例,卸载引擎120可以返回结果给应用,并且那些结果可以符合java流接口定义(例如,如java流类/方法定义所定义的返回值)。

返回图2,如果卸载数据操作的尝试未成功,如由决策框230的否定输出所指示的,那么如在方框250中将执行数据操作的结果返回给应用之前,如方框240中卸载引擎120可以使用通用cpu核心对数据流执行数据操作。在一些实施例中,不管数据操作是成功卸载到协处理器还是使用通用cpu核心执行,返回给应用的结果可能相同(例如,相同、等同和/或值相同)。如随后更加详细描述的,根据各种实施例,使用协处理器执行数据操作的尝试可能由于其他原因而不成功,诸如由于数据的大小、并行执行的适合性、繁忙的协处理器、尝试超时、垃圾收集的需要等。

图3是例示了如本文中描述的被配置为执行使用分析加速器的数据流分析处理的资源高效加速的系统中的控制流的一个实施例的逻辑框图。根据一个基于java的示例实施例,用户代码300诸如可能是应用130的部分,可以根据流api310调用一个或多个方法以对数据流执行一个或多个数据操作。如此,在所例示的示例中,利用流api的用户java代码可以认为是卸载的目标。响应于应用调用数据操作方法(例如,使用流api),如方框320和330中,诸如为了关于潜在的卸载评估数据操作和/或数据流而做准备和/或为了将数据操作映射到相应的协处理器函数而做准备,卸载引擎120可以从所调用的方法中提取谓语(predicate)信息、源数据和/或流水线特性以及x向方法提供的任何参数。根据所例示的基于java的示例,卸载引擎120可以在平台独立的功能内创建包括关于stream流水线、源数据和谓语的信息的卸载工件,并且将卸载工件作为元数据传递到可被实现为每个加速器/平台的内蕴(intrinsic)的卸载函数。

如本文中描述的,源数据(例如,诸如在流api的语境中)可以代表可对其执行(例如,使用流api定义的)操作的阵列或者其他数据结构,诸如java集合。在一些实施例中,谓语可以是javalambda表达式或者函数接口,其典型地使用源数据的元素作为输入并且在输入上执行相等/相关类型的操作以产生布尔值。例如,在一个实施例中,intpredicate可以是消耗源数据的整数元素并且返回布尔的方法。另外,如本文中描述的,流水线(例如,在java流的语境下,根据一个实施例)可以被定义为在源数据上完成的操作序列,其中零个或更多个中间操作后面跟着一个末端操作。在运行时环境(例如,jvmjava运行时,在一个实施例中)的语境中,内蕴方法可以是api方法(例如,jdkapi方法)或者运行时(例如,jvm)操作,运行时环境可以为其提供专门的、更加优化的、特定于处理器和/或架构的实现方式。在执行这种内蕴化的操作时,运行时环境(例如,jvm)可以选择使用内蕴实现方式、非内蕴实现方式、解释实现方式或者运行时编译的实现方式(例如,诸如使用just-in-time编译器)。

如所示出的,根据各种实施例,卸载引擎120的功能的不同区域可以在平台独立的部分与平台特定的部分之间划分。例如,在一个基于java的示例中,可以将卸载引擎120的一部分为开发库的部分,诸如java开发工具包(jdk)库的部分。另外,可以使用平台特定的方法、库等来实现卸载引擎120的另一部分,诸如以便与正在特定系统上使用的具体协处理器一起高效地工作,诸如可以被提供作为平台独立的、面向对象的运行时环境(例如,在一个基于java的示例中,jvmjava运行时)的部分。如由方框340、350和360所例示的,卸载引擎120可以执行与以下有关的平台特定功能:关于卸载而评估数据操作和/或数据流,以及回退使用通用cpu核心对数据流执行数据操作或者对于由应用调用的方法利用一个或多个平台特定的实现方式,诸如根据一个基于java的示例通过利用协处理器的流实现方式。

如此,卸载引擎120的平台特定部分可以包括用于流函数的子集到协处理器(例如,在一个示例中,oraclesparc上的dax)的卸载的编译器内蕴方法。根据一些实施例,这个解耦方法可以减少和/或最小化对现有库实现(例如,java流库)的改变并且允许那些改变是平台不可知的,由此提供用于在几乎任何平台上容易且高效地卸载到加速器的接口,如果运行时环境也具有适当的功能的话。另外,如由方框370和380所例示的,卸载引擎120可以利用提供使用协处理器(例如,使用分析加速协处理器)的各种机制的一个或多个库。

根据各种实施例,将数据操作卸载到协处理器的尝试可以由于各种原因中的任何原因而被认为未成功。例如,如上所述,卸载引擎120可以被配置为检验、分析或者以其他方式检查例如数据操作和/或数据流,以便确定当被应用于数据流时数据操作是否适于卸载。这种确定可以认为是尝试使用协处理器执行数据操作的部分。图4是例示了如本文中描述的尝试卸载一个或多个数据操作的一个实施例的流程图。例如,如方框400中所示,作为尝试使用诸如分析加速协处理器之类的协处理器对数据流执行一个或多个数据操作的部分,如在决策框410中,卸载引擎120可以被配置为确定数据操作在被应用于数据流时是否适于并行操作。如上所述,在一些实施例中,卸载引擎可以依赖于应用(例如,程序员)指定操作是否适于并行执行。然而,在其他实施例中,可以使用其他方法确定数据操作和/或数据流是否适于并行执行。另外,在一些实施例中,卸载引擎120可以被配置为卸载数据操作,而不管它们对于并行执行的适合性。

另外,在一些实施例中,卸载引擎120可以被配置为确定对于将要卸载的数据操作来说,数据流是否太大或者太小。例如,如果数据流小于预定阈值,那么卸载引擎120可以确定不使用分析加速协处理器对数据流执行数据操作(例如,对于非常小的数据流,可能不值得卸载数据操作的努力),并且因此如由决策框420的输出的否定所例示的,卸载数据操作的尝试可以认为不成功。类似地,卸载引擎120可以确定数据流大于预定阈值,并且因此确定不使用分析加速协处理器对数据流执行数据操作。另外,在一些实施例中,卸载引擎可以被配置为仅卸载适于并行操作的数据操作,并且因此卸载引擎可以确定数据操作在被应用于数据流时是否适于并行操作。例如,在一些实施例中,卸载引擎可以被配置为仅卸载如下的数据操作:针对这些数据操作,应用(或者应用的程序员)指定了可以对于(例如,代表数据操作和/或数据流的)对象集合中的每个元素独立地并行执行操作(例如,显式单指令多数据声明)。

在一些实施例中,如果使用协处理器对数据流执行数据操作的尝试花费的时间长于预定超时时段,则该尝试可能不成功。如此,如果如由决策框440的否定输出所例示的,执行数据操作的尝试超时(例如,花费的时间长于预定超时时段),那么如在方框450中,卸载引擎120可以被配置为使用通用cpu核心对数据流执行数据操作。如果对于协处理器发生多次超时,卸载引擎120可以暂时停止使用协处理器。另外,如在方框460中,卸载引擎120可以将对数据流执行数据操作的结果返回给应用(即,不管数据操作是使用协处理器还是一个或多个通用cpu核心执行的)。

另外,在一些实施例中,数据操作可以链接在一起,使得一个操作的输出可以传递作为下一个操作的输入。例如,在一个基于java的示例实施例中,jdk8流可以通过使集合数据流水线化来链接操作。这种链接特征可以允许用户将一个流水线级的输出传递到下一个流水线级,而不需要创建新的流对象。另外,一些分析加速协处理器可以包括可以能够将一个协处理器操作的输出传递到另一个而不需要将中间结果写入存储器的硬件特征。如此,在一些实施例中,软件库内的操作链接能力可以被映射到使用分析加速协处理器的相应链接能力。在一些实施例中,这种特征可以允许在硬件上对于流操作(例如,stream操作)的快速且高效的基于链的处理。

虽然根据一个基于java的示例实施例,本文是关于被称作intstream的专门的流而描述的,但是一般来说,根据各种实施例,本文中描述的方法、函数、机制和/或功能性可以应用于几乎任何基于数据流的数据操作。例如,本文中描述的方法、函数、机制和/或功能性可以应用于由其他原语类型、值类型和/或对象类型构成的java流。在文献的剩余部分,我们将使用intstream来说明我们的方法论。

考虑下面的一段java代码:

在上面的示例代码中,新的数据类型customer(客户)被创建并存储在客户列表中。客户列表是要应用一个或多个数据操作的数据流,卸载引擎可以尝试使用分析加速协处理器执行数据操作。在许多实施例中,数据流,诸如在上面的示例代码中的客户列表,可以具有几乎任何大小,从几个条目到数百万条目。

在不利用流的实现方式中,诸如在上面的示例代码中由方法nonstreamway()所例示的,代码迭代遍历数据集合的每个元素。为了将这种代码映射到单指令多数据(simd)硬件单元,编译器可能不得不遍历大块代码来识别simd样式,这可能是低效的。在利用流的实现方式中,如在上面的示例代码中由方法streamway()所例示的,程序员可以指定操作是否数据并行的并且可以能够使用更高级别、更加抽象的方式来指定操作(例如,使用parallelstream()构造体)。根据各种实施例,这种数据并行操作可以认为极其适合于使用基于simd的加速器(例如,sparc上的dax查询处理器上的矢量/simd单元)进行加速,并且可以产生更好(可能高达数个数量级增益)性能和/或能量效率。

如上所述,在一些实施例中,由应用指定应用于数据流的数据操作可以被映射到分析加速协处理器的相应函数(例如,硬件单元)。下面是例示了根据一个基于java的示例实施例的使用java流api的一个示例映射:

例如,根据一个示例实施例,通过使用上面基于java的示例源代码,卸载引擎120可以关于java流过滤器的数据操作,确定协处理器硬件上的匹配功能,如下面所讨论的。

协处理器上的扫描范围:

根据一个实施例,扫描范围命令扫描给定格式的输入矢量,寻找多达两个常数值,并且输出位矢量,无论何时找到匹配则位矢量为1否则为0。扫描范围命令可以返回所找到的匹配数量作为整数(例如,如果过滤器后面跟着计数的末端操作)。例如:

scan_range(datastream,lower_bound,upper_bound)

retval=(int)number_of_matches

在一些实施例中,比较操作可以是字符串比较,也可以用来比较整数。例如,通过使用字符串比较,可以使用固定宽度字节封装的输入格式以及最小变换来扫描带符号的java整数。另外,输出的位矢量可以写在所提供的存储器位置。

协处理器上的选择:

根据一些实施例,分析加速协处理器上的选择命令可以采取给定格式的输入矢量和相同大小的位矢量。选择命令可以输出仅包含输入矢量中的、位矢量为1的那些元素(并且可能还有其他相关元素)的矢量。例如:

select(datastream,bitvector)

retval=(int)number_of_matches

根据一些实施例,选择命令的返回值可以等于所输入的位矢量中1的数量,并且矢量的选择值可以写到所提供的存储器位置。如上所述,在一些实施例中,数据操作可以链接在一起,使得一个操作的输出被提供作为另一个操作的输入。继续上面的示例,如果扫描命令的输出可以作为位被链接为选择命令的输入而不将中间结果写到存储器,则组合的操作可以使用分析加速协处理器来加速。例如,当将扫描的输出链接到选择时,可以分配新的存储器区域,(根据上面的示例源代码)初始化为最终列表frequentcustomers并且连同用于扫描和选择的命令配置一起卸载(例如,发送)到分析加速协处理器,使得处理器能够写入选择的最后输出。如此,协处理器可以被提供指示一个或多个数据操作(例如,上面示例中的扫描和选择)以及将在其上执行那些操作的数据流的元数据。在一些实施例中,协处理器可以被配置为在可能的情况下将那些操作链接在一起,以便提高效率。

示例实现方式:

在一些实施例中,协处理器的功能(例如,作为库)可以被提供给诸如卸载引擎120之类的卸载引擎利用。例如,在基于sparctm的系统上的dax协处理器的情况下,库可以由制造商提供,诸如作为一个示例,libdax库可以由solaris提供。

平台独立的库:

在一些实施例中,诸如卸载引擎120之类的卸载引擎可以被配置为在高级别拦截现有的数据操作(例如,java流)而对现有实现方式不做任何实质修改。例如,在一个基于java流的示例中,对于java开发工具包(jdk)中的流实现方式的改变可以是最小的,并且修改可以确保如果卸载的尝试失败或被确定为不可行(例如,就执行而言,诸如通过使用各种试探法中的任何一种),执行总是返回到原始的实现方式。

虽然本文中描述为“拦截”由应用做出的调用,在一些实施例中,可以提供现有方法的新版本和/或修改版本,调用它们代替现有旧有方法。例如,在基于java的实施例中,新的类可以添加到jdk库,无论何时调用特定的方法和/或无论何时生成特定的对象(例如,流对象/方法),就可以实例化这些新的类。例如,根据一个基于java的示例实施例,可以在流库中引入offloadinfo,每当在intpipeline.java的head()方法中创建intstream时就对offloadinfo进行实例化。

继续上面的offloadinfo示例,offloadinfo类可以包括与由intstream方法(例如在intpipeline.java内)调用的intstream(或者其他)方法相对应的方法(例如,卸载候选)。offloadinfo的方法可以记录关于intstream流水线的不同级的信息。根据一些实施例,信息可以按照对于当前流调用而遇到的次序记录。如果流水线级(例如,intstream方法)具有变元(例如,intpredicate),则对于变元的引用可以记录在offloadinfo中。

在一些实施例中,offloadinfo还可以记录另外的信息,诸如关于数据操作应被应用于的源数据(例如,数据流)的信息。另外,offloadinfo可以包括可以在intstream的末端操作开始时(即,在java流示例中)调用的方法,诸如evaluate()方法,以便执行(或者尝试)流水线(例如,要被应用于数据流的一个或多个数据操作)到分析加速协处理器的卸载。

在一些实施例中,evaluate()方法可以在流水线的特性和源数据上应用一个或多个核查以确定流水线是否可以被卸载。如上所述,如本文中描述的,这些核查可以被认为是卸载数据操作(例如,使用分析加速协处理器对数据流执行一个或多个数据)的尝试的一部分。如此,诸如卸载引擎120之类的卸载引擎可以被配置为应用一个或多个核查以确定是继续使用协处理器执行数据操作还是回退并且使用通用cpu核心执行数据操作(即,在卸载不可行的情况下)。当回退时,卸载引擎120可以通过将执行返回到旧有的数据流处理库来使用通用cpu核心对数据流执行数据操作。例如,根据一个实施例,在基于java流的示例中,响应于基于试探式核查确定卸载尝试不是有益的,卸载引擎120可以将执行返回到现有的流库实现方式(即,将使用通用cpu核心在软件中对数据流执行数据操作)。

如果发现卸载可行,卸载引擎120可以生成关于数据操作和数据流的元数据,诸如流水线形状、级、谓语、关于每级的变元等。图5是例示了根据一个示例实施例的通过被配置为使用如本文中描述的分析加速器的数据流分析处理的资源高效加速的系统的数据流的逻辑图。如图5中所示,卸载引擎120可以被配置为根据从用户代码(例如,将对数据流执行的操作)中导出的信息生成元数据510。根据不同的实施例,元数据510可以包括关于数据操作和/或数据流的各种类型的信息。例如,元数据510可以包括但可以不局限于:形状信息512,其可以描述和/或表征流水线的几何形状(例如,级如何相互连接);级信息514,其可以描述和/或表征流水线中的一个或多个级;谓语信息516,其可以描述和/或表征作为流水线的部分的一个或多个谓语;以及变元信息518,其可以描述和/或表征由流水线中的不同级使用的一个或多个变元。元数据510中包括的确切信息以及元数据510中包括的信息的格式可以随一个实施例不同而不同,并且可以不同于图5中所例示的。

在一些实施例中,元数据可以被高速缓存,以便允许它的重复使用并且防止必须重复地收集信息。例如,在一个示例实施例中,卸载引擎可以构造并且高速缓存包含对流水线形状、级、谓语以及每个级所需的变元进行编码的平台不可知元数据的字节阵列。另外,根据一些实施例,当在谓语中使用变量时,它们的信息也可以被嵌入作为由卸载引擎120生成的元数据的部分。

在一些实施例中,卸载引擎120可以被配置为利用各种形式的代码分析中的任何一种来确定关于谓语的信息。例如,在基于java流的实施例中,asm、java字节代码操纵和分析框架可以由卸载引擎120利用。如此,当生成关于数据操作和数据流的元数据时,卸载引擎120可以被配置为将与各个流水线级对应的谓语传递到代码分析器(例如,基于java的实施例中的asm适配器)。代码分析器然后可以检查方法的实现方式/主体(例如,intpredicates’‘test(i)z’方法)并且为卸载引擎120构造元数据。如果特定谓语不是卸载友好的,那么适配器可以返回错误代码,可能暗示着卸载引擎120应当回退(例如,使用通用cpu核心对数据流执行数据操作)。

分析代码生成元数据的结果可以以各种格式中的任何一种返回。例如,在一个基于java的实施例中,成功解析的intpredicates可以产生在字节阵列(例如,作为元数据)中捕获的基于逆波兰表示法(rpn)的表达式,字节阵列可以由asm适配器返回。如上所述,当在谓语中使用变量时,它们的信息也可以作为元数据的部分而嵌入。另外,在一些实施例中,关于变量的信息,像类名称、字段名称和类型,可以由代码分析器(例如,一个基于java的示例中的asm适配器)单独地存储在数据结构中并且连同元数据一起传递回去。这些变量的值可以使用卸载引擎的evaluate()方法捕获,并且元数据可以重构,准备传递到与协处理器交互的、平台特定的内蕴方法。

在一些实施例中,被配置为实现如本文中描述的使用分析加速器的数据流分析处理的资源高效加速的系统可以包括代表实现卸载到平台特定加速器的各种方法和/或函数的单个入口点的方法。换言之,卸载引擎120可以被配置为使用单个方法作为使用分析加速协处理器对数据流执行数据操作的入口点。

如此,在一些实施例中,如上所述,evaluate()方法可以调用以元数据和源数据作为变元的方法offloadevaluate()(其可能是静态方法)。在一些实施例中,offloadevaluate()方法可以返回指示尝试使用分析加速协处理器对数据流执行数据操作的结果的信息。例如,在一个基于java的示例实施例中,java对象offloadresult可以编码成功/失败代码以及流水线评估的最终结果。如果offloadevaluate()方法指示未能成功卸载,evaluate()方法可以向卸载引擎120返回假,并且作为响应,如上所述,卸载引擎120可以使用通用cpu核心对数据流执行数据操作。在一个实施例中,响应于offloadevaluate()方法指示未能成功卸载,evaluate()方法可以向流水线的末端操作返回假(例如,或者未成功卸载的其他指示)。根据一些实施例,如果卸载成功,卸载引擎120(和/或末端操作)可以使用来自使用分析加速协处理器(例如,加速器)对数据流执行数据操作的结果作为最终结果进行返回。

另外,在一些实施例中,offloadevaluate()方法的默认实现方式(例如,在没有触发编译器内蕴方法的情况下)可以返回指示未能成功卸载的offloadresult对象。如此,根据一个实施例,如果在特定平台上禁用和/或不支持加速,控制可以返回到(例如,数据操作的)现有实现方式而没有任何副作用。

平台特定内蕴函数:

在一些实施例中,offloadevaluate()的内蕴(例如,平台特定的)实现方式可以使用来自卸载的返回值构造新的对象(例如,新的offloadresult对象)。使用基于java流的示例,如下面的示例源代码中所示,方法handle_offioad()可以使用来自streamoffload的返回值构造offioadresult类型的新java对象:

offloadresult_cstreamoffload(jbyte*metadata,jintmdsize,void*src,jintsrcsize);

在上面的示例源代码中,offloadresult_c可以被认为是成员一对一映射的java类offioadresult的c副本。streamoffload()的原型可能对于多个(可能所有)平台是相同的,然而,实现方式可以对于每个平台定义并且可以特定于平台特定加速方法。例如,根据一个基于java的示例,实现方式可以由包括streamoffload_arch.hpp的架构标记控制。如果特定架构没有实现streamoffload(或者类似的)方法,那么默认的行为可以是返回未成功卸载的指示(例如,没有发生加速的指示)并且可以调用默认的流实现方式。换言之,如果特定的体系结构没有提供用于执行卸载的入口方法,那么卸载引擎120可以被配置为将卸载尝试看作未成功,并且作为响应,诸如通过将控制返回给数据流处理代码的旧有实现方式,使用一个或多个通用cpu核心对数据流执行数据操作。

到协处理器调用的转换:

在被配置为执行卸载的平台特定(例如,内蕴)方法(例如,基于java的示例中的streamoffload)中,可以解析流水线和谓语元数据,并且可以创建流水线节点的链表。返回到图5,根据一些实施例,可以对流水线元数据510进行分析、检查和/或解析,并且结果用来生成流水线节点520a...520n的链表。每个流水线节点520可以代表一个流水线级(例如,将要应用于数据流的数据操作)。在每个流水线节点520内部,可以存在代表谓语(如果存在的话)的结构的树节点525,作为那个流水线级的二叉树。根据一个实施例,这种二叉树可以从作为树的节点与操作一起(例如,以逆波兰表示法)提供的谓语元数据中构造。在其他实施例中,可以以不同的方式使用不同的数据结构和/或方法生成、存储和/或提供关于要对数据流执行的数据操作的信息和/或元数据。在本文中描述的元数据的构造和/或使用方式仅代表根据一个具体示例实施例的一个示例。

在处理流水线之前,源数据可以(例如,根据基于试探法的块大小)分解成多个块。根据一些实施例,然后可以关于每个输入块,从开始到结束提取流水线。对于支持早期故障转移的操作(例如,对于anymatch()末端级,发现早期匹配),协处理器上的实现可以早期返回结果,并且因此可以不处理输入数据块的剩余部分。

另外,在一些实施例中,可以在流水线和谓语树上执行一趟快速转换,诸如将树节点的一些组合成可以由具体架构和/或协处理器直接支持的复杂(例如,组合)操作。在执行这趟转换(如果存在的话)之后,谓语树中的节点可以转换成平台特定的协处理器调用。

例如,在一个实施例中,流水线操作的链表可以被迭代(例如,从头结点开始),按照次序执行每个流水线级。根据一些实施例,如果关于级存在谓语树,则可以递归地处理那个谓语树,由此为树节点生成对协处理器函数的调用。如果当前流水线级不是末端操作,当前流水线级的输出阵列可以是下一个流水线级的源阵列(例如,如果使用链接)。

作为替代,如果当前级是末端操作,则可以返回最终结果。如此,在使用分析加速协处理器对数据流执行一个或多个数据操作之后,卸载引擎120可以将结果返回给应用。例如,在一个示例实施例中,执行流水线的结果可以通过构造offloadresult_c数据结构而返回,虽然根据不同的实施例,结果可以以不同的方式和/或使用不同的数据结构返回。如果卸载失败(例如,卸载尝试未成功),失败发生的原因可以被编码成错误代码并且可以被包括在返回结果中。

在一些实施例中,诸如sparctm系统上的dax协处理器之类的数据分析加速器可能仅支持不带符号的比较操作。如此,为了将来自带符号的流的调用转换成协处理器的调用,可能必须执行额外的处理。例如,在一个实施例中,在谓语中使用的输入矢量和常数可以与适当的边界元素进行xor。作为一个示例,为了转换insstream,输入矢量和常数与2^31可以进行xor,如下面所示:

谓语:

-40<12<20->(2**31-40)<(2**31+12)<10(2**31+20)

在一些实施例中,出于执行原因,可以将带符号的扫描值分解成不带符号的扫描范围,以代替使用xor。带符号的扫描范围可以通过将它分解成两个带符号的扫描值谓语而完成,如下面对于一个基于dax的示例所示:

x>5,dax_allmatch(greater_than,5,smaller_than,2**31)

可以实现内蕴网关(例如,特定平台入口方法),使得它可以执行卸载,但是也可以帮助offloadinfo的初始化(例如,当初始化流时),这取决于传递到入口方法的参数。如此,在一些实施例中,内蕴入口方法可以提供使得能够进行高效初始化的另外信息。例如,根据一个示例实施例,内蕴入口方法可以核查各种类型的信息,诸如jvm标记流加速,和/或系统上的具体加速器的能力,以便提供使得能够进行高效初始化的必要信息。

垃圾收集支持:

因为可以实现堆上的数据结构以便支持协处理器的直接访问,在一些实施例中,可以采取步骤以确保在源数据由卸载代码完全消耗以前(例如,在已经对数据流执行所有数据操作以前)垃圾收集不会发生。在一些实施例中,协处理器可以被配置为(例如,装备为)支持作业的异步提交以及查询作业是否完成的轮询机制。如此,卸载线程可以继续核心上的执行,同时协处理器处理卸载。换言之,在一些实施例中,应用可以能够继续执行其他代码,同时等待分析加速协处理器对数据流执行数据操作(例如,同时等待卸载引擎使用协处理器对数据流执行数据操作)。

另外,在一些实施例中,可以在卸载期间核查和/或监控垃圾收集状态信息。例如,在一个实施例中,可以周期性地核查safepointsynchronize::state以确定是否需要安全点(safepoint)。如果安全点是必需的,那么协处理器操作(例如,卸载处的尝试)可以停止并且卸载可以返回指示未成功的卸载(例如,失败)。作为响应,卸载引擎120可以诸如通过将控制返回到核心上的现有/旧有数据流处理执行,回退/去优化并且使用通用cpu核心对数据流执行数据操作,由此允许生成安全点并且执行垃圾收集操作。例如,在一个基于java流的实施例中,响应于由于需要垃圾收集安全点而未成功的卸载尝试,卸载引擎120可以将控制返回到现有的java流实现方式,由此允许使用通用cpu核心对数据流执行数据操作。在一些实施例中,这个特征可以确保满足垃圾收集暂停时间并且在需要垃圾收集操作时不拖延增变线程(例如,等待卸载线程)。例如,在一个示例实施例中,streamoffload()可以包括确保满足垃圾收集暂时时间保障并且在需要垃圾收集操作时剩余的增变线程不会在卸载线程上被拖延的机制。

如上所述,在一些实施例中,如果使用协处理器对数据流执行数据操作的尝试花费的时间长于预定超时时段,则该尝试可能不成功。如果执行数据操作的尝试超时,如先前所描述的,卸载引擎120可以被配置为使用通用cpu核心对数据流执行数据操作。因此,在一些实施例中,可以向协处理器操作给出基于试探的超时(timeout)时段以确保协处理器调用在合理的时间量内返回。如此,如果繁忙的协处理器或者硬件问题导致执行时间长于预定超时时段,协处理器操作可以中止,并且执行可以去优化到核心(例如,可以使用通用cpu核心而不是分析加速协处理器对数据流执行数据操作)。

示例计算系统

在不同的实施例中,本文中描述的使用分析加速器的数据流分析处理的资源高效加速的技术、机制和方法可以在各种计算系统中的任何计算系统上或者由各种计算系统中的任何计算系统实现。例如,图6是例示了被配置为实现根据各种实施例的如本文中描述的这种技术、机制和方法的计算系统的一个实施例的框图。计算机系统2000可以是各种类型的设备中的任何一种,包括但不局限于个人计算机系统、台式计算机、膝上型计算机或者笔记本电脑、大型计算机系统、手持计算机、工作站、网络计算机、消费者设备、应用服务器、存储设备、诸如手表之类的个人设备、调制解调器、路由器等,或者通常任何类型的计算设备。在一些实施例中,计算机系统2000可以代表被配置为允许将数据流处理卸载到分析加速协处理器的系统。

如本文中描述的使用分析加速器的数据流分析处理的资源高效加速的一些机制可以被提供作为计算机程序产品或者软件,其可以包括其上存储有指令的非临时性计算机可读存储介质,指令可以用来对计算机系统2000(或者其他电子设备)进行编程以执行根据各种实施例的处理。计算机可读存储介质可以包括以机器(例如,计算机)可读的形式(例如,软件、处理应用)存储信息的任何机制。机器可读存储介质可以包括但不局限于:磁性存储介质(例如,软盘);光学存储介质(例如,cd-rom);磁光存储介质;只读存储器(rom);随机存取存储器(ram);可擦可编程存储器(例如,eprom和eeprom);闪速存储器;适合存储程序指令的电类型或其他类型的介质。另外,程序指令可以使用光学、声学或者其他形式的传播信号(例如,载波、红外信号、数字信号等)通信。

在各种实施例中,计算机系统2000可以包括一个或多个处理器2070,诸如通用cpu核心140;其可以包括多个核心,任何一个核心可以是单线程或者多线程的。例如,多个处理器核心可以被包括在单个处理器芯片(例如,单核处理器2070)中,并且多个处理器芯片可以被包括在计算机系统2000中。在各种实施例中,每个核心处理器2070可以包括高速缓存,或者高速缓存的分层结构2075。例如,每个处理器芯片2070可以包括多个l1高速缓存(例如,每个处理器核心一个)以及一个或多个其他高速缓存(可以由单个处理器上的处理器核心共享)。计算机系统2000还可以包括一个或多个协处理器2060,诸如分析加速协处理器150。计算机系统2000还可以包括一个或多个存储设备2050(例如,光学存储、磁性存储、硬盘驱动器、带驱动器、固态存储器等)以及一个或多个系统存储器2010(例如,高速缓存、sram、dram、rdram、edoram、ddrram、sdram、rambusram、eeprom等的一个或多个)。在一些实施例中,存储设备2050中的一个或多个可以被实现为存储器总线上(例如,互连2040上)的模块,其在形式和/或功能上类似于单排存储器模块(simm)或者双排存储器模块(dimm)。各种实施例可以包括图20中未例示的更少或者另外的组件(例如,视频卡、音频卡、另外的网络接口、外围设备、网络接口诸如atm接口、以太网接口、infinibandtm(ib)接口、帧中继接口等。)

一个或多个处理器2070、一个或多个协处理器2060、存储设备2050以及系统存储器2010可以耦合到计算机互连2040。系统存储器2010中的一个或多个可以包含程序指令2020。程序指令2020可以是可执行的以实现卸载引擎2028、卸载引擎120、一个或多个应用130、一个或多个应用2022、共享库2024或者操作系统2026。在一些实施例中,卸载引擎2028可以与卸载引擎120相同,或者可以代表卸载引擎120。类似地,在一些实施例中,应用2022可以与应用130相同,或者可以代表应用130。在一些实施例中,程序指令2020可以是可执行的以实现竞争管理器(未示出)。在一些实施例中,程序指令2020(或者更具体地,共享库2024)可以包括使用分析加速器的数据分析处理的资源高效加速的方法,或者可以由卸载引擎120、卸载引擎2018、应用130和/或应用2022调用的任何其他方法。

程序指令2020可以以平台本机二进制、任何解释语言(诸如javatm字节代码)、或者以任何其他语言(诸如c/c++、javatm)编程语言等编码。在各种实施例中,卸载引擎2028、卸载引擎120、应用2022、应用130、操作系统2026和/或共享库2024均可以以各种编程语言或方法中的任何一种实现。例如,在一个实施例中,卸载引擎2028和操作系统2026可以基于java编程语言,而在另一个实施例中,它们可以使用c或者c++编程语言编写。类似地,根据各种实施例,应用2022可以使用java编程语言、c、c++或者另一种编程语言编写。而且,在一些实施例中,卸载引擎2028、应用2022、操作系统2026和/或共享库2024可以不使用相同的编程语言实现。例如,应用2022可以基于c++,而卸载引擎2028可以使用c开发。

虽然已经相当详细地描述了上面的实施例,但是一旦充分理解上面的本公开,对于本领域那些技术人员来说许多变化和修改将变得显然。例如,虽然根据支持数据流分析处理的加速的特定类型的操作描述了许多实施例,但是应当注意,本文中公开的技术、方法和机制可以在其他语境中适用,其中应用访问和/或操作与本文的示例中描述的不同类型的数据和/或数据流,并且其中支持或者实现支持本文中描述的分析加速的底层硬件的不同实施例。所附权利要求书打算解释为包含所有这种变化和修改。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1