CN110383247B - 由计算机执行的方法、计算机可读介质与异构计算系统 - Google Patents
由计算机执行的方法、计算机可读介质与异构计算系统 Download PDFInfo
- Publication number
- CN110383247B CN110383247B CN201880016139.1A CN201880016139A CN110383247B CN 110383247 B CN110383247 B CN 110383247B CN 201880016139 A CN201880016139 A CN 201880016139A CN 110383247 B CN110383247 B CN 110383247B
- Authority
- CN
- China
- Prior art keywords
- processing unit
- information
- runtime
- data
- data structure
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5044—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering hardware capabilities
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/486—Scheduler internals
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Complex Calculations (AREA)
- Stored Programmes (AREA)
Abstract
一种由计算机执行的方法,包括初始化具有第一计算内核(140‑144)的异构计算系统第一处理单元(71),和具有第二计算内核(150‑154)的异构计算系统第二处理单元(72)。所述第一计算内核(140‑144)和所述第二计算内核(150‑154)均配置为执行来自程序段(220)的数值运算,该程序段(220)配置为接收存储通用数据类型多个匀速的第一数据结构(A)。所述程序段(220)包括一个函数元信息,该函数元信息包括数值运算输出大小的相关信息、输出结构,和/或生成输出的工作量。所述第一数据结构(A)运行时实例(A1)的函数元信息和数据元信息用于判断在第一处理单元(71)上执行第一计算内核(140‑144),以通过所述运行时实例(A1)执行数值运算的第一预期成本,以及在第二处理单元(72)上执行第二计算内核(150‑154),以通过运行时实例(A1)执行数值运算的第二预期成本。所述数据元信息包括所述运行时实例(A1)的运行期大小信息、运行期位置信息、运行时同步信息和运行时类型信息中的至少一项。本方法还包括以下之一:若第一预期成本低于或等于第二预期成本,则在所述第一处理单元(71)上执行所述第一计算内核(140‑144),以在所述运行时实例(A1)上进行数值运算;若第一预期成本高于第二预期成本,则在所述第二处理单元(72)上执行所述第二计算内核(150‑154),以在所述运行时实例(A1)上进行数值运算。
Description
技术领域
本发明一般涉及一种馈通元件,更具体设计一种能够用于260℃以上的高操作或应急情况温度的恶劣环境的改进馈通元件。具体而言,本发明的馈通元件可以承受42000psi的操作和/或应急情况压力。因此,它们可以用于各种应用,尤其是用于井下(downhole)钻孔设备和用于安全容纳有毒物质以及用于航空器中。
背景技术
异构计算资源的高效利用需求极高,在数值与数据分析领域尤为如此。这涉及到并行化程序的任务,这一任务往往繁琐、成本高,且需要与并行化程序相关的低级计算机体系结构知识和编程技术知识。
一直以来,解决这一问题的出发点是通用编程语言(GPL)的通用集,例如C/C++、C#、FORTRAN、Pascal和Java。这些语言通常用于低粒度数据,将标量数据作为基本数据元素和任意控制指令处理。虽然编译器技术已成功针对单个处理器的执行做出了改进,但异构计算系统(GPL)程序的编译仍存在问题。
例如,编译器必须做出某些判断:定位哪些处理单元、如何指导处理单元进行数据处理,以及如何向处理单元提供数据。问题包括(快速变化的)计算硬件的广泛多样性、任意GPL语言元素与指令图的复杂性、待处理数据的动态性,以及全部限制信息最终可用的时间。此外,编译器通常需要编程人员提供重要的决策支持。因此,许多软件程序(例如大多数基于GPL的程序)的并行化能力通常仅部分可用,且仅部分高效传输至异构计算系统。此外,由于引入的成本,目前为止使用的自动并行化方式仅分别适用于相对较大的数据大小与较大的代码段。
因此,现有的系统遵循一种“由上至下”的方法,该系统将较大程序的部分分配至加速装置以加速运算过程,并最大化这些部分。问题包括待选择的执行路径的复杂性(参数空间的大小)、数据变化、执行期间系统状态的复杂性(多样性、不可预测性)。
因此,异构计算结构软件程序的并行化需要加以改进。
发明内容
根据一种由计算机执行的方法的一个实施例,该方法包括初始化具有第一计算内核的异构计算系统第一处理单元,以及具有第二计算内核的异构计算系统的第二处理单元。所述第一计算内核与所述第二计算内核均配置为执行来自程序段的数值运算,所述程序段配置为接收存储通用数据类型多个元素的第一数据结构。所述程序段包括一个函数元信息,该函数元信息包括与数值运算输出结果大小、输出结构,和/或生成输出的工作量相关的数据。该函数元信息与第一数据结构运行时实例的数据元信息用于计算在第一处理单元上运行第一内核,以通过运行时实例执行数值运算的第一预期成本,且用于计算在第二处理单元上运行第二内核,以通过运行时实例执行数值运算的第二预期成本。所述数据元信息包括所述运行时实例的运行期大小信息与运行期位置信息。所述方法还包括以下情况之一:若第一预期成本小于或等于第二预期成本,则在第一处理单元上执行第一计算内核,在运行时实例上进行数值运算;若第一预期成本高于第二预期成本,则在第二处理单元上执行第二计算内核,通过运行时实例进行数值运算。所述数据元信息还可包括所述运行时实例的运行时同步信息和/或运行时类型信息。
在本说明书的上下文中,术语“处理单元”意在描述一种硬件装置,特别是一种能够根据指令进行运算和/或计算的处理器,所述指令通常存储在根据单元而特定的计算内核中。
所述处理单元可以是单核CPU(中央处理器)、多核CPU、具有矢量拓展的CPU(例如SSE或AVX)、GPU(图形处理器)、集成至少一个GPU的CPU、支持数值计算的协同处理器、SIMD加速器(单指令多数据结构加速器)、微控制器、DSP(数字信号处理器)等微处理器,以及FPGA(现场可编程门阵列),或通常组成名为虚拟处理器的这些装置中的一个或多个的组合。
在本说明书上下文中,术语“生成输出的工作量”意在描述用于生成输出的数值工作量(单指计算成本)。所述相应的函数元信息可包括数值工作量系数,或甚至数个数值工作量系数。在运行期前,所述函数元信息可根据硬件属性(所述处理单元的属性)更新。在本说明书的上下文中,术语“预期成本”意在描述运行时在给定处理单元上通过运行时实例进行数值运算的预期全部成本。所述预期成本通常指代运行时在给定处理单元上的计算成本,且(当所述处理单元还未访问所述运行时实例时)可包括传输成本。所述预期成本可通过所述函数元信息计算,例如一个或多个数值工作量系数和所述数据元信息,尤其是运行时实例的运行期大小信息与运行期位置信息。在本说明书的上下文中,术语“计算内核”意在描述能够通过数据结构运行时实例进行特定数值运算的编译软件代码,在处理单元执行该数据结构时,该数据结构能够存储通用数据类型的多个元素。
所述第一数据结构和/或该第一数据结构的运行时实例能够存储数量可变的相应通用数据类型,例如整数、浮点数、复数等等。
所述第一数据结构和/或该第一数据结构的运行时实例通常是n维直线数据结构。
所述第一数据结构和/或该第一数据结构的运行时实例可以是集合(在.NET框架的意义上)、向量、数组、列表、队列、堆栈、图形、树或是指向这类结构的指针。出于简便之原因,假设所述数据结构代表一个多维数组(矢量、矩阵或更高维数学数据),除非另有说明,假设所述数值运算为在具体实施方式中的数组运算。在下文中,术语“直线数组”与“矩阵”作为同义词使用。直线数组通常用于科学或技术算法中。例如,分别以行和列布置的显示屏或相机图像传感器的像元可分别存储在相应的2D或3D直线数组中。
通常,所述第一数据结构的运行时实例存储数据,该数据代表程序中正处理的处于不同完成阶段的技术信息,例如测量数据、图像、声音数据、模拟数据、控制数据、状态数据等等,以及中间结果。
由于成本于运行期执行数值运算之前(例如在执行数值运算紧接前)判断,且涉及所述第一数据结构运行时实例的函数元数据(函数元信息)与数据元信息,因此,所述数值运算可由(运行时)配置最适合此目的的处理单元执行。与其他方法相较,这种方法成本更低。因此,与其他方法相较,该异构计算系统能够更加高效地处理(平均)不同大小的数据结构。
例如,计算矩阵A中所有元素平方和这一数值运算的成本sum(A^2)可表示为A大小的函数。若语句将多次执行,各个调用可关联A的各个大小。通常,若A足够大,且尤其适用于图形处理器支持的元素类型时,则运算sum(A^2)在图形处理器上高效执行。但若A只包含少量元素或单个元素,尤其在当运算待执行时,中央处理器而不是图形处理器已经直接访问甚至存储矩阵A的情况下,中央处理器可能会更加适用。
因此,预期成本通常取决于所述数值运算、所述运行时实例的大小、所述数据结构运行时实例的存储位置、可用处理单元(中央处理器、图形处理器……)的(计算)属性。
因此,传统编译器不能考虑到以下因素:运行时可用硬件的广泛多样性(中央处理器、多核中央处理器、中央处理器矢量扩展、单指令多数据结构加速器、图形处理器装置、现场可编程门阵列、数字信号处理器、多内存模型);通用语言和指令图形的复杂性;待处理数据的动态性(数据大小和位置在相同代码段的多个调用间变化)。当所有限制信息最终可用时,必须提供重要的运行支持。(运行时)静态编译与动态编译均会给实际的数值运算增添成本负担。这往往会使得到的程序对于较小输入数据,甚至中等大小的输入数据而言极为低效(缓慢),因此对于不同大小和/或结构的输入数据而言也是如此。
相似地,在技术计算中使用的传统编译特殊语言(领域专用语言,DSLs)尽管能够基于n维数组结构制定数值算法(例如Mathworks出品的MATLAB、ILNumerics和NumPy),但往往仅对于足够大的输入数据显示出良好的运行性能。然而,在开发时,由编程人员负责将(足够大的)程序部分手动分配至执行单元。显然,这种方法既不能用于处理硬件变化(在不采用程序的情况下),也不能高效地将异构计算资源用于小程序段与不同的(小型)输入数据大小。
与此不同,本文描述的方法能够在适当的时间(即在编译时、启动时与运行时)执行期望的操作(尤其是收集信息与制定决策)。尤其做出有关执行路径的决策,例如仅在运行时做出决策,因此,决策在所有期望信息均可用于所述数据结构运行时实例和硬件(处理单元)/当前硬件负载时做出。这种方法能够减少成本负担,并自动适应种类广泛的数据大小与硬件配置。
此外,在运行时基于工作负载数据大小类别判断执行路径之前,进行一项耗时模拟(通常几个小时),该耗时模拟用于判断在给定硬件上进行给定数值运算的运行时间,其中试验数据大小类别不同,且该模拟并非必需。尽管该方法对于一些大型数据与一些小(复杂)算法而言可能是有效的,但由于需要进行(多维)大小分级以避免更长的模拟时间,因此该方法不能保证最优执行路径。此外,该方法既不能考虑到硬件负载,也不能考虑到运行时工作负载数据的世纪存储位置。此外,若用户修改了程序代码或处理硬件发生更改,该方法通常需要完整的新模拟。
与上述方法和其他方法不同,本文所述的方法还能够扩展到任何复杂程度的算法,甚至整个程序。在运行时与为运行数据预估数个连续程序段的最优执行路径时,无需进行演绎模拟或优化遍数。尽管这类演绎模拟或优化通常非常耗时耗能,从解决方案(执行路径配置)质量来看,该方法作用有限。一方面,为模拟或优化之目的,连续段的数量需要保持足够小(为了参数空间足够小),这导致了粗粒度的分段且/或限制了整体程序大小。另一方面,工作负载数据值是变化的,因此需要细粒度分段以应对变化的执行路径。此外,通过优化得到的解决方案通常仅标记局部最小值。为了在异构计算系统上找到算法的最优执行路径(全局最优),要考虑包括实际工作负载数据在内的全部参数。因此,全局优化通常是不可行的。
本文描述的方法与系统基于一种从下至上的方法:从作为更复杂算法基本构件的基础数值运算开始,在运行时直接评估最优执行路径。此处,数据与指令的粒度均起着重要作用,并为最优执行性能提供参考。
特别指出,纠缠系统“处理器与指令”未加绑定,并被函数(指令)替代,该函数(指令)能够处理数组而不是标量数据,是抽象的(例如不分配至具体的处理器),且能够在其执行前提供与成本相关的信息(函数元信息)。关注点从单一主处理器转向整体的合适执行装置。
由于处理动态数据大小与提前告知相关成本的能力,函数/指令变得更为复杂。在运行时,尤其是在执行前,工作负载(数组函数/指令+动态数据)立即分配至最适合的一个或多个处理单元或装置,因此,工作负载的分配可以考虑到当前系统的整体状态。
因此,小型输入数据、中型输入数据和大型输入数据能够被相应最合适的处理单元高效处理,而程序段单个编译代码的成本极小。
例如,可解析用户生成程序代码,以在编译时识别具有相应(已知)数值运算的程序段。此外,相应数值运算的函数元信息可在编译时判断,且包括一个相应的第一计算内核、一个相应的第二计算内核和相应函数元信息的一个相应运行时段可在编译时形成。
所述程序代码可包括数个通常是连续的程序段,这些程序段组成了一个程序序列。
在本说明书中,术语“序列”意在描述一种用户程序,或包括程序段的用户程序的一个部分。
在本说明书中,术语“程序段”意在描述指代通常在抽象层面上用于处理一个或多个数据结构输入和/或输出参数的指令,所述一个或多个数据结构能够存储相应通用数据类型的多个元素。“程序段”可包括简单语言实体,例如数组函数、-语句、-算符和/或可被编译器识别的上述语言实体的结合。例如,具有矩阵A和B的表达式“sin(A)+linsolve(B+3*cos(A))”可以是一个段。或者,“sin(A)’and‘linsolve(B+3*cos(A))”可以是相应的段。
在本说明书中,属于“运行时段”意在描述程序段的一种编译语言。该编译语言可在异构计算系统上执行,且通常包括用于该异构计算系统每个处理单元的相应计算内核以及控制代码,该控制代码用于计算所述一个或多个数据结构运行时实例的相应成本、选择用于其计算内核执行的处理单元,和/或使用预期成本将工作负载分配至两个或两个以上的处理单元。此外,所述处理单元当前工作负载和/或数据位置等更多信息可作为参考,以便选择所述处理单元和/或分配工作负载。
运行时段可由编译器创建、合并和/或修改,甚至由编译器优化,且可在运行时实例化并更新。
函数元数据(函数元信息)通常存储在运行时段中。通常,函数元信息与程序段一起存储,且可能由程序段中导出。当段合并、修改和/或优化,以及运行时具体装置功能已知时,所述编译器可以更新并维护信息。
程序代码中的数值运算可对应用于数据结构的简化计算指令集的项目,所述数据结构存储着通用数据类型的多个元素。这可以帮助高效生成和/或执行计算内核和/或函数元信息。
然而,所述程序代码还可以包括不具有编译器可识别数值运算的中间部分。这些中间部分可通过传统方式处理。
所述程序段可先翻译为中间语言,尤其是字节代码语言,或辅助所述处理单元上执行的相应语言,例如使用LLVM(低级虚拟机)或Roslyn等编译系统。
随后(例如在特定异构计算系统启动阶段),所述中间语言可以被编译为可直接执行的计算内核,该计算内核包括字节代码和/或机器指令。
在启动阶段,可确定所述特定异构计算系统合适的处理单元,且可根据确定的处理单元更新运行时段。这可以包括更新计算内核、所述计算内核的中间语言和/或函数元信息。例如,可根据实际装置的属性更新中央处理器内核模板和图形处理器模板。更具体而言,可在模板中更新函数元信息的数值运算系数,和/或在实际处理单元上执行特定数值运算的计算内核的中间语言中,矢量数据类型的长度和/或类型。
此外,所述处理单元可通过相应的计算内核初始化。
初始化后,数据结构运行时实例的所述函数元信息与所述数据元信息用于在运行时确定在相应处理单元上执行计算内核的相应预期成本。
在一个实施例中,可实施延迟执行方案。该方案涉及将潜在耗时的初始化任务延后至首次运行需要初始化结果时。例如,只有相应运行时段确定在相应的处理单元上执行相应计算内核后,该特定处理单元的特定运行时段才可分配至该处理单元并初始化。
通常,所述预期成本的确定参考计算成本和传输成本(指将运行时实例传输至另一处理单元的相关可能成本)。
此外,可使用多项式成本函数确定所述预期成本。
特别地,已发现在多种情况下,双线性成本函数适用于确定所述预期成本。许多简单的数值运算具有的数值工作量(计算成本)仅取决于或基本取决于存储元素的数量,例如分别计算所有元素的函数结果。因此,可将元素数乘以代表所述处理单元并行计算能力的相应数值工作量系数,以计算预期计算成本。相似地,可将待复制的元素数量乘以传输系数(若所述处理单元直接访问存储的元素,则乘以零)以计算预期传输成本,并将预期传输成本加上预期计算成本,以计算在每个合适的处理单元上,在当前环境中,进行相应数值运算的预期(总)成本。
对于更复杂的数值运算,例如求逆矩阵、计算矩阵矢量乘积、求解方程组或确定矩阵(矩阵特征值和特征向量)的特征值和/或特征矢量、计算矩阵的快速傅立叶变换(fft),预期计算成本还可以取决于数值运算的输出大小、输出或值的结构或形状、输入运行时实例的结构和/或形状。例如,可根据输入数据属性(系数矩阵还是密集矩阵、单浮点精度还是双浮点精度、矩阵对称性、大小等等)使用不同的数值算法。如下文详述所示,数值运算输出的相关信息可由编译器从所述程序段的元数据中导出。
这种方法克服了先前使用的运行成本判断方法的限制。
例如,准备好在平台/处理单元上运行的中间语言或二进制/目标代码中,将可执行指令的数量/类型作为“成本”的测量方法尤其存在困难,因为这种方法需要涉及到所述程序段中的程序流程。尤其当所述段包括条件指令时(当涉及循环结构时通常如此),精确的分析至少极为冗长,因此成本高昂。此外,如果这些条件指令的值动态依赖于由程序段处理的输入数据大小,则该分析必须在运行期,当这些数据大小已知时进行。为使效率更高,不同数量的指令加以合并,大多数都设法处理由之获得的动态段大小,因此造成了更多问题。每个合并后的段都必须再次由特定编译器编译以用于每个目标平台,在运行时,这些目标平台必须再次运行。
此外,若需程序段需要运行的实际时间被用于测量“成本”,则代码运行位置的确定需要大量成本。此外,为导出可信的成本模型,可需要大量运行不同大小和/或形状的输入数据。例如,处理单元上的输入数组的维度、每个维度中数组的长度和元素的数据类型必须不同,以便构建用于实际计算的可信成本模型。因此,当将这种方法动态运行于较小的输入数据时,该方法本身是低效的。
所述程序段可进一步配置为接收能够存储通用数据类型或另一数据类型多个元素的第二数据结构。
例如,用于计算矩阵矢量乘积的程序段可配置为接收矩阵和矢量。相似地,用于将两个矩阵相加的程序段可配置为接收两个矩阵。
根据计算机可读介质的一个实施例,所述计算机可读介质包括指令,当包括第一处理单元和第二处理单元的计算机执行这些指令时,这些指令使计算机执行本文中所述的方法。
所述计算机通常为具有两个(例如第一处理单元和第二处理单元)不同处理单元(例如中央处理器和图形处理器,或更多不同处理单元)的异构计算机。通常,不同的处理单元在计算属性和/或功能方面彼此不同,这通常是由不同的物理性质导致的。然而,两个不同的处理单元也可以具有相同的计算属性和/或功能,但在程序段待运行时以不同方式使用(工作负载不同)。
所述计算机可读介质通常是一种非暂时性存储介质。
根据异构计算系统的一个实施例,该异构计算系统包括至少两个不同的处理单元和一个存储程序段运行时段的内存,该程序段配置为接收能够存储通用数据类型多个元素的第一数据结构。所述程序段包括、提供并/或允许(通过编译器)确定函数元信息,该函数元信息包括与程序段数值运算输出大小相关的数据、输出结构和/或生成输出的工作量。所述至少两个不同处理单元中的每一个都能够访问并/或组成了内存的一部分,该内存存储两个处理单元中每一个的运行时段的相应计算内核。每个计算内核均执行数值运算。所述运行时段包括或涉及可执行代码,该可执行代码用于判断第一数据结构运行时实例的数据元信息。该数据元信息包括运行时实例的运行期大小信息、运行期位置信息、运行时同步信息和运行时类型信息中的至少一种。所述运行时段还包括或涉及一种可执行代码,该可执行代码配置为使用函数元信息和数据元信息计算至少两个处理单元中的每一个执行相应计算内核,以通过运行时实例进行数值运算的各自预期成本。该运行时段还包括或涉及一种可执行代码,该可执行代码用于在至少两个不同处理单元中选择其一执行相应计算内核,在所述至少两个处理单元中,所选择的该处理单元的预期成本为所确定的预期成本中的最小值。
运行时段的一个序列可存储在内存中。
用于计算预期成本的可执行代码与用于在至少两个不同处理单元中选择其一的可执行代码可包括在运行时段的控制内核中。
通常,所述异构计算系统包括一种基本处理器,该基本处理器可以组成处理单元,并与至少两个处理单元中的第一处理单元和第二处理单元耦合。该基本处理器通常配置为执行控制函数,尤其是为确定处理单元的属性、确定异构计算系统中适合执行数值运算的处理单元、根据处理单元的确定属性(例如中央处理器核心的数量和/或计算属性、图形处理器的着色器)更新函数元信息、将相应计算内核加载至处理单元、(在运行时)(数值上)确定预期成本、根据所确定的预期成本选择(理想的)处理单元,和/或在所选择的处理单元上开始执行相应内核。
例如,所述基本处理器可托管并执行控制内核。在下文中,所述基本处理器也被称为控制处理器。在其他实施例中,所述处理单元中的一个可执行一个、多个,甚至全部控制函数。所述控制函数还可以在处理单元和基本处理器间分配。例如,所述控制内核可以具有在不同硬件单元上运行的子内核。
此外,即使与异构计算系统(其他)处理单元相较计算能力较低,所述基本处理器可以是处理单元中的一个,并充当相应处理单元中的一个。例如,当存储在(第一)数据结构运行时实例中的元素数相对较低时,所述基本处理器可以执行数值运算。
每个处理单元可由以下组成:单核CPU(中央处理器)、多核CPU、具有矢量扩展的CPU(例如SSE/AVX)、GPU(图形处理器)、集成至少一个GPU的CPU、支持数值运算的协同处理器、SIMD加速器(单指令多数据结构加速器)、微处理器、DSP(数字信号处理器)等微控制器,以及FPGA(现场可编程门阵列),或由通常组成名为虚拟处理器的一个或多个上述装置的结合。
所述异构计算系统通常为包括一种主控制器的异构计算机,该主控制器具有主处理器,通常该主处理器组成了基本处理器。
在一个例子中,所述异构计算机还包括一个中央处理器,以及一个或多个图形处理器,每个图形处理器组成了相应的处理单元。
所述异构计算系统还可以是一个工作站,例如专为技术、医学和/或科学应用与/或数值和/或数组密集型计算而设计的计算机。例如,所述工作站可用于分析测量数据、模拟数据和/或图像,尤其是模拟结果、科学数据、科学图像和/或医学图像。
所述异构计算系统还可以作为具有数个节点的网格计算系统或云计算系统执行,这些节点互相连接,每个节点作为处理单元或嵌入式计算系统使用。
本领域技术人员会在阅读下文的具体实施方式并参阅附图说明后,了解到更多特征和优势。
附图说明
附图中的组件不一定按比例绘制,附图仅着重描述了本发明的原理。此外,在附图中,相同的附图标记用于表示对应相同的部件。在附图中:
根据实施例,图1示出了一种由计算机执行的方法;
根据实施例,图2示出了一种由计算机执行的方法;
根据实施例,图3示出了一种由计算机执行的方法;
根据实施例,图4示出了一种由计算机执行的方法的步骤,和一种异构计算系统;
根据实施例,图5示出了一种由计算机执行的方法的步骤;
根据实施例,图6示出了一种由计算机执行的方法的步骤;
根据实施例,图7示出了一种由计算机执行的方法的步骤;
根据实施例,图8示出了一种由计算机执行的方法的步骤;
根据实施例,图9示出了一种由计算机执行的方法的步骤;以及
根据实施例,图10示出了一种由计算机执行的方法的步骤。
具体实施方式
在以下具体实施方式中,参阅作为本文一部分的附图,附图通过图示的方式阐述了可以实施本发明的具体实施例。因此,“顶部”、“底部”、“前端”、“后端”、“首部”、“尾部”等方向术语均指代所描述图例的方向。实施例的组件可以通过多个不同方向放置,因此,该方向术语只用作举例说明之用途,不对本发明做出限制。应理解,可以使用其他实施例,且可在不脱离本发明保护范围的情况下做出结构性、逻辑性的更改。因此,以下具体实施方式不作限制之用,本发明的保护范围由随附的权利要求而定。
现将详细参考各个实施例,实施例中的一个或多个示例将在附图中阐述。每个示例作解释之用,不意味对本发明做出限制。例如,在一个实施例中阐述或描述的特征可用于其他实施例,也可以和其他实施例结合为另一实施例。本发明中包括这些修改与变化。使用特定语言描述的这些示例不应解释为对所附权利要求保护范围的限制。附图未按比例绘制,仅用于说明之目的。为了清楚起见,相同的元素与制造步骤在不同的附图中用相同的附图标记表示,另有说明除外。
图1解释了一种由计算机执行的方法1000的方法步骤。
在启动阶段II的程序块1300中,异构计算系统的处理单元通过来自(更高级)程序块运行时段的相应计算内核初始化,该程序段配置为接收能够存储通用数据类型多个元素的第一数据结构。这一过程可包括将计算内核复制到相应处理单元的内存或异构计算系统的共享内存中,并/或在相应处理单元上分配计算内核。
每个计算内核可配置为执行来自程序段的数值运算。
运行时段通常包括或可访问函数元信息,该函数元信息包括代表数值运算输出、输出结构与生成输出的工作量大小的数据,或与之相关的数据。
在运行时段III随后的程序块1500中,函数元信息与第一数据结构一个运行时实例的数据元信息用于判断、且通常用于计算执行处理单元上计算内核的相应预期成本。该数据元信息可包括该运行时实例的运行时大小信息、运行时(存储)的位置信息,和/或运行时类型信息。
出于此目的,运行时段控制代码可访问存储在其中一个处理单元或异构计算系统共享内存的数据结构的一个运行时实例。
在运行时段III随后的程序块1600中,该预期成本可用于判断相应计算内核在这些处理单元中的哪一个上执行,以通过运行时实例进行数值运算。
其后,若所选择的处理单元还未访问运行时实例,则该运行时实例可被复制到选中的处理单元中执行。
其后,该计算内核可在所选择的处理单元上执行。
图2阐述了一种由计算机执行的方法2000的方法步骤。方法2000与上文中图1阐述的方法1000相似。
如图2所示,可在启动阶段II前使用编译阶段I,以识别程序代码中的程序段并在程序块2100中为识别出的程序段编译运行时段。
此外,通常在方法2000启动阶段II的程序块2200中判断出合适的处理单元,以执行来自所识别出程序段的数值运算。
在启动阶段II随后的程序块2300中,所选择的处理单元通过运行时段相应计算内核而初始化。
在运行阶段III随后的程序块2400中,判断出第一数据结构的运行时实例的数据元信息。这一过程可包括判断该第一数据结构的维度、该第一数据结构每个维度中的多个存储元素、该第一数据结构中的多个存储元素、元素数据类型、运行时实例的类型信息,且/或包括判断运行时实例的运行时位置信息。
若运行时位置信息存储在第一数据结构的运行时实例上,则后者将更容易。
在数值运算将两个或两个以上数据结构用作输入的实施例中,可在程序块2400中确定全部运行时实例的数据元信息。
在随后的程序块2500中,函数元信息与一个或多个运行时实例的数据元信息被用于确定在处理单元上执行内核的相应预期成本。
在运行阶段III随后的程序块2600中,预期成本可用于选择一个处理单元,该处理单元用于执行相应内核,以便通过一个或多个运行时实例进行数值运算。
其后,可在程序块2700中所选择的处理单元上执行(相应的)计算内核。
如图2中虚线箭头所示,如待执行数个运行时段,则可循环执行程序块2400至程序块2700。
也可选择执行无序执行方案。
图3阐述了一种由计算机执行的方法3000的方法步骤。方法3000与上文中图2阐述的方法2000相似。
方法3000由程序块3110开始,用于在程序代码中识别具有程序段的序列。为此目的,可通过解析器在程序代码中查找数值运算。
在随后的程序块3150中,可创建数个后续运行时段。每个运行时段可配置为接收存储着一个相应通用程序类型的多个元素的一个或多个数据结构,该通用数据类型可彼此相同,也可不同。此外,每个运行时段可包括一个相应的函数元信息,该函数元信息包含数值运算的一个或一个以上输出的大小、结构或形状的相关数据,且/或包含生成一个或一个以上输出的工作量。
在编译阶段I随后的程序块3170中,可将每个程序段转换为中间语言。这一过程可通过编译系统完成。
每个运行时段可包括相应的中间语言与相应的函数元信息,该函数元信息指代将通过一个或一个以上数据结构的运行时实例执行的相应数值运算。
该中间语言也可由序列或相应的程序段创建,或使用通过序列或相应程序块存储的元数据创建,或使用指代序列或相应程序段的元数据创建。
在方法3000启动阶段II随后的程序块3200中,通常判断出合适的处理单元,以执行来自所识别出程序段的数值运算。
在启动阶段II随后的程序块3270中,该中间语言可编译为相应的机器语言(计算内核)。这一过程可使用即时编译器实现,该即时编辑器可专用于可用的相应处理单元,也可以是非专用的,且可以根据可用处理单元的属性而自定义机器语言和/或中间语言。
在启动阶段II随后的程序块3300中,所选择的处理单元通过在程序块3270中形成的相应计算内核而初始化。
在运行阶段III随后的程序块3400中,可确定一个或多个数据结构的一个或多个运行时实例的数据元信息。
在随后的程序块3500中,函数元信息与一个或多个运行时实例的数据元信息可用于确定在处理单元上执行内核的相应预期成本。
在运行阶段III随后的程序块2600中,在程序块3500中确定的预期成本可用于选择一个处理单元,该处理单元用于执行相应内核,以通过一个或多个运行时实例进行数值运算。
其后,可在程序块3700中所选择的处理单元上执行计算内核。
图3阐述的虚线箭头表示,若待执行数个运行时段,则程序块3400至程序块3700可循环执行。
在另一实施例中,程序块3600由一程序块代替,在该程序块中,预期成本用于将执行计算内核与计算内核数值运算的工作量分别分配到至少两个处理单元上,这些处理单元可在程序块3700替代程序块中的运行时实例的相应部分上进行相应的数值运算。
图4阐述了作为异构计算机70执行的异构计算系统示例性组件,以及在计算机算法4000的运行阶段III执行一个序列的典型流程。通常,与上文中图1至图3所示内容相似的编译阶段(I)与启动阶段(II)先于方法4000的运行阶段III。
在示例性实施例中,异构计算机70配备了中央处理器71与图形处理器72,该中央处理器71也组成了主控制器73的主处理器。
复杂用户程序被分为序列,这些序列被分为段。这些段可按从序列中导出的顺序连续排列。
在图4中,只为代表原始序列连续部分的后续运行时段30至34提供附图标记。
在启动阶段(当程序开始运行时),能够处理序列的每个处理单元71、72、73已被初始化,以便处理该序列的全部运行时段30至34。在下文中,这些处理单元也称为装置(分别为装置3、装置2、装置1)。
因此,分别对应序列运行时段30-34的相应计算内核编译并分配至每个装置。内核140到内核144为中央处理器71编译,并分配至中央处理器71。编译后的内核140到144组成了中央处理器上原始序列的可执行代码111。
同样地,相同运行时段的计算内核150到154编译并分配至中央处理器72,并组成了中央处理器72上原始序列的可执行代码112。
此外,代表段代码标量版本的标量计算内核130到134可为每个运行时段而准备。标量计算内核130-134大部分在中央处理器上运行,使用与程序相同的宿主语言。这些标量代码内核130-134组成了中央处理器上原始序列的代码100,但经过改编,通常为标量输入数据和/或顺序处理(通常相对较小的)输入数据结构实例而优化。
运行时段30-34中的每一个可存储经编译并分配后的计算内核130-154的相应引用(每个所选择的装置至少对应一个),这些引用可随时触发装置运行。
在启动阶段结束时,在支持的每个装置中,序列的所有段均可存储一个程序段可执行版本的引用。
在示例性实施例中,每段都能够在负担极低的情况下以三种方式运行其代码:一个标量数据版本(分别用于装置1与主控制器73)、一个用于在中央处理器上运行的数组版本(71与装置2),以及一个用于在图形处理器上运行的版本(72和装置3)。
段30-31中的每一个均可执行控制代码50,该控制代码50用于在运行时切换执行路径,以在准备好的执行路径中选择其一。图4用加粗的虚线箭头阐述了该执行路径。
执行路径的选择结果通常基于多种元素,如数据大小、数据形状、数据位置、段各个执行路径的运算成本、装置属性、装置当前使用情况、与每个装置额外负担有关的启发或测量数据,以及关于数据大小的固定或动态阈值的相关启发。所使用的执行路径的选择结果还取决于先前和/或接连的段,以及与这些段最低运行时间相应的数据位置配置。相关信息还可以通过段的历史使用数据与/或推测处理分析和/或评估而获得。
如上文所述,最佳执行路径可能是最先完成段代码执行的路径,或是在执行过程中能耗最低的路径。这一原理将在下文中详细解释。
当序列的执行按时间方向42通过程序块进行时,该序列的执行路径可在任何准备好的装置中迅速切换。
任何输入数组参数10将提供至每个程序块中,以便执行。
每个数组对象(运行时实例)A可以记录其数据被复制到的位置(装置内存)。当数组A首先在装置71和72上使用时,其数据通常被复制到该装置内存,且数组A的参考20-22通常通过数组A存储。这样一来,当数组A作为输入参数数次使用时,装置间的数据传输可以实现最小化。
当数组被用作装置上程序块的结果存储区时,该装置可在数组中被标记为目前存储该数组的唯一装置。该数组的数组位置列表中清除了该数组可能已复制到的任何其他装置位置。
图5阐述了编译阶段I的进一步流程,该流程可在上文图2和图3中阐述的任何方法中使用。
第一过程中分析了用户程序200。该程序200的序列被识别出,因此可以判断运行时的执行成本。为清楚起见,示例用户程序仅有一个序列210。
序列可包括处理标量数据205的简单指令,甚至由之组成。在这种情况下,编译器可仅基于该指令的可执行代码而派生成本信息。
另外,序列210也可以具有更为复杂的指令,该指令将能够处理更复杂的数值运算并/或能够存储相应通用数据类型多个元素的一个或多个数据结构10。
这些数据结构可以是程序200编写所用语言的用户可用的任何预定义数组数据类型。或者,数据结构可以来自导入到程序中的库、独立模块或外部模块(动态链接库/静态链接库)。该数据结构通常能够存储相同或相似数据类型的多个元素,以及数据结构的随附信息,例如元素数量、数据结构中各个维度的数量和长度(作为数组与直线数组的“形状”)、该语言支持类型的元素类型,以及位置信息(一个或多个存储位置)。
此外,若通用数据结构本身不提供必要信息,则数据结构10可以封装一个更为通用的数据结构,使能够添加关于该通用数据结构的必要信息,并使其可作为通用数据结构10使用。
至少部分用户程序200由在一个或多个数据结构10上进行数值运算的指令组成。这些指令或为编译器已知,或能被编译器自动识别。
这些指令的其中一个示例为技术语言的一组函数集,这些技术语言例如Matlab(The MathWorks Inc.)、numpy(numpy.org)、ILNumerics(ILNumerics GmbH)、Julia(julialang.org)、Fortran、Scilab(scilab.org)、Octave、FreeMat(freemat.sf.net)、和从事于数组数据的Mathematica(Wolfram Research)。这些语言可以提供其自身的编译器与开发基础设施。或者,该语言可能作为另一种语言的领域专用语言扩展(DSL)实现,该另一种语言通常为更为通用的语言(GPL),可能或可能不会全部或部分使用编译器或GPL开发工具。此处,该数据结构10可作为任意大小、任意维度的直线数组实现。其中一些函数采用一个或多个元素数组(多值输入参数)并对参数的多个甚至全部元素执行操作,如map(在元素上执行函数)、sin(计算这些元素的正弦值),以及add(将两个数组元素相加)。其他函数可以基于零个或多个数组或标量输入参数而创建新的数组数据,例如‘zero’(创建一个元素值为零的数组)、‘ones’(创建元素值为1的数组)、‘rand’(创建元素值随机的数组)、‘clone’(创建另一数组的复制数组)。其他典型函数为聚集函数,如“reduce”(在数组的一个维度上执行聚集函数)、‘sum’(对某一维度的元素求和)和‘max’(计算某一维度的最大值)。其他函数可以从数据结构中创建子数组,或进行连接,如‘vertcat’和‘concat’(连接某一维度的数组)。此外,也可以使用更复杂的操作,如‘matmult’(矩阵乘法)、‘linsolve’(解决线性方程组)、‘svd’(奇异值分解)、‘qr’(QR矩阵分解)、“fft”(执行快速傅里叶变换)、‘eig’(特征值/特征向量分解)、‘interpolate’(根据已知离散值内插新值),以及‘fmin’(寻找函数最小值)。
函数可使用附加补充参数,以便控制其内部操作等。一个例子就是函数‘sum(A,1)’,其中,‘1’是一个确定输入数组A维度索引的标量参数,用于对其中包含的元素求和。一些函数会生成与一个或多个输入数组类型、大小相同的单个输出数组。其他函数可以生成多个输出,一些输出参数可大小、类型彼此不同,例如广播二元函数‘add’、‘find’(定位非零元素),以及‘max(A,1,I)’(定位A内维度‘1’中的最大值元素,并给出这些元素的索引)。但其他函数可以从头生成新数组,或通过提取和/或修改一个或多个输入阵列中的部分而生成新数组。后一种函数类别的一个例子就是修改(左侧)子数组的运算符表达式,如A[2;:]=B,其中,B值被分配给A中的相应元素,存储在带有索引‘2’的行中。
同样地,用户程序200中可识别指令的另一个例子即作为FORTRAN、C/C++、Perl、C#、Visual Basic、F#、python、Javascript等语言运行补充的函数集。.NET CLI类System.Math中静态函数成员描述了该示例性函数集中的一种。该函数集包括但不限于以Abs、Acos、Asin、Atan、Atan2、Ceiling、Cos、Cosh开始,以Sin、Sinh、Sqrt、Ta、Tanh、Truncate结束的函数。由于这些函数的标量性质,所描述方法的编译器可检测用户代码中(for,while,goto-loops)的公用语言循环结构模式,以便将数组元素迭代转换为适合根据所描述方法处理为程序段的单个数组函数调用。
所公开方法的一个实施例可以由动态类型语言(例如鸭子类型)执行,例如Python、Julia或MATLAB。但预计若使用C#或Java等静态类型语言执行,将取得更好的运行性能。以静态类型语言执行的实施例与以动态类型语言执行的这些实施例均可用于静态类型程序与动态类型程序两种程序类别。若程序为静态类型,所公开的方法以动态类型语言执行,则程序的数据与函数的类型信息可省略。相应地,如果程序语言为动态类型,所公开的方法以静态类型语言执行,编译器或运行时支持程序执行的运行框架将推断出省略的类型信息。因此,可使用相同的机制,该机制有助于在语言编译器和/或补充原始动态类型程序语言的运行执行框架中确定最终类型(该类型直接用于执行)。或者,编译器可以检查程序代码,并从程序代码表达式(例如常量)、在代码或程序段编译后的二进制表示法或补充材料中发现的标记(属性、类型声明)、编译器可访问的默认类型列表、和/或连续程序段,或其他程序环境中推断出数据结构元素类型和程序段。
指令序列210可由用户创建。编译器可以将序列210的各个指令合并形成已知指令的程序段220-222。该分组(合并)的主要目的即提高运行性能。在这种情况下,如下文所述,程序段220的数字成本可由编译器根据分组到程序段中各个指令的成本函数而自动导出。
或者,程序段220可仅包含一个单个数组指令。
在图5阐述的示例性实施例中,序列210由三个程序段220-222组成。
当用户程序200中的一部分不能够被编译器识别为已知指令时,可以结束当前的程序序列210,并通过下一个可识别指令启动新的程序序列。
在示例性实施例中,序列210由用户程序200中代码的完整程序行组成,且具有两个输入数组A、B,以及一个补充标量输入i:
C=sum(abs(A-B[full,i]))
编译器已知全部指令(求和、求绝对值、求差、子数组),因此单个序列从全部程序行中创建。在这种情况下,生成的序列中包括赋值‘=’。
在其他实施例中,程序块中可以不包含赋值,也可以包含多个赋值。因此,程序段能够包括任意数量的指令、指令行和指令部分。
此外,程序段可包括也可以不包括控制结构和/或循环结构。在任何此类情况下,当编译器识别出受限语言结构之一时,则可创建序列边界。
此外,用户程序200中的标记还可以指示序列或程序段的边界。这些标记可由用户创建或自动创建。例如,预处理器可以分析程序代码200,并通过程序创建并存储标记,以提示后续编译步骤。
作为选择地且/或作为附加地,用户可以编辑、创建、使用和/或存储标记,例如,以语言属性的形式向编译器提供信息,以支持或控制与用户提供的函数或程序相关的所需元数据的识别、切分和/或提取。但编译器可以忽视一些标记,甚至可以忽视全部标记。
将程序200分成序列210,并将序列210分成程序段220-222的过程可涉及创建代表待识别序列的图形数据结构。
树可作为抽象语法树(AST)创建,此时,该树具有识别数据相关性、指令程序流与序列中相应数据所需的一切信息。图形中的信息与随附信息(例如函数元数据)还可以用于判断程序段边界与/或计算程序段成本、程序段参数设置和/或程序段输出大小。
为了在执行阶段实现高效率,编译器通常会最大化并入程序段中的指令数量。这一方法增加了段的复杂程度与工作流,且通过最小化段与段之间的传输负担与中间结果的存储/传输成本,优化了处理单元的使用情况。
例如,编译器可以迭代地组合程序代码中的相邻指令,直到达到某一限制或在新段中继续添加指令被停止。该限制可以由编译器的特定规则(启发)或编译器特定限制而创建,该编译器特定限制与以下有关:新程序段合并运算的复杂度、输入/输出参数的数量和/或类型或结构、编译器逻辑创建/导出所需函数元信息(例如函数大小与函数作用)的能力(该函数元信息作为基于合并指令元信息的段的输入/输出数据结构属性的泛函数),和/或创建代表计算内核中间语言的能力,该计算内核代表来自各个指令的合并数值运算。
另一种通过合并指令确定程序段边界的方法为将已知指令集分为两类,一类指令不会引起与输入参数大小(映射类型指令)有关的输出参数大小变化,另一类指令将会引起与输入参数大小(减少类型指令、子数组与创建数组)有关的至少一个输出参数大小变化。根据实施例,程序段包括至多一个大小变化指令,该大小变化指令包括任何数量的已知映射类型指令,且派生自用户程序代码中大小变化指令的直接相邻部分。
一项有助于判断程序段边界分布的方法将会对技术领域人士尤其有帮助,该方法为在运行时,为每个处理单元限制通过输入/输出数据结构实例判断执行程序块计算内核工作量的复杂程度(成本)。根据实施例,这些工作量由程序段函数元信息派生的泛函数计算,在分段期间编译时,新的指令被添加入程序块中,此时,该函数元信息被创建/采用(详情如下)。当映射类型计算指令添加入程序段时,通常这些工作量函数的复杂程度不会增加。其他类型的指令可能会导致成本函数复杂程度增加,因此在运行时需要的评估工作量则更多。为使程序段处理单元的判断成本保持在较低水平,每当添加的新指令增加了程序块成本评估的复杂程度或工作量时,编译器可以放置一个分段边界。
为定位支持的指令,可在程序或部分程序上执行语义分析。该分析的目标可以是确定指令的类型或其他信息,和/或正在处理的指令的数据。
另外,可在程序200的记号上执行简单的文本匹配。
当程序200不直接提供充足的类型信息时,还可以使用语义分析来推断数据类型。一个示例为动态类型语言或弱类型语言,和/或技术原形开发语言通用结构的集合。
在编译阶段I期间,通常为识别出的每个程序段创建运行时段240。该一个或多个运行时段240通常存储运行时在处理单元(71,72,73)上执行程序段220数值运算所需的全部信息。
在一个实施例中,运行时段240实现为由编译器生成的分类定义249,该分类定义249将在启动阶段II实例化。通常,该分类存储着所支持装置类别(内核241,242,243)数值运算的中间语言、帮助程序块计算内核241-243判断、缓存并加载数组参数的参数适配器245、用于程序块(合并)指令的函数元信息248,和一个装置选择器代码247,该装置选择器代码247包含了在运行时确定处理成本并选择处理单元的运行代码。当执行程序时,该装置选择器247可以作为运行时段240、249的进入点。因此,该装置选择器247可提供一个与程序段220支持数量相同、类型相同的输入与输出参数的功能接口。这使得编译器能够将装置选择器247用作组成程序段220的指令的直接替代。
可以通过修改程序代码200,或修改从用户程序200中导出的编译程序集(可执行二进制),从而进行代码注入,进而实现该替代。
该运行时段的执行可实现为单独的模块、组件、库、远程服务或本地服务。或者,该运行时段代码可被添加至用户程序200中。
在一个实施例中,启动阶段I可以通过将运行时段249实例化为程序中的静态环境变量而执行并触发。启动阶段I期间收集可用处理单元(73,71,72)的有关信息,在每个所支持的处理单元(73,71,72)调整程序段220的中间语言241、242、243,并将计算内核编译并加载至处理单元(73,71,72)中。
另外,上文中所述一些资源的一些初始化步骤可以被延迟至执行期间内这些相应资源首次需要使用的时间段。
如上文所述,可在运行时判断执行各个程序段的成本。与其他方法不同,编译器不试图在编译阶段或在异构计算系统装置(处理单元)上分配程序段之前判断指令的实际成本。相反,所有的装置均配有相似的一个或多个可执行运行运行时段,并在运行时(通常在执行前)确定预期成本。
运行段的预期成本通常由成本函数评估,该成本函数涉及到特定处理单元上指令可执行代码的内在成本,以及处理派生自程序段指令的数值运算的具体数据。
内在段成本可来自程序段中每个单个指令的成本,该程序段使用相应序列210的图片指令。单个指令的成本可以合适的方式合并以代表整个段的内在成本,使得在运行时能够进行高效评估。
这样的代码248可通过运行时段240存储并在运行时使用,以判断执行用于具体输入数据结构10、且编译自程序段220的运行时段的实际成本。
因此,运行时段的计算成本为这些输入参数的函数,且可以以不同方式执行。例如,编译器可以通过数个方式向运行时段提供成本函数,其中一些方式如下文所述。
通常,编译器250会选择一个会在运行时使得执行性能最佳或能耗最低的成本函数执行。该选择通常与运行时需要获得的最少信息对应。
对于多个指令而言,成本函数可根据在输出中生成单个元素C的运算的数量而确定。整体成本可以是单个元素C的成本与因素N相乘的结果,其中,N对应(待)生成的输出元素数,或其某一乘幂,取决于指令的工作量。
对于sin(A)等简单运算而言,N等于输入数组A中元素数。对于对数组A进行排序的指令O(n2)额而言,N等于A中元素(n)的平方。其他指令可以具有更高或更低的工作量,其导致了其他乘幂,包括非整数幂。
单个元素C的计算成本可从查找表或缓存中获取,通过测量来确定,例如在执行指令的具体硬件上测量,或通过分析针对异构计算系统特定处理单元(中央处理器、图形处理器等)进行指令编译而产生的运行时段计算内核而测量。
其他指令可以具有更复杂的成本函数。例如,该成本函数可以不仅由输出结果中的元素数决定,也可以由以下因素决定:维度数和/或至少一个输入参数(例如相应数据结构的一个或多个运行时实例)的结构(例如各个维度的长度)、至少一个输入参数的元素值、其他输入参数及其结构、类型、数值和/或输出参数和/或补充参数及其数值。
成本函数信息也可以从编译器250发出的指令中自动导出。自动成本推导可涉及对函数的分析,且对简单指令尤其有用。编译器250可以使用代码、名字、参数不同数值和/或指令的可执行二进制表达法中的至少一个,以自动导出函数成本。
另外,编译器可以使用与函数有关的适合在运行时评估计算成本的补充元数据。该元数据可以在函数的创建阶段创建。通过同意该元数据的特定集和/或格式,程序200的编程器可以通过自己的函数和/或运算扩展所支持的指令集合。
编译器250还可以知晓预定义的指令集和相关联的成本函数,且/或能够将程序代码中的指令与已知指令的成本函数相匹配。
编译器250可以决定将相应指令的成本函数合并为单独段的成本函数,或通过替代成本函数将成本函数替换为单个或全部合并后的指令,相似地,该替代成本函数代表输入数据结构某一实例的段工作量。
或者,可通过考虑段中全部单个指令的成本函数而执行并/或评估段成本函数。可通过遍历序列图形210中的节点并评估代表指令的每个节点的成本函数而实现这一过程。
此外,编译器250可以应用优化以简化一个或多个成本函数。这些优化可包括直接插入指令成本函数、删除不(显著)提升段成本值的质量/精确性的参数、聚合部分或全部的段中的指令,以及用于在运行时降低评估段成本函数的计算成本的其他方法。例如,若编译器250识别出的程序段中,成本仅取决于输入参数10中的元素数,则维度数和/或输入参数10的结构等其他信息可从结果成本函数中省略。
根据一个实施例,指令信息由元数据属性提供。每个指令均可以提供向编译器查询指令元数据的方式。例如,每个合适的ILNumerics都带有某一属性,该属性支持编译器将函数识别为指令。相应地,属性类型为编译器所知,且可以通过由属性类型执行的公共接口来提供函数的综合元数据。
函数元数据通常包含决定输出数据结构每个生成实例大小与结构的数据,该输出数据结构可以是用于判断指令(数值运算)生成一个输出数据结构实例所花费“工作量”的数组与数据,还包含为某一特定处理单元和/或通用处理单元类型派生内核代码的可选择数据,该处理单元适用于在输入数据结构实例集上进行数值运算。
上述支持函数元数据通常为指令能够生成的每个输出以及框架支持的每种处理单元而单独提供。
例如,用于计算输入数据In0实例元素绝对值或幅值的高级ILNumerics函数abs(In0)由ILAcceleratorMetadata-属性修饰,该属性包含类别ILMetadata_abs001的链接。两者均由ILNumerics框架的绝对值函数作者提供。编译器可以实例化该类别并查询其结构以收集以下信息:abs(In0)指令关于输入数据In0实例生成的输出Out0数据结构的实例的大小信息。可提供个体大小信息,其包括但不限于(1)存储在Out0(Numel(In0))中的全部元素数,(2)用于描述Out0(Numdim(In0))结构的维度数,(3)如表I所示,通常代表段大小矢量或列表的Out0(Size(In0,0)到Size(In0,2))的每个维度的长度(元素数):
Numdim(In0) |
Numel(In0) |
Size(In0,0) |
Size(In0,1) |
Size(In0,2) |
该信息通常依据函数提供,该函数接收输入数据结构In0实例并生成带有作为连续元素存储的大小信息的矢量(大小描述符)。abs(In0)只生成一个输出,因此,示例性ILMetadata_abs001类别仅提供一个单个大小描述符。取决于指令种类,该大小描述符函数可需要更多参数。例如,将两个输入数组元素相加的add(In0,In1)指令需要两个数组参数,这两个数组参数可能为该大小描述符函数需要,也可能不为其需要,可能向其提供也可能不向其提供,可能被其使用也可能不被其使用。
进一步作为abs(In0)指令函数元信息提供的可以是在(通用)中央处理器平台上根据指令的输入数据In0的指令‘工作量’,该工作量与(1)In0中元素数,(2)In0中维度数,(3)In0每个维度的长度各自相关。
该工作量信息可作为正规化数值或常量提供,这些数值或常量组成了浮点或整数值的工作量矢量。该工作量矢量的每个元素与大小描述符元素信息对应,当在二者上运算矢量积(例如计算数量积)时,通常描述指令标准化工作量(例如输入数据结构每个元素的工作量)的工作量信息矢量和与输入数据结构结果值实例对应的大小描述符矢量对应通过输入数据结构实例执行指令的工作量。
相似地,可提供根据(通用)中央处理器上输入数据In0的abs(In0)函数‘工作量’和/或任何其他处理单元。
其他实施例可使用能在运行时提供指令工作量信息的其他方法。这些方法可以比如上文所述的方法更为简单。可根据合适的预计而删去计算中的一些信息或替换一些信息。这些方法也可以更为复杂,涉及相关实体的相同属性和/或其他属性。例如,工作量信息可作为常量,而不是函数提供。或计算可能涉及输入数据结构实例元素的数值和/或类型,处理单元、主控制器和/或其他系统元件的状态信息,以及由输入/输出数据结构实例、函数元信息和/或计算内核提供的更多信息。
函数元信息还可以包括一个在具体中央处理器平台上适用作专用内核函数体的模板的内核代码(计算内核)。该模板通常在稍后,具体处理单元已知后,在程序运行中完成。该模板可包含占位符,该占位符将在稍后被取代,例如在启动阶段被取代为处理单元属性。这些属性可包括处理器数量、核心、缓存大小、缓存行大小、内存大小以及由处理单元、能耗和/或处理单元频率支持的速度、比特率、特征和/或指令集。
同样地,适用作具体图形处理器上专用内核函数体的模板的内核代码(计算内核)和/或主控制器等任何其他处理单元可作为部分函数元信息提供。该模板可具有占位符,该占位符在启动阶段被替代为具体处理单元的属性,如处理器数量、核心数量、缓存大小、缓存线路大小、内存大小以及由处理单元、能耗和/或处理单元频率支持的速度、比特率、功能和/或指令集。
编译器250使用所收集的信息创建一个运行时段。该运行时段可包括与构成用户程序的语言相同的可执行代码。编译器250可以更改程序代码,该更改会使得运行时段,而不是导出段的原始程序部分开始运行。
或者,该编译器可创建与运行系统兼容的可执行代码,且/或修改用户程序200创建的可执行资源,以使得运行时段而不是用户程序200的相应部分在运行时开始运行。
一个运行时段可跨越所识别出的单个指令。在这种情况下,段工作量(如下文所述)与指令工作量对应,段的大小(如下文所述)与指令大小对应。在其他情况下,一个段可以跨越多个指令,且段的大小与工作量从多个指令集的工作量和大小中计算出。段工作量和大小的创建描述如下文所述。
该运行时段可为指令原始意图执行多个运行路径。一个路径在中央处理器上执行运行时段,可能使用构成程序代码的同一运行系统。其他路径可使用低级加速接口,如OpenCL或CUDA或OpenGL等,以在图形处理器或相似的加速装置上执行运行时段。可选择地,为标量或小输入结构提供了捷径。即便此类加载可在第一次执行计算内核时以惰性方式执行,通过将相应的计算内核预加载至相应的处理单元,所有路径迅速完成初始化。
在运行时的一个实施例上,关于能够产生最迅速/最高效结果的路径(装置)使用选择常仅取决于动态运行数据,如数据元信息,尤其是输入数据结构运行时实例的大小、结构和/或值。编译器在编译阶段和/或启动阶段已将所有其他条件信息‘烘焙’到准备好的段工作量中。对在编译或启动阶段已知信息而言尤其如此,且不是运行时动态更改的问题。
通常,每个运行时段根据段大小和段工作量,为执行路径的动态选择执行快速切换。
段工作量与运行时段单个结果计算的相关运算数量有关。若运行时段能够生成多个输出结果,则该运行时段可以存在多个工作量。
段工作量通常作为输入数据实例的大小函数而实现并/或执行。
段工作量可携带在运行时段中执行的指令与从聚合段的指令中累积的指令成本的测量。指令在各个平台上执行的方式可能不同,因此,通常分别从每个支持平台的聚合指令中计算段成本。
根据一个实施例,段工作量作为长度n的段工作量矢量执行,长度n对应多维数组的大小描述,其中n对应系统支持的最大维数加上2。
每个段工作量矢量SEV0、SEV1可以保护以下元素,或由以下元素构成:
-Element#0:以输入维度数为方式的函数工作量。
-Element#1:以输入元素数为方式的工作量。
-...
-Element#2…(n-3):以相应维度长度为方式的工作量。
段工作量矢量元素可以是数字常量或者标量数值函数。编译器可配置为填充并维护段工作量矢量的全部元素,并/或根据段中函数的属性(复杂程度)省略一些元素,从而提升且/或优化性能。
然而,该段工作量矢量的至少一个元素为非零元素。
段的大小对应n维数组的大小描述,且可作为长度(n+2)的段大小矢量执行,其中,n对应系统支持的维度数最大值。
通常,分段大小向量与分段工作量具有相同的长度。
段大小矢量还包括以下元素,或由以下元素组成:
-元素#0:维度数量(n),
-元素#1:元素数量,
-……
-元素#2…(n+1):维度1…n的长度
所述段大小矢量的元素可以是数值常或标量数值函数。通常,这些元素包括输入数据结构实例的标量函数。同样,编译器可以(通常在运行前)决定调整并/或甚至优化段大小矢量,以获得更好的性能。
图6示出了在运行阶段III确定的执行运行时段相应计算内核的预期成本,该运行时段通过用于200x 300元素的数组实例A的函数3+sin(A)执行示例性程序段。示例性实施例中确定了具有两个处理单元,即一个中央处理器(装置0)和一个图形处理器(装置1)的异构计算系统的预期成本。
在运行阶段III与在执行计算内核之一之前,通过计算在每个可用装置上执行相应计算内核的预期成本,选择适合运行所述运行时段的理想处理单元。
首先,可确定段大小矢量SSV和段工作量矢量SEV0、SEV1。在示例性实施例中,段大小矢量SSV根据上文表I执行,且根据所述数组实例A确定。
对于与函数有关的所述段大小矢量SSV的任何元素,评估函数以获得以数字为形式的元素。段输出结果的大小在设备间不发生变化,因此这一过程仅运行一次。下文示出了这一过程的可实现方法。
通常,为每个处理单元(CPU-索引0,GPU-索引1)确定段工作量矢量SEV0、SEV1。可评估任何相关的元素函数(详细信息见下文)。
随后,可通过计算段大小矢量与段工作量矢量的标量乘积,确定每个装置的计算成本。
随后,可根据在数组对象A中存储的所述段大小矢量与当前数据位置信息,将计算成本与将数据传输至每个装置的预期传输成本相加,确定预期(总)成本。
随后,可选择预期成本最低的装置运行。
此外,计算预期成本可可参考更多信息。例如额外的装置属性(缓存大小、中央处理器矢量扩展上单指令多数据结构的通道长度等)、启动数据传输所需成本的相关因素(仅次于实际数据传输成本)、预加载执行内核的触发成本、处理器频率、处理单元的使用情况等。
或者,可基于比上述更少的信息选择运行装置。
在(基于预定义版本的OpenCL)识别出所有适合进行数值运算的装置后,通常在启动时(启动阶段)创建传输成本表TCT。可缓存表TCT,以降低启动成本。
根据实施例,数组数据可存在于任何装置上(不仅限于主机)。为预估所需工作量,以将数据从当前装置复制到其他设备上运行,可根据与从当前设备到另一设备标准化传输成本的相应传输系数来预估传输成本。
所述传输系数可由启动阶段的测量获得,或基于随系统递送的某些启发。
在运行时,可将传输系数与实际数组大小相乘。
此外,在系统运行期间,可基于实际测量数据改进传输系数。这一方法可以帮助参考运行时计算系统的资源状态变化。
根据实施例,使用位置矢量LV。数据结构(数组)的运行时实例可在多个存储位置上共存。通常,这些位置的参考位置矢量由每个数组运算维护。
所述位置矢量LV的长度可对应所支持装置的数量,且在程序运行时,长度通常为常量,但在各个运行和/或计算系统间可能发生变化。
对于所有运行时段,所述位置矢量LV的每个元素通常对应一个(固定的)装置索引0、1。作为处理单元确定过程中的一部分,可在程序启动时分配装置索引。
位置矢量LV的元素值可以对应相应装置上数据缓冲的引用。
如果所述数组数据(当前)在与元素索引对应的装置上可用,所述位置矢量LV的元素可以是非零元素,否则为零元素。
在图6示出的示例性实施例中,所述输入数组A仅如位置矢量LV=(1,0)所示,存在于中央处理器装置(索引0)上,该位置矢量LV=(1,0)为中央处理器存储仅在具有索引0的位置矢量LV元素中的非零元素值(1)。由于数组A不存在于图形处理器内存上,如图6中传输成本矢量TCV1所示,必须考虑数组A每个元素的示例性0.2传输成本,但不必考虑中央处理器传输成本,导致相应的传输成本矢量TCV0由零填充。
对于每个处理单元,可将预期成本确定为具有装置索引index i(i=0,1)的标量乘积SSV*(SEVi+TCVi)。
在示例性实施例中,在中央处理器上执行运行时段的预期成本远高于在图形处理器上执行运行时段的预期成本(前者为90000,而后者仅为16980)。因此,可选择图形处理器运行。
为清楚起见,图6仅示出了数值运算(3+sin(A))运行时的成本确定过程,该数值运算将逐段执行,导致(示例性处理单元)段工作量矢量SEV0、SEV1均只具有一个非零元素(第二个指代取决于存储元素总数的成本)。
图7至图9示出了计算段工作量矢量和段大小矢量的更多实施例,描述了执行运算3+sin(A)的段所附的函数元信息的示例性结果。
为获得良好性能,可优选的是将多个指令集合并为一个合并段。执行合并、提供整体段大小和在运行时可用的段工作量可存在多种选择。这些方法在所支持段的复杂程度,以及其信息的计算成本方面不同。
当编译器在编译阶段开始创建段时,该编译器可以首先识别出如图7右侧所示段的代码树或抽象语法树(AST)。
在示例性实施例中,树相对简单。也支持更为复杂的树。通常,树的每个节点对应程序指令或数据参数(常数、数组)。编译器首先运行遍树的每个节点,并查询所涉及的每条指令的元信息。
在运行遍节点期间,该编译器可以为每个所支持的处理单元类别(例如通用图形处理器、通用中央处理器、中央处理器主机、通用数字信号处理器、标量装置等等)创建
-段工作量矢量,
-段大小矢量,和
-段内核模板
需注意,在此阶段,为各个处理单元类别创建的工作量矢量还未携带具体装置特定的任何信息。相反,各个工作量矢量涉及到在各种处理单元类别上执行并运行指令的各个方法。例如,为高效执行一些指令,一些装置类别需要内核代码也执行循环结构和/或线程管理负担,而其他装置类别则不需要。
所述段大小工作量在各个处理单元上不发生变化,因此,所述段大小工作量必须仅创建一次。
该段的每个输出时隙可分配自身的段大小矢量。取决于AST中处理指令的复杂程度,该段各个输出时隙产生的结果可对应各个计算成本。一些实施例考虑到这些差异,为段的各个输出保留各个工作量矢量。然而,为清楚起见,该描述假定这些段足够简单,以便为段的每次执行一次创建全部输出,因此每个处理单元(类别)的单个工作量矢量能够代表全部输出的实际计算成本。
不改变其输入大小的段中的指令可聚合为单个大小函数。包括不改变输入大小的这些指令的段通常获得一个大小函数矢量,该大小函数矢量反应了分配至输出时隙的相应处理单元的大小描述符。
或者,每个输出时隙的最终段大小可实现为对应所述段语法树的“大小变化节点”树。每个节点大小函数可相应修改其一个或多个输入的大小,并“生成”一个新大小,该新大小作为其母节点大小函数的输入。
上文所述的大小树通常存储在段中,以供后期评估。该大小信息可由编译器调整并/或甚至优化,且/或以专用格式存储,以在运行时使段大小评估更加高效。
例如,段3+sin(A)执行两个指令:Add()和Sin()。Add()是一个二元运算符,它将两个输入数组的元素相加。两个参数之一为标量常数“3”,因此,根据常见维度广播函数规则,由Add()生成的输出大小仅取决于Add()的第二个输入(数组)参数大小。因此,在本文中,Add()被视为不改变大小的指令。
相似地,Sin()计算输入数组中所有元素的正弦。由Sin()生成的输出大小等于输入数组的大小。因此,该段中的两个指令均为不改变大小的指令,且段的大小对应输入大小。
这反应在了图8中,其中,(唯一)输出时隙Out0所创建的段_001的段大小矢量SSV对应(唯一)输入数组参数In0的大小描述符。
许多大小树为单节点数,因为许多段仅执行不改变大小的运算(例如上面的例子)。此外,由于指代相应处理单元PU0至PU2和不改变大小的运算符(见下文)的段工作量矢量SEV0至SEV1的稀疏性,通常运行时仅需要基于输入数组元素总数的标量值评估,即可计算在特定处理单元上段的最终工作量。
然而,对于包含多个改变输入参数大小的求和函数(例如Sum())的这些段而言,必须在运行时根据指令树和相应元数据递归评估。编译器可决定限制相应段的函数的范围,以使段大小评估保持简单。
可通过相似方式创建所述段工作量矢量SEV0至SEV1。在每个特定处理单元类别,编译器分别查询每个指令的元数据。每个指令的工作量可作为标量或标量函数的简单矢量提供。通常,所述段工作量矢量对应计算相应输出单个元素的相应标准化指令工作量。需注意,PU0至PU2各个处理单元执行单个输出元素工作量可不同,例如,其取决于处理单元所支持的不同指令集、处理单元上不同的待执行数值运算,和/或对所需数值元素数据类型或数值精确度的不同支持。
通过加上所涉及的不改变大小指令的工作量矢量,通常将不改变大小的数组指令的工作量数据矢量合并为单个工作量矢量。图8示出的实施例中展示了计算由段3+sin(A)生成的输出单个元素的工作量。两种指令均为不改变大小的指令。因此,输出的每个元素需要计算(固有)正弦函数的一项加法与一项评估。在指令元数据方面,两种运算的工作量可由指令作者提供,或由指令作者提供,并相加以组成段工作量矢量。
通常,计算输出单个元素的工作量与待计算的元素总数相关。在这种情况下,当运行时,系数“单个元素工作量”和“输出元素数”的单个相乘运算能够预估出某一输入数据结构的整体段运行工作量。通常,段工作量矢量是稀疏的,这是因为仅有一个单个元素为非零元素,即对应大小描述符中元素数信息索引的元素。
在图8示出的示例性实施例中,创建一个单个元素的工作量存储在索引1(第二索引值)处的段工作量矢量SEV0至SEV2中,相对应地,数组元素数分别存储在数组大小描述符和SSV中。此处,所存储的值6为将Add()指令的单个元素工作量1与Sin()指令的单个元素工作量5相加所得的和。所述段大小矢量的其他元素为0,这表示在运行时,段工作量仅能够根据输入数据结构中的元素总数而计算。
其他段可执行其他指令,如求和指令Sum()。当段中涉及这类指令时,可根据其他大小信息计算相应指令的工作量,例如维度数或所述输入数据结构各个维度的长度。
对于大小变化指令(例如生成与输入参数大小不同的输出数组的指令),预先聚合指令工作量信息往往是不容易实现的。相反,创建一个单个输出元素的工作量可取决于与输入/输出数据结构实例对应的大小信息,因为这些大小信息在运行时被提供给各个指令。因此,可为这些段创建一个工作量评估树。该工作量评估树的节点存储着后期评估涉及指令的工作量信息。
运行时,可使用该工作量评估树收集用于特定输入数据结构实例集的段工作量矢量。因此,参考所述数据结构实例的具体大小(输入和中间参数大小),可恰当评估该树节点中存储的指令工作量函数与指令大小函数。
通过这种方式,所述工作量评估树能够预测在特定处理单元上,通过基于相关元数据的特定数据结构实例执行段的数值运算所需的工作量,而无需在处理单元上进行实际运算。
通常,由指令作者维护每个装置类别各自的指令工作量矢量。这参考到各个装置可以不同方式执行相同运算,或相同的运算在各个装置类别上造成不同的运行成本。
为提升工作量预算结果的精确度,可进一步参考更多数据,如与内存传输成本和处理单元频率相关的数据。
虽然在编译阶段后,所述段工作量矢量可代表创建单个段的工作量,但可通过参考更多数据而进一步改进所述段工作量矢量。图9示出了根据两个处理单元(一个中央处理器,一个图形处理器)可用核心数量的相关信息采用的段工作量矢量。
在启动阶段(例如在启动时)II,可判断可用处理单元的核心数,预先确定的段工作量矢量SEV0至SEV2相应更新。在示例性实施例中,检测到的用于中央处理器的4个核心允许同时运行4个指令。因此,预先确定的相应段工作量矢量SEV1的元素(值0,6,0,0,0,如图(8))除以4。相应的,所述图形处理器可拥有96个核心,用于图形处理器的段工作量矢量SEV2除以96(或乘以~0.01)。相应的,可在此处更新,也可不在此处更新预先确定的段工作量矢量SEV0(为清楚起见,未在图9中示出),该段工作量矢量SEV0代表在中央处理器上以序列/标量方式运行时段的工作量。
根据实施例,为除数据结构实例大小描述符中的元素数外,创建并/或更新段工作量信息和/或更多和/或其他因素,可参考更多和/或其他数据。例如,可参考内核运行触发成本、中央处理器矢量扩展单元的长度、装置间内存总线传输速率、核心分组信息和/或实际或理想装置使用情况等更多装置特定属性。
还可使用更多大小信息,将工作量信息与为段运行而实例化的实际数据结构关联。例如,可在大小描述符中包括常量系数,或将该常数系数与计算工作量相加。或者,除了上文描述的大小信息外,可使用维度数、元素数、维度长度、这些信息或其他数字的整数或分数幂来描述数据结构实例的大小。可在段工作量评估中使用与所述数据结构实例对运行时段工作量影响相关的任何信息,这些信息包括,例如,所述数据结构元素值、对称信息、数据范围信息、布尔值或描述数据结构其他属性的整数标志。
在编译阶段,通常为每个装置类别创建一个内核模板。这些内核模板用于执行段指令旨在进行的数值运算。
当实际运行单元已知时,可在启动阶段使用这些模板高效执行并调整内核代码。调整的例子包括参考缓存大小、缓存线路长度、单指令多数据结构矢量扩展单元长度、支持特征集、装置支持的精确度、核心的频率与数量等装置信息。可使用这些信息调整所述内核和/或内核模板,以便提升在处理单元上的运行速度。
为使这一方法能够广泛用于数值算法应用,最好使本方法的成本保持尽可能得小。这降低了收支平衡点,更具体而言指的是数组数据实例大小,在这一点之上,在补充装置上运行本方法带来的优势超过了本方法自身带来的成本。
本文描述的方法已在足够小的数量下产生有益效果。以这种方式,例如,相对较小的数组数据也将能够实现并行化。
与其他计算领域一样,内存传输是现代(冯·诺依曼)计算机结构一大主要瓶颈之一。因此,要仔细处理装置间的数据缓冲交换,装置上的内存管理应尤为高效,且所述输入数据结构可支持本发明,且具有如下文所述的设计优势。
在这一方面,如果数组(数据结构实例)追踪其当前存储位置则是有益的,例如数组可存储元素被复制到的装置缓冲位置。这样一来,数组中存储的信息可同时共存于数个装置内存中。所有这些装置都能够在成本负担极小的条件下访问数组。
编译器可针对参数用途而优化段执行,进而决定在所述处理单元上支持内存管理。再次,“用途”指参数寿命和易变性中的至少一项。因此,可将段参数的差别构建入语言中(不同的InArray、OutArray、LocalArray和ReturnArray类型)。利用不变性(只读输入数组)和易变性(自毁返回数组类型)节省了数组副本,并实现了数组存储早期确定性处理——对于在开始时不支持确定对象销毁的语言也是如此。
可根据需要为输入数组参数分配装置缓冲存储器,该装置缓冲存储器获得与数组存储器本身相同的寿命。在缓冲被复制到装置后,缓冲保留在该位置,直到数组被废弃或修改。这种方法使得可能的序列段调用中的数组(缓冲)实现了低廉的再利用。
段输出参数通常使数组的其他全部存储位置无效(废弃/释放),且新缓冲成为数组的唯一存储位置。
释放的缓冲可继续保留在装置中,以待后续重新利用(池化)。
数组数据存储器通常与数组大小描述符分开。这种方法能够在同源数组的子数组间分享(大型)数据存储器,区别于仅通过各个大小描述符(有时成为“视图”)。
数组可仅创建其存储器的延迟副本(“写入时延迟复制”)。
此外,运行时段可在支持它的装置上异步运行。通常,一次一个装置(通常是主机控制器)负责确定运行时段最合适的处理单元,且/或负责将运行时段异步排队至所选择的处理单元。即:控制装置不等待运行时段计算的内核运行完毕,直到本方法进行到下一个运行时段。
图10示出了与多个运行时段异步运行相关的方法步骤与涉及数据结构创建、访问、释放和用数据结构进行计算的指令,所述数据结构能够存储数组对象等通用数据类型的多个元素。
根据实施例,每个所支持的装置的数组对象都存储并保留了两个额外项,即缓冲句柄与同步句柄。
如适用,所述缓冲句柄存储着装置特定内存上数组数据(数据结构实例)缓冲的引用。根据装置类型和/或用于访问装置的接口的不同,所述缓冲句柄的类型可不同。
所述同步句柄可用于为特定装置同步对缓冲存储的访问。
或者,所述同步句柄可以从装置特定接口(例如OpenCL、MPI)中获得,或由主应用代码创建并维护。
在图10示出的示例性实施例中,存在两个处理单元:一个将内存作为托管堆执行的中央处理器主装置(装置0),和一个具有专用图形处理器内存的图形处理器(装置2).
请注意,装置(处理单元)的实际类型可以并不重要,因为所有的装置可通过一个装置通用接口使用。例如,OpenCL可以通过与图形处理器内存相同的方式处理中央处理器内存。相似地,各个共享内存装置可以访问相同的硬件内存。但整体功能是相同的,除了在图10中一些调用并不需要,这些调用可出于性能原因而省略。
相似地,可选择分配至装置的位置索引。虽然在图10中,中央处理器被分配了索引0,图形处理器被分配了索引2,在所支持装置集中的(装置)位置索引可不同,而不影响该方案。
在启动期间(启动阶段),识别出所支持的装置,并通常为每个装置分配一个固定索引。在整个程序运行期间,该索引用于定位位置数组中的装置位置。
还需注意,图中仅示出了装置0和装置2的位置时隙。为清楚起见,省略了系统上其他装置相应的其他时隙。
图10关注内存管理与同步方面,示出了用于为输入数组A异步计算以下数组指令的处理示意图:
[1]{
[2]ILArray<double>A=rand(1000,2000);
[3]…
[4]B=Abs(Sin(A*A));
[5]var c=A.GetArrayForRead();
[6]…
[7]}
行[1]和行[1]建立了一个代码块,该代码块与数组A的寿命范围有关。数组作用域使数组存储器能够进行确定性销毁、释放和重新使用,因此被包括在下列考虑中。在大多数情况下,这种方法通过垃圾收集器(GC)预计优于非确定性内存管理,因为它能够以及时、确定的方式释放并重新利用内存,并降低垃圾收集器的负担和相关成本。此外,显式作用域通过允许主机以单线程模式工作而简化了内存管理,简化了原本由锁定或其他同步方法引入的同步成本负担。由于一些垃圾处理器的多线程、不确定性目标销毁和/或终结,一些垃圾收集器的执行可能会干扰此处。在本说明书中,假定所使用的语言能够为其对象分别提供作用域与寿命信息。
当数组A不再处于当前程序块的作用域时,该数组A被视为待废弃。
在行[2]中,该数组A在主控制器上被创建为具有示例性1000行和2000列的矩阵,该1000行和2000列被随机数字填充。编译器可将该数组指令识别为(单个指令)段,且在运行时,可决定该数组指令计算图形处理器(装置2)上的随机数字。
此时,还未为大型矩阵A的元素分配图形处理器内存。相反,图形处理器装置被指示在其专用装置内存上为矩阵A分配内存。该指令异步进行:主机不等待装置实际创建缓冲,而是接收来自装置的同步句柄,该句柄用于在稍后识别异步运算。当所述主控制器立即继续后续运算时,所述同步句柄将用于之后在装置上访问缓冲的全部操作。这些访问操作将在所述同步句柄上等待切换到“就绪状态”,再访问缓冲。所述同步句柄存储在所述数组存储位置的相应装置时隙中。
所述同步句柄可以是一个简单的共享、原子(通用或主要)计数器。或者,所述同步句柄也可以是由主框架支持,且/或由操作系统或其他相关的系统运行层支持的更为复杂的同步对象。
此外,可提供所述缓冲的指针,该指针可存储在与图形处理器装置对应的数组A的相同装置时隙中。所述缓冲句柄用于在装置上访问实际存储器,其类型可取决于用于访问/与设备接口的技术(例如OpenCL、MPI、OpenMP)。所述缓冲句柄可与提供所述同步句柄的相同调用提供,或由使用所述同步句柄从所述装置中查询缓冲指针的后期调用提供。或者,所述缓冲可以以同步方式一起创建。
在缓冲建立后(即便未知缓冲是否已建立完成),即触发所选择的计算内核开始运行。如用于访问所述处理单元的低级接口所提供的,该触发可通过在指令队列上排队一个相应的指令,或通过相似的方法而执行。
所述同步句柄与缓冲句柄均提供给内核。再次,所述调用异步执行。该调用在返回时,无需等待与其自身相关的任何(潜在耗时)操作完成。如果最后一次操作未完成,所述缓冲还不可访问,则所述计算内核在所述同步句柄上等待。该等待和任何潜在高昂且/或耗时的计算内核中的计算在不延迟主控制器线程的情况下运行。
触发计算内核异步运行的所述调用向主机提供了第二同步句柄。所述第二同步句柄用于识别随后的内核运算。需注意两个异步运算是如何链接的:所述内核运算等待创建缓冲。因此,在所有先前的指令完成后,所返回的所述第二同步句柄适用于识别所述装置缓冲的就绪状态。因此,通过取代第一同步句柄而存储第二同步句柄已足够——此时的程序中已不再需要该第一同步句柄。
在其他实施例中,所述同步句柄可以是不可链接的。每个运算可需要生成新句柄。同步可在没有低级装置接口支持的情况下进行。在这些实施例中,为存储并管理与上述指令相关的同步信息,可能需要执行队列或与队列类似的数据结构。随后,每个装置同步句柄的单个存储时隙可作为队列或其他集合的引用。但在该情况下,预计将产生更高的管理成本。
在触发rand(1000,2000)(图10中的段_001)计算后,所述主机存储将由调用返回的所述同步句柄存储在装置2的数组存储位置时隙中,并立即继续进行后续运算。在该存储位置时隙中的所述同步句柄通知数组其他用户,使用所述数组存储器的一项运算仍在进行。可必须考虑同步句柄的运算包括作为输出缓冲访问所述缓冲(即通过内核修改所述缓冲),并释放所述缓冲。
根据上述代码列表的行[4],后续运算涉及到相同数组A。当所述主机指令计数器到达相应段时(让我们假定该段为段_042),段_001的完成状态还未确定。
因此,所述主机通过提供存储在装置2数组位置时隙的缓冲句柄与同步句柄,将新段运行与先前的运行同步。所述内核立即返回一个新的同步句柄,并在开始运行之前等待该同步句柄(如有)的提供。须注意,所述同步句柄通常是可选的。整个方法或各个装置的任意组合也可以同步运行,或执行同步过程中的其他方法。还需注意,为清楚起见,段_0042的输出在此处省略。
根据上述代码列表的行[5],后续运算需要一个本地主机数组,该本地主机数组将数组元素表示为1D系统数组对象。A的目前数据仅存在于图形处理器装置2上,因此,A的元素需要复制到主机装置0中。该复制过程也是异步执行的。该复制指令立即向装置0返回一个新的同步句柄——这次对应于装置0上的新缓冲。与上述创建的数据缓冲相似,一个新的缓冲可立即返回,或在随后要求/存储。或者,可在显式缓冲创建指令之前进行数据的复制。
需注意,所述缓冲句柄仅从装置2上读取。因为装置2上的缓冲未进行任何修改,在此步骤中,装置位置2无需新的同步句柄。
假定下列一个或多个指令在主机上执行,并访问由A.GetArrayForRead()返回的系统数组。因此,要保证所有元素都已复制到所述装置0缓冲中。
为此目的,可引入一个内存屏障,该内存屏障允许通过所述装置存储位置0中的同步句柄,等待复制运算完成。该内存屏障以常用同步方法中得到的相同方式工作,且可用于同步等待任何装置完成运算。例如,在当尝试释放缓冲时,可使用相似的等待机制。
最终,数组A脱离当前代码块的作用域。由于在后续运算中不再引用A,可立即废弃与A相关的存储位置,以释放在(有限)装置内存上消耗的内存区域。这些废弃操作考虑到了任何同步句柄的存在。该方法可在释放内存前,使用隐式内存屏障(如图10示出的WaitSynchHandle()方法)。或者,如果装置接口支持异步释放操作,可以使用异步释放操作。
注意该方法可执行,也可以不执行数组对象与装置缓冲间的1:1关系。大多数高效的内存管理可能希望允许多个数组使用/参考相同的缓冲存储器,例如在“写入时延迟复制”方法中。因此,废弃一个数组可以不立即造成其缓冲的释放。相反,引用计数可用于递减共享存储对象的引用计数器。一旦引用计数器显示不存在引用该存储器的其他数组,缓存就会释放。
异步运行可帮助异构计算系统装置保持繁忙,并更高效地使用现有的计算资源,因此能够提前完成序列运行,或能耗更低。
当排队运行时段以在装置上运行时,(无论如何)计算该段成本的测量。这种方法还能够表示队列中“等待”的指令数。当前在队列中“等待”执行的所有段的累积测给出了该装置队列中“提前”操作的指示。
因此,还可参考,每一项均可对应项中(数值运算)的各自数量。
对“最优”设备的选择结果也可基于该“提前”成本。当装置队列中具有许多段时,最好将数据缓冲副本的成本投入到另一个装置上,并在另一个装置上运行/排队该段。
此外,低级接口(例如OpenCL)可配置为以任何顺序执行运行时段。如果该低级接口或高级接口管理层判断,不同的顺序在性能或其他方面要优于段的原始排列顺序,且改变顺序不对序列结果造成负面的副作用,则该低级接口或高级接口管理层可重新排列运行顺序。
重新排列运行顺序甚至可以允许在多个装置上同时执行一些运行时段。例如,重新排列段的序列可以将这些取决于彼此结果的段分组在一起,也可以将需要相同或大体相同参数/数据缓冲的段分组在一起。分组还可以基于数据缓冲的当前位置。这些方式均可以增加这些段组同时在不同装置上高效运行的机会。例如,第一组重新排列的运行时段可在第一装置上异步执行,而构成第二组的后续运行时段可在第二装置上排队,以待同步执行。由于这些组的数据依赖性较低,两个运行时段组均可以以低同步工作量执行。
因此,该方法能够使许多,甚至是全部装置保持繁忙到有益的程度。因此,计算资源实现了更好利用。
根据实施例,一种由计算机执行的方法包括识别程序代码中的程序段,通常是程序段序列。所述程序段包括一种用于第一数据结构的计算指令(通常是一种数值运算),该第一数据结构能够存储第一通用数据类型的多个元素和函数元信息,该函数元信息包括与计算指令输出有关的数据。确定计算系统适合执行程序段相应编译语言的第一处理单元和第二处理单元(通常是一个计算内核)。所述第一处理单元与所述第二处理单元不同。所述第一处理单元通过所述程序段的第一编译语言初始化,而所述第二单元通过所述程序段的第二编译语言而初始化。所述函数元信息和一种数据元信息用于判断在第一处理单元上执行第一编译语言的第一预期成本,以及在第二处理单元上执行第二编译语言的第二预期成本。所述第一预期成本与所述第二预期成本用于选择第一处理单元或第二处理单元来执行相应的编译语言,通常选择预期成本较低的处理单元。通常在数值上判断(在数值上计算)第一预期成本和第二预期成本。
或者,所述第一预期成本和所述第二预期成本可用于在所述第一处理单元和所述第二处理单元中选择其一以执行相应的编译语言,或判断在所述第一处理单元和所述第二处理单元上执行相应编译语言的相应工作量份额。
如果计算指令适用于执行部分所述运行时实例,则可调用工作量分担。这种方法尤其用于计算指令可逐个元素地执行,或在数据单独区域执行的情况。例如相加矩阵、计算sin(A)等矩阵函数、修匀数据等数值运算。
数据分担通常通过将运行时实例的第一部分分配至第一处理单元,并将运行时实例的第二部分分配至第二处理单元来实现。工作量可根据预期成本分担,例如与预期成本和/或预期运行时间成反比。所述预期运行时间可导出自所述预期成本与处理单元的实际可用性或工作量。
通常,如果运行时实例的运行大小足够大,或发现或预计系统上可用的至少一个处理单元与其他处理单元相较利用率低,则分担工作量。在后一种情况中,运行时段、运行时的编译器或调度模块可决定与利用率更高的一个或多个装置共享未充分利用的一个或多个处理单元,以便将一个或多个繁忙装置中的工作量分配至一个或多个未充分利用的装置。
共享装置可构成“虚拟装置”,且在处理单元异步运行和乱序运行不可用时尤为有用。这种情况在下列条件下可出现:当处理处理单元访问的底层低级接口不支持该特征,且/或指令依赖性过强,导致重新排序指令/段和/或在多个装置间分配段不可能或不可行。
此外,当数据结构实例跨越多个装置内存(分布式内存)时,根据本发明,虚拟装置能够使涉及通过这些分布实例运行程序段的装置可用。因此,该虚拟装置被视为处理单元,且如上述处理。
另一个虚拟装置在运行程序段方面具有优势的情景就是共享内存设备,例如与图形处理器装置分享内存的中央处理器。此处,相比与底层单独装置,包括中央处理器全部或部分核心以及图形处理器全部或部分核心的虚拟装置可表现出更高的计算能力。(由于共享内存的原因)因为不涉及到传输成本,将底层装置之一替换为虚拟装置将实现更加优良的运行性能。
根据实施例,计算机可读介质存储指令,当计算机执行这些指令时,这些指令可以使计算机执行上述方法,和/或至少部分执行为API(应用程序界面)的以下处理中的至少一个:检索软件代码(通常是以GPL,或MATLAB或NumPy等科学计算语言编写的用户代码);在软件代码中识别出包含数值运算的程序段,该数值运算用于第一数据结构,该第一数据结构能够存储通用数据类型中的多个元素;判断指代数值运算输出的函数元信息,尤其是输出大小、输出结构和/或生成输出的工作量;判断适合执行数值运算的计算机或另一异构计算系统的处理单元;将程序段编译为中间语言,尤其是字节代码语言,或可在计算机或其他异构计算系统(尤其是程序段的运行时段)上执行的语言。
通常,所述运行时段包括函数元信息、用于每个所判断的处理单元的计算内核,以及使用函数元数据和第一数据结构运行时实例的数据元信息,用于判断通过第一数据结构运行时实例执行计算内核的预期成本的可执行代码。所述数据元信息可包括所述运行时实例的运行期大小信息、运行期位置信息和运行时类型信息。
所述函数元信息的确定可包括:若函数元信息存储在软件代码中,读取函数元信息;在存储函数元信息的查找表中查找(已经)已知的数值运算,如加法、正弦、FFT(快速傅里叶变换)等;和/或基于测试运行导出函数元信息。
根据由计算机执行的方法的实施例,该方法包括初始化具有第一计算内核的异构计算系统第一处理单元,以及具有第二计算内核的异构计算系统第二处理单元。所述第一计算内核和第二计算内核和第二计算内核均配置为执行导出自程序段的数值运算,该程序段配置为接收存储着通用数据结构多个元素的第一数据结构。所述程序段包括函数元信息,该函数元信息包括与数值运算输出大小、输出结构和/或生成输出的工作量有关的数据。所述函数元信息和所述第一数据结构运行时实例的数据元信息用于判断在第一处理单元上执行第一内核,以通过所述运行时实例进行数值运算的第一预期成本,以及在第二处理单元上执行第二内核,以通过所述运行时实例进行数值运算的第二预期成本。所述数据元信息包括所述运行时实例的运行期大小信息、运行期位置信息、运行时同步信息和运行时类型信息中的至少一项。该方法还包括以下至少一项:如果第一预期成本小于或等于第一预期成本,则在第一处理单元上执行第一计算内核,以在运行时实例上执行数值运算;若第一预期成本高于第二预期成本,则在第二处理单元上执行第二计算内核,以在运行时实例上执行数值运算。
根据由计算机执行的方法的实施例,该方法包括初始化包括第一处理单元和第二处理单元的异构计算系统,其中,运行时段用于执行数值运算,第一数据结构存储通用数据类型的多个元素。所述运行时段包括第一计算内核、第二计算内核和函数元信息,该第一计算内核配置为在第一处理单元上执行数值运算,该第二计算内核配置为在第二处理单元上执行数值运算,该函数元信息包括第一数值工作量和第二数值工作量,其中,第一数值工作量用于在第一处理单元上通过通用数据类型的一个元素执行数值运算,第二数值工作量用于在第二处理单元上通过通用数据类型的一个元素执行数值运算。异构计算系统中创建了所述第一数据结构的一个运行时实例。判断了所述运行时实例的数据元信息。所述数据元信息包括所述运行时实例的运行期大小信息和运行期位置信息。所述数据元信息和所述函数元信息用于(数值上)计算在第一处理单元上执行第一计算内核,以通过运行时实例执行数值运算的第一预期成本,以及在第二处理单元上执行第二计算内核,以通过运行时实例执行数值运算的第二预期成本。若第一预期成本小于或等于第二预期成本,则第一计算内核在第一处理单元上执行,通过运行时实例进行数值运算。否则,第二计算内核在第二处理单元上执行,通过运行时实例进行数值运算。
所述函数元信息还可包括与数值运算输出大小相关的数据,和/或与输出结构相关的数据。
在计算第一预期成本和第二预期成本前,通常根据所述第一处理单元和所述第二处理单元的确定属性更新函数元信息,尤其是所述第一数值工作量和所述第二数值工作量。
此外,在计算第一预期成本和第二预期成本前,可根据所述第一处理单元和所述第二处理单元的确定属性分别更新所述第一计算内核和/或所述第二计算内核。
所述运行时段通常包括控制代码,该控制代码用于计算第一成本和第二成本,并/或根据该第一成本和第二成本动态决定在哪一处理单元上运行相应的计算内核。
所述运行时段可由定义数值运算的程序段中导出。
尽管公开了本发明的各种示例性实施例,但对本技术领域内人员显而易见,可在不脱离本发明原理和范围的情况下做出各种更改和修改,以实现本发明的一些有益效果。对于本技术领域内人员显而易见的是,可适当替换具有相同功能的其他组件。应提到,参考某一特定附图所解释的特征可与其他附图的特征相结合,即使在没有明确提及的情况下也是如此。随附权利要求的保护范围应包括对本发明构思的这些修改内容。
在本文中使用的“具有”、“包含”、“包括”等类似术语为开放式术语,其表示所声明的元素或特征的存在,但不排除额外的元素或特征。冠词“一”、“该”旨在包括复数和单数,文中另有明确指出除外。
考虑到上述变化和应用的范围,应理解,本发明不受前述具体实施方式的限制,也不受附图说明的限制。本发明仅由以下权利要求书和具有同等法律效力的文书所限制。
Claims (19)
1.一种由计算机执行的方法,其特征在于包括:
-初始化异构计算机系统的第一处理单元(71)与其第一计算内核(140-144),以及异构计算机系统的第二处理单元(72)与其第二计算内核(150-154),其中,所述第一计算内核(140-144)与所述第二计算内核(150-154)均配置为执行来自程序段(220)的数值运算,所述程序段(220)配置为接收存储通用数据类型的多个元素的第一数据结构(A),且包含一个函数元信息,所述函数元信息包含与生成数值运算的输出值的数值工作量相关的数据,和至少以下之一:与输出值大小相关的数据和与输出结构相关的数据;
-使用所述函数元信息与所述第一数据结构(A)运行时实例(A1)的数据元信息,数值上计算在所述第一处理单元(71)执行所述第一计算内核(140-144)以通过所述运行时实例(A1)进行数值运算的第一预期成本,并数值上计算在所述第二处理单元(72)执行所述第二计算内核(150-154)以通过所述运行时实例(A1)进行数值运算的第二预期成本,其中,所述数据元信息包括所述运行时实例(A1)的运行期大小信息与运行期位置信息;和
以下其一:
-若第一预期成本少于或等于第二预期成本,则在所述第一处理单元(71)执行所述第一计算内核(140-144),在所述运行时实例(A1)上进行数值运算;
-若第一预期成本大于第二预期成本,则在所述第二处理单元(72)执行所述第二计算内核(150-154),在所述运行时实例(A1)上进行数值运算。
2.如权利要求1所述方法,其特征在于,所述程序段(220)还配置为接收能够存储所述通用数据类型或另外的通用数据类型的多个元素的第二数据结构;所述第二数据结构运行时实例的数据元信息用于计算第一预期成本与第二预期成本的数值,所述第二数据结构运行时实例的数据元信息包括所述第二数据结构运行时实例的运行期大小信息与运行期位置信息。
3.如权利要求1或2所述方法,其特征在于,所述数据元信息还包括所述运行时实例(A1)的运行时同步信息,和/或所述运行时实例(A1)的运行时类型信息。
4.如权利要求2所述方法,其特征在于,所述第一数据结构(A)及其运行时实例(A1)、所述第二数据结构及其运行时实例中的至少一项能够存储所述通用数据类型的数量可变的元素;所述第一数据结构(A)及其运行时实例(A1)、所述第二数据结构及其运行时实例中的至少一项能够存储和/或包括集合、矢量、数组、列表、队列、堆栈、图形、树、n维直线数据结构中的至少一项,其中,所述第一数据结构(A)的运行时实例与所述第二数据结构的运行时实例中的至少一项包括一张图像,其中,所述第一数据结构(A)的运行时实例(A1)与所述第二数据结构的运行时实例中的至少一项包括测量数据,其中,数值运算为阵列运算,和/或其中所述第一计算内核(140-144)与所述第二计算内核(150-154)均配置为执行来自程序段(220)的数值阵列运算,所述程序段(220)包括用于每个数值阵列运算的分别的函数元信息。
5.如权利要求2所述方法,其特征在于,所述第一数据结构(A)及其运行时实例(A1)与所述第二数据结构及其运行时实例中的至少一项能够存储相应的运行期元信息;和/或,运行期元信息包括运行期大小信息、运行期位置信息、运行时同步信息,和/或运行时类型信息。
6.如权利要求1或2所述的方法,其特征在于,多项式成本函数用于计算第一预期成本与第二预期成本,其中,所述第一预期成本与所述第二预期成本的计算包括确定计算成本与传输成本中的至少一项;和/或,其中,在运行期间和/或初始化所述第一处理单元(71)与所述第二处理单元(72)后,计算第一预期成本与第二预期成本。
7.如权利要求6所述的方法,其特征在于,生成输出值的数值工作量用于计算第一预期成本与第二预期成本,其中,生成输出值的数值工作量包含在所述第一处理单元(71)上通过通用数据类型的一个元素执行第一次数值运算,并在所述第二处理单元(72)上通过通用数据类型的一个元素执行第二次数值运算,其中,根据所述第一处理单元(71)的所确定的属性更新第一次数值运算,和/或其中,根据所述第二处理单元(72)的所确定的属性更新第二次数值运算。
8.如权利要求1或2所述方法,其特征在于,还包括在初始化所述第一处理单元(71)与所述第二处理单元(72)前,在异构计算系统运行控制内核,其中,控制内核配置为确定所述第一处理单元(71)与所述第二处理单元的(72)属性,根据所述第一处理单元(71)与所述第二处理单元(72)的所确定的属性更新函数元信息、计算第一预期成本与第二预期成本,并根据第一预期成本与第二预期成本选择所述第一处理单元(71)或所述第二处理单元(72)以运行所述计算内核,并/或在所选择的处理单元(71,72)运行相应计算内核。
9.如权利要求2所述方法,其特征在于,还包括以下至少一项:
-确定所述第一处理单元(71)和/或所述第二处理单元(72)的属性;
-根据所述第一处理单元(71)的所确定的属性和/或所述第二处理单元的所确定的属性分别更新相应的函数元信息;
-确定所述第一处理单元(71)及所述第二处理单元(72)适合执行数值运算;
-在运行期间及计算第一预期成本与第二预期成本之前,确定所述第一数据结构的至少一个维度与所述第一数据结构中的多个存储的元素;且
-在运行期间与计算第一预期成本与第二预期成本之前,确定所述第二数据结构运行时实例的至少一个维度与所述第二数据结构运行时实例的多个存储元素。
10.如权利要求2所述方法,其特征在于,还包括:
-通过另外的第一计算内核(140-144)初始化第一处理单元(71),并用另外的第二计算内核(150-154)初始化第二处理单元(72),其中,所述另外的第一计算内核(140-144)与另外的第二计算内核(150-154)均配置为执行来自后续程序段(221)的另外的数值运算,该后续程序段配置为接收所述第一数据结构(A)或另外的数据结构,该另外的数据结构存储通用数据类型或另外的通用数据类型的多个元素,并代表数值运算的输出值,其中,所述后续程序段(221)包括另外的函数元信息,该另外的函数元信息包括与生成另外的数值运算的输出值的数值工作量相关的数据,和至少以下之一:与输出值大小相关的数据和与相关的数据输出结构相关的数据;和/或
-使用该另外的函数元信息,以及该另外的数据结构的另外的运行时实例的至少一个数据元信息,和所述第一数据结构(A)运行时实例(A1)数据元信息,计算在该第一处理单元(71)上执行所述另外的第一计算内核(140-144),以通过所述运行时实例(A1)或另外的运行时实例进一步进行数值运算的另外的预期成本,并计算在所述第二处理单元(72)上执行所述第二计算内核(150-154),以通过所述运行时实例(A1)和/或所述另外的运行时实例进一步进行数值运算的第二预期成本,其中,所述另外的运行时实例的数据元信息包括所述另外的运行时实例的运行期大小信息和/或所述另外的运行时实例的运行期位置信息。
11.如权利要求10所述方法,其特征在于,数值运算为用于所述第一数据结构(A)和/或所述第二数据结构的精简计算指令集中的指令,且/或其中,另外的数值运算为用于所述第一数据结构(A)和/或所述另外的数据结构的精简计算指令集中的指令。
12.如权利要求10所述方法,其特征在于,还包括以下至少一项:
-在程序代码中识别出所述程序段(220);
-在程序代码中识别出所述后续程序段(221);
-从所述程序段(220)创建运行时段,该运行时段包括所述第一计算内核(142),所述第二计算内核(152)和所述函数元信息;
-从所述后续程序段(221)创建一个后续运行时段,该后续运行时段包括所述另外的第一计算内核,所述另外的第二计算内核(152),以及所述另外的函数元信息;
-将相应的所述程序段(220,221)编译为中间语言或相应协助所述第一处理单元(71)与所述第二处理单元(72)运行的语言;
-根据所述第一处理单元(71)的所确定的属性和/或所述第二处理单元(72)属性,更新相应运行时段;以及
-将中间语言、字节码以及协助所述第一处理单元(71)与所述第二处理单元(72)运行的语言中的至少一项编译为相应的计算内核(130-134,140-144,150-154)。
13.如权利要求12所述方法,其特征在于,还包括:
将相应的所述程序段(220,221)编译为字节码。
14.如权利要求8所述的方法,其特征在于,所述程序段(220)至少编译为下述语言中的一种:协助所述异构计算系统的主处理机(73)运行的语言、协助所述异构计算系统单核中央处理器运行的语言、协助所述异构计算系统多核心中央处理器运行的语言、协助所述异构计算系统中央处理器矢量扩展运行的语言、协助所述异构计算系统图形处理器运行的语言、协助所述异构计算系统单指令多数据流加速器运行的语言、协助所述异构计算系统数字信号处理器运行的语言、协助所述异构计算系统微处理器运行的语言、协助所述异构计算系统单片机运行的语言、协助所属异构计算系统虚拟设备运行的语言,以及协助所述异构计算系统现场可编程逻辑门阵(FPGA)运行的语言。
15.如权利要求2所述的方法,其特征在于,还包括以下至少一项:
-在程序代码中识别序列(210),该序列包括数个程序段(220-222),每个程序段均配置为接收所述第一数据结构(A)和/或存储着所述通用数据类型或另外的通用数据类型的多个元素的第二数据结构(B),还包括函数元信息,该函数元信息包括数值运算输出值大小、输出结构、和/或生成输出值的数值工作量相关数据;
-在每个所述程序段(220-222)中创建一个相应的运行时段(30-34),每个所述运行时段(30-34)均包括一个相应的第一计算内核、一个相应的第二计算内核与相应的函数元信息,该函数元信息与所述第一数据结构(A)运行时实例和/或所述第二数据结构运行时实例各自的数值运算有关;
-计算执行每个运行时段(30-34)的第一计算内核与第二计算内核各自的第一预期成本与第二预期成本;且
-根据相应的第一预期成本与第二预期成本,判断在所述第一处理单元(71)还是所述第二处理单元(72)执行相应的计算内核。
16.一种计算机可读介质,其特征在于,当包含第一处理单元(71)与第二处理单元(72)的计算机运行所述可读介质时,该计算机可读介质使计算机执行如上述任意一项权利要求所述的方法。
17.一种异构计算系统,其特征在于,包括:
-一种存储程序段运行时段(30-34)的存储器,所述程序段配置为接收第一数据结构(A),该第一数据结构(A)能够存储通用数据类型的多个元素,所述程序段包含函数元信息,该函数元信息包含与生成数值运算的输出值的数值工作量相关的数据,和至少以下之一:与所述输出值大小相关的数据和与输出结构相关的数据;和
-至少两个不同的处理单元(71,72),
-其中,至少两个不同处理单元(71,72)中的每一个均可访问且/或作为一部分组成了存储着所述运行时段(30-34)相应计算内核的存储器,每一个计算内核均执行数值运算,
其中,所述运行时段(30-34)包含用于判断所述第一数据结构(A)一个运行时实例(A1)的数据元信息的可执行代码,所述数据元信息包括所述运行时实例(A1)的运行期大小信息与运行期位置信息;
其中,所述运行时段(30-34)包括使用函数元信息与数据元信息的可执行代码,该可执行代码用于计算在至少两个不同处理单元中,每一个处理单元执行相应计算内核(130-134,140-144,150-154),通过运行时实例(A1)完成数值运算的相应预期成本,且
其中,所述运行时段(30-34)包括可执行代码,该可执行代码用于在至少两个不同的处理单元中选择其一,以运行相应的计算内核,并根据计算出的预期成本最小值,在至少两个处理单元中选择预期成本最小的一个处理单元。
18.如权利要求17所述的异构计算系统,其特征在于,所述异构计算系统包括基本处理器,该基本处理器与所述至少两个不同处理单元(71,72)耦合,其中,所述基本处理器配置为将所述相应计算内核加载到所述至少两个处理单元中的至少一个处理单元(71,72),其中,异构计算系统为异构计算机,其中,基本处理器为所述异构计算机主机控制器的主处理器,其中,基本处理器组成了所述至少两个处理单元中其中一个处理单元,其中,所述至少两个不同处理单元中的至少一个处理单元选自单核中央处理器、多核心中央处理器、中央处理器矢量扩展、图形处理器、单指令多数据流加速器、数字信号处理器、微处理器、单片机与现场可编程逻辑门阵(FPGA),且/或其中,所述至少两个不同的处理单元中的至少一个处理单元包括至少一个单核中央处理器、至少一个多核心中央处理器、至少一个中央处理器矢量扩展、至少一个图形处理器、至少一个单指令多数据流加速器、至少一个数字信号处理器、至少一个微处理器、至少一个单片机,和/或至少一个现场可编程逻辑门阵(FPGA)。
19.如权利要求17或18所述的异构计算系统,其特征在于,所述数据元信息至少包含一种运行时实例(A1)的运行时同步信息及运行时类型信息,且/或其中,所述异构计算系统配置为执行如权利要求1到10中任意一项所述的方法。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
DE102017109239.0A DE102017109239A1 (de) | 2017-04-28 | 2017-04-28 | Computerimplementiertes verfahren, computerlesbares medium und heterogenes rechnersystem |
DE102017109239.0 | 2017-04-28 | ||
PCT/EP2018/060932 WO2018197695A1 (en) | 2017-04-28 | 2018-04-27 | A computer-implemented method, a computer-readable medium and a heterogeneous computing system |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110383247A CN110383247A (zh) | 2019-10-25 |
CN110383247B true CN110383247B (zh) | 2023-04-28 |
Family
ID=62063083
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880016139.1A Active CN110383247B (zh) | 2017-04-28 | 2018-04-27 | 由计算机执行的方法、计算机可读介质与异构计算系统 |
Country Status (6)
Country | Link |
---|---|
US (1) | US11144348B2 (zh) |
EP (1) | EP3443458B1 (zh) |
JP (1) | JP7220914B2 (zh) |
CN (1) | CN110383247B (zh) |
DE (1) | DE102017109239A1 (zh) |
WO (1) | WO2018197695A1 (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11188348B2 (en) * | 2018-08-31 | 2021-11-30 | International Business Machines Corporation | Hybrid computing device selection analysis |
US11604757B2 (en) * | 2019-07-17 | 2023-03-14 | International Business Machines Corporation | Processing data in memory using an FPGA |
CN111090508B (zh) * | 2019-11-29 | 2023-04-14 | 西安交通大学 | 一种基于OpenCL的异构协同并行计算中设备间动态任务调度方法 |
CN113590086B (zh) * | 2020-04-30 | 2023-09-12 | 广东中砼物联网科技有限公司 | 快速开发软件的方法、计算机设备、及存储介质 |
CN112083956B (zh) * | 2020-09-15 | 2022-12-09 | 哈尔滨工业大学 | 一种面向异构平台的复杂指针数据结构自动管理系统 |
CN112364053B (zh) * | 2020-11-25 | 2023-09-05 | 成都佳华物链云科技有限公司 | 一种搜索优化方法、装置、电子设备及存储介质 |
CN112486684B (zh) * | 2020-11-30 | 2022-08-12 | 展讯半导体(成都)有限公司 | 行车影像显示方法、装置及平台、存储介质、嵌入式设备 |
CN112783503B (zh) * | 2021-01-18 | 2023-12-22 | 中山大学 | 一种基于Arm架构的NumPy运算加速优化方法 |
CN114185687B (zh) * | 2022-02-14 | 2022-05-24 | 中国人民解放军国防科技大学 | 一种面向共享内存式协处理器的堆内存管理方法和装置 |
EP4227795A1 (en) | 2022-02-15 | 2023-08-16 | ILNumerics GmbH | A computer-implemented method and a computer-readable medium |
CN115167637B (zh) * | 2022-09-08 | 2022-12-13 | 中国电子科技集团公司第十五研究所 | 一种易扩展可重构的计算机系统及计算机 |
CN116089050B (zh) * | 2023-04-13 | 2023-06-27 | 湖南大学 | 一种异构自适应任务调度方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102236549A (zh) * | 2010-04-20 | 2011-11-09 | 微软公司 | 跨动态边界的运行时分析的可视化 |
CN103034484A (zh) * | 2011-10-10 | 2013-04-10 | 微软公司 | 本机堆分配的运行时类型标识 |
CN105051693A (zh) * | 2013-03-15 | 2015-11-11 | 思杰系统有限公司 | 管理计算机服务器能力 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8074059B2 (en) * | 2005-09-02 | 2011-12-06 | Binl ATE, LLC | System and method for performing deterministic processing |
JP4936517B2 (ja) | 2006-06-06 | 2012-05-23 | 学校法人早稲田大学 | ヘテロジニアス・マルチプロセッサシステムの制御方法及びマルチグレイン並列化コンパイラ |
US8312346B2 (en) | 2009-05-01 | 2012-11-13 | Mirics Semiconductor Limited | Systems and methods for communications |
US8375392B2 (en) * | 2010-01-12 | 2013-02-12 | Nec Laboratories America, Inc. | Data aware scheduling on heterogeneous platforms |
US20150309808A1 (en) * | 2010-12-31 | 2015-10-29 | Morphing Machines Pvt Ltd | Method and System on Chip (SoC) for Adapting a Reconfigurable Hardware for an Application in Runtime |
US8782645B2 (en) * | 2011-05-11 | 2014-07-15 | Advanced Micro Devices, Inc. | Automatic load balancing for heterogeneous cores |
JP6072834B2 (ja) | 2012-02-08 | 2017-02-01 | インテル・コーポレーション | 方法、プログラム、装置、およびシステム |
JP2014102683A (ja) | 2012-11-20 | 2014-06-05 | Fujitsu Ltd | 情報処理装置の制御プログラム、情報処理装置の制御方法および情報処理装置 |
US11243816B2 (en) * | 2014-03-30 | 2022-02-08 | UniversiteitGent | Program execution on heterogeneous platform |
US10558500B2 (en) | 2015-07-27 | 2020-02-11 | Hewlett Packard Enterprise Development Lp | Scheduling heterogenous processors |
-
2017
- 2017-04-28 DE DE102017109239.0A patent/DE102017109239A1/de not_active Withdrawn
-
2018
- 2018-04-27 CN CN201880016139.1A patent/CN110383247B/zh active Active
- 2018-04-27 US US16/607,263 patent/US11144348B2/en active Active
- 2018-04-27 WO PCT/EP2018/060932 patent/WO2018197695A1/en active Application Filing
- 2018-04-27 JP JP2019547267A patent/JP7220914B2/ja active Active
- 2018-04-27 EP EP18720259.3A patent/EP3443458B1/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102236549A (zh) * | 2010-04-20 | 2011-11-09 | 微软公司 | 跨动态边界的运行时分析的可视化 |
CN103034484A (zh) * | 2011-10-10 | 2013-04-10 | 微软公司 | 本机堆分配的运行时类型标识 |
CN105051693A (zh) * | 2013-03-15 | 2015-11-11 | 思杰系统有限公司 | 管理计算机服务器能力 |
Also Published As
Publication number | Publication date |
---|---|
US20200301736A1 (en) | 2020-09-24 |
JP7220914B2 (ja) | 2023-02-13 |
JP2020518881A (ja) | 2020-06-25 |
DE102017109239A1 (de) | 2018-10-31 |
EP3443458A1 (en) | 2019-02-20 |
EP3443458C0 (en) | 2024-02-28 |
CN110383247A (zh) | 2019-10-25 |
WO2018197695A1 (en) | 2018-11-01 |
EP3443458B1 (en) | 2024-02-28 |
US11144348B2 (en) | 2021-10-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110383247B (zh) | 由计算机执行的方法、计算机可读介质与异构计算系统 | |
Venkataraman et al. | Presto: distributed machine learning and graph processing with sparse matrices | |
CA2959528C (en) | Specifying components in graph-based programs | |
Ben-Nun et al. | Memory access patterns: The missing piece of the multi-GPU puzzle | |
Zhang et al. | Optimizing the Barnes-Hut algorithm in UPC | |
Grossman et al. | SWAT: A programmable, in-memory, distributed, high-performance computing platform | |
Edmonds et al. | Expressing graph algorithms using generalized active messages | |
Cui et al. | Directive-based partitioning and pipelining for graphics processing units | |
Knorr et al. | Declarative data flow in a graph-based distributed memory runtime system | |
Ansel | Autotuning programs with algorithmic choice | |
Jindal et al. | Exploiting GPUs with the super instruction architecture | |
CN118159938A (zh) | 用于具有优化的延迟的多处理器系统的处理代码的自动并行化的系统及其方法 | |
Thoman et al. | Command Horizons: Coalescing Data Dependencies While Maintaining Asynchronicity | |
Li et al. | FreshBreeze: A data flow approach for meeting DDDAS challenges | |
Nawata et al. | APTCC: Auto parallelizing translator from C to CUDA | |
US20230259338A1 (en) | Computer-implemented method and a computer-readable medium | |
Hutter et al. | ParaTreeT: A Fast, General Framework for Spatial Tree Traversal | |
Li et al. | swTVM: Towards Optimized Tensor Code Generation for Deep Learning on Sunway Many-Core Processor | |
Li | Facilitating emerging applications on many-core processors | |
KR20240090423A (ko) | 최적화된 레이턴시를 가진 멀티-프로세서 시스템을 위한 프로세싱 코드들의 자동-병렬화를 위한 시스템 및 그의 방법 | |
Wu | Facilitating the Deployment of Irregular Applications on Parallel Manycore Architecture by Identifying Irregular Patterns | |
Clucas et al. | Ripple: Simplified Large-Scale Computation on Heterogeneous Architectures with Polymorphic Data Layout | |
Li | Exploiting large-scale data analytics platforms with accelerator hardware | |
Laguna | Using Persistent Data Models to Automate Parallelism under Synchronization Requirements | |
Sabne | Programming models, compilers, and runtime systems for accelerator computing |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |