CN114461186A - 一种面向华为昇腾加速卡的自动编译运行c/c++代码的方法 - Google Patents
一种面向华为昇腾加速卡的自动编译运行c/c++代码的方法 Download PDFInfo
- Publication number
- CN114461186A CN114461186A CN202111533075.2A CN202111533075A CN114461186A CN 114461186 A CN114461186 A CN 114461186A CN 202111533075 A CN202111533075 A CN 202111533075A CN 114461186 A CN114461186 A CN 114461186A
- Authority
- CN
- China
- Prior art keywords
- operator
- ascend
- custom
- accelerator card
- function
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 41
- 230000006870 function Effects 0.000 claims abstract description 63
- 238000013499 data model Methods 0.000 claims abstract description 24
- 238000011161 development Methods 0.000 claims abstract description 18
- 238000007726 management method Methods 0.000 claims abstract description 14
- 238000013523 data management Methods 0.000 claims abstract description 5
- 238000012545 processing Methods 0.000 claims description 15
- 238000000859 sublimation Methods 0.000 claims 1
- 230000008022 sublimation Effects 0.000 claims 1
- 230000001133 acceleration Effects 0.000 abstract description 8
- 238000004364 calculation method Methods 0.000 description 11
- 238000010586 diagram Methods 0.000 description 10
- 230000006978 adaptation Effects 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 108091029480 NONCODE Proteins 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 238000012549 training Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- 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/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- 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/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4496—Unification in logic programming
-
- 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/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种面向华为昇腾加速卡的自动编译运行C/C++代码的方法,通过昇腾加速卡处理器向上层提供的Ascend平台及其自定义算子的特点,结合C/C++语言编译,以算子函数开发和调用的整体流程并整合主机和昇腾加速卡处理器的数据管理和运行调度能力,实现在昇腾加速卡上执行自定义的函数代码;其中,包括自定义算子函数的统一描述模型、针对主机和昇腾加速卡处理器内存管理的数据模型、针对Ascend平台自定义算子的自动化配置程序以及自定义算子的调用执行系统。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种面向华为昇腾加速卡的自动编译运行C/C++代码的方法。
背景技术
昇腾加速卡是华为公司研发的高性能低功耗的AI加速模块,提供了超强的计算能力,基于CANN(AI场景的异构计算架构)提供了多层次的编程接口,以供构建AI应用。目前昇腾加速卡主要使用于需要大算力的AI模型的构建、训练和推理。近来并行计算应用、高性能计算应用的需求日渐提高,这两类应用也都需要较大的计算能力支持,作为国产化的高算力机器代表,昇腾加速卡也是未来运行这两类应用的一个可选项。
昇腾加速卡通过CANN向上层提供了统一的编程语言AscendCL, AscendCL提供的C语言API库里的算子都是目前存在的具有普用性的算子,这对于构建模型网络是可用的,但对于并行高性能应用并不适用。可以通过向AscendCL注册自己的函数来实现自定义算子,从而使用Ascend搭建更具特殊性的高性能应用。
AscendCL支持自定义C/C++语言的AI CPU算子,需要根据特定的模式编写逻辑执行代码和配置文件,包括算子模型定义、算子模型格式、算子实现等,并且通过特定的编译器编译,最后拷贝到外部算子库的特定目录。昇腾加速卡可运行的程序严重依赖于已有的算子库和运算模型。
发明内容
针对现有技术的不足,使用昇腾加速卡时执行自定义代码步骤多、繁杂,本发明旨在提供一种面向华为昇腾加速卡的自动编译运行 C/C++代码的方法,具体的说,通过昇腾统一编程语言AscendCL可自定义的AI CPU算子为基础,提出更通用的C/C++算子开发框架,目标是使得可以更高效、方便地开发特定的高性能算子,在昇腾平台构建有特殊需要的AI应用和高性能应用。
为了实现上述目的,本发明采用如下技术方案:
一种面向华为昇腾加速卡的自动编译运行C/C++代码的方法,通过昇腾加速卡处理器向上层提供的Ascend平台及其自定义算子的特点,结合C/C++语言编译,以算子函数开发和调用的整体流程并整合主机和昇腾加速卡处理器的数据管理和运行调度能力,实现在昇腾加速卡上执行自定义的函数代码,该方法实现最终为一个软件框架的形式;其中,包括自定义算子函数的统一描述模型、针对主机和昇腾加速卡处理器内存管理的数据模型、针对Ascend平台自定义算子的自动化配置程序以及自定义算子的调用执行系统。
需要说明的是,所述自定义算子函数的统一描述模型是为了在满足Ascend平台规定的自定义算子约束的前提下,适应各种类型参数的自定义函数;通过模板编程和多余参数的方式,使得算子函数统一模型可以涵括各种类型数据和规范化入参和返回值。
需要说明的是,所述针对主机和昇腾加速卡处理器内存管理的数据模型是整合了主存的内存分配方式和昇腾加速卡处理器的内存分配,以两者间的数据拷贝,通过数据模型的数据描述结构产生算子调用时的json描述文件,进而调用算子。
需要说明的是,所述针对Ascend平台自定义算子的自动化配置程序为一个根据用户自定义的算子、调用的算子及数据模型实例生成配置文件的自动化模块,同时处理与算子无关的Ascend平台规范的逻辑代码。
需要说明的是,所述自定义算子的调用执行系统为一个自动处理自定义函数调用逻辑的模块,基于数据模型和自动化配置程序,调用执行系统还加强对于执行函数和设备的管理,使用一个哈希表来映射用户所要执行的函数,以及在那个昇腾加速卡设备执行;只为用户提供一个run函数,即可执行自定义的各个函数,简化Ascend平台调用的自定义算子调用流程。
附图说明
图1为一般自定义AI CPU算子开发和调用流程示意图;
图2为使用本发明框架开发和调用自定义算子示意图;
图3为本发明框架处理自定义算子整体过程概略图;
图4为本发明框架处理算子开发编译过程示意图;
图5为本发明框架处理算子调用过程示意图。
具体实施方式
以下将结合附图对本发明作进一步的描述,需要说明的是,以下实施例以本技术方案为前提,给出了详细的实施方式和具体的操作过程,但本发明的保护范围并不限于本实施例。
本发明为一种面向华为昇腾加速卡的自动编译运行C/C++代码的方法,通过昇腾加速卡处理器向上层提供的Ascend平台及其自定义算子的特点,结合C/C++语言编译,以算子函数开发和调用的整体流程并整合主机和昇腾加速卡处理器的数据管理和运行调度能力,实现在昇腾加速卡上执行自定义的函数代码,该方法实现最终为一个软件框架的形式;其中,包括自定义算子函数的统一描述模型、针对主机和昇腾加速卡处理器内存管理的数据模型、针对Ascend平台自定义算子的自动化配置程序以及自定义算子的调用执行系统。
需要说明的是,所述自定义算子函数的统一描述模型是为了在满足Ascend平台规定的自定义算子约束的前提下,使得本发明框架可以适应各种类型参数的自定义函数;通过模板编程和多余参数的方式,使得算子函数统一模型可以涵括各种类型数据和规范化入参和返回值。
需要说明的是,所述针对主机和昇腾加速卡处理器内存管理的数据模型是整合了主存的内存分配方式和昇腾加速卡处理器的内存分配,以两者间的数据拷贝,通过数据模型的数据描述结构产生算子调用时的json描述文件,进而调用算子。
需要说明的是,所述针对Ascend平台自定义算子的自动化配置程序为一个根据用户自定义的算子、调用的算子及数据模型实例生成配置文件的自动化模块,同时处理与算子无关的Ascend平台规范的逻辑代码。
需要说明的是,所述自定义算子的调用执行系统为一个自动处理自定义函数调用逻辑的模块,基于数据模型和自动化配置程序,调用执行系统还加强对于执行函数和设备的管理,使用一个哈希表来映射用户所要执行的函数,以及在那个昇腾加速卡设备执行;只为用户提供一个run函数,即可执行自定义的各个函数,简化Ascend平台调用的自定义算子调用流程。
实施例
下面先对本实施例中所用到的缩略语和关键术语做一个简要的说明:
CANN:统一异构计算框架,通过提供多层次的编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。
AscendCL(Ascend Computing Language):一套用于在昇腾平台上开发应用的C语言API库,主要用于管理运算、调用已有的AI模型和算子运算,从而实现使用昇腾加速卡的计算能力。
自定义算子:在本发明中指的是AscendCL未提供的算子运算或者想自己重新实现算子库中已有的算子,概括地说就是在昇腾加速卡上运行自己编写的C/C++函数。
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图对本发明中的技术方案进行更详细的说明。
图1描述了一般自定义AI CPU算子开发和调用流程,该流程严格符合AscendCL规范要求的步骤和内容。其中主要分为算子开发和算子调用上下两部分,通过AscendCL提供的算子调用函数使用算子名(name)关联起来。
例子中的算子开发涉及到算子原型定义、算子参数数据格式定义和算子的实现,还可以编写基于第三方框架(如pytorch、 tensorflow)的算子适配插件。
算子开发的代码需要使用特定的代码库和编译器aarch-gnu进行编译,生成算子的动态链接库文件,最后需要将算子的头文件、配置文件和动态链接库文件拷贝到AscendCL外部算子库的特定目录。
例子中的算子调用分为三个步骤:
1)资源准备,包括设备资源和算子资源。设备资源申请是 AscendCL的使用模式规定的,算子资源则是算子模型和算子数据,两者是运行算子的必要部分。
2)运行算子。运行前需要将主存的数据转移到加速卡设备内存,然后使用算子name字符串运行算子,运算结束会将结果输出到指定的内存区域。
3)资源释放。整个模型运算结束之后需要将占用的资源释放。
整个自定义算子从开发到调用步骤较多,配置文件也有好几个,包括算子定义配置文件、模型文件、数据描述文件等,还有多个 AscendCL规定的管理操作,这些本身并不设计算子逻辑,自动化管理才是更合适的方式,让开发者关注算子的逻辑代码开发,而不是平台适配。
图2为使用本发明框架进行自定义算子函数开发和调用的示意图,只需要进行算子代码开发,编译之后便可直接进行算子调用。
使用框架开发自定义算子时,只需要关注算子本身的逻辑代码。在框架定义好的代码框架上,填充上算子的处理逻辑,执行编译指令,便可以调用自定义的该算子函数了。
框架将原本在算子开发期需要的非代码逻辑配置文件进行自动化处理,将处理流程缩短,开发者只需要进行算子最核心的C/C++逻辑代码开发。
算子的逻辑代码开发完成之后,进行编译只需要执行简单的编译命令,完成后便可使用算子功能了。
框架将大部分调用期的资源准备工作都进行了自动化配置,让开发者无感知地调用算子函数。只需要使用框架提供的run函数,便可直接调用相应的算子。
对比图1的自定义算子使用流程,框架对整个自定义算子流程进行了简化,对其中的大部分配置进行了自动化处理,对设备资源进行了管理,无需开发者额外关注,而且提出了数据模型进行内存资源的高效管理。使用框架明显减少了自定义算子使用的步骤,提供开发效率。
图3、图4和图5为本发明框架核心的处理流程示意图,分别展示了框架整体处理内容,以及在处理算子开发和调用期间所做的处理内容。
图3为本发明框架处理自定义算子整体过程概略图。主要步骤如下:
1)首先框架需要将开发者编写的纯C/C++代码进行整合,无需用户重新编写其他的配置文件。
2)框架自身配置好相应的编译依赖库和特定编译器,通过简单的cmake、make命令便可完成编译。
3)在编译期间自动完成自定义算子的注册。
4)在算子调用阶段,框架提供初始化函数,自动申请设备资源。
5)框架提供数据模型来管理数据,内存分布和数据拷贝。
6)框架提供run函数来执行算子,便可自动执行相应的自定义算子。
7)计算完成后,框架提供finalize函数,自动化回收设备资源。
图4为本发明框架处理算子开发编译过程示意图。
框架为更好地处理开发者自定义的纯C/C++代码,设计了算子统一模型,算子统一模型通过提供了多个不同数量参数的函数接口来支持参数个数不一致的算子函数,通过模板元编程的方式来实现编译时的动态参数类型确定。上述两者结合解决了不同参数数量和不同类型参数的自定义算子问题,而且支持同时开发多个不同的自定义算子函数。
算子统一模型通过自动化配置程序处理算子原型描述文件和算子配置文件,将多个算子代码整合到相同的配置文件中,只根据参数类型和数量来区分不同的算子,这样避免了产生太多的配置文件,而且再也无需使用者关注与代码无关的配置文件。
框架通过配置了必要的动态链接库和特定的编译器来支持编译昇腾加速卡可执行文件,只需执行cmake、make编译指令便可,大大降低用户使用的成本。
为了适应AscendCL的要求,在编译完成后,框架的自动化配置程序自动将编译好的动态链接库文件和算子配置文件复制到外部算子库目录处,实现自定义算子在AscendCL上的注册。
图5为本发明框架处理算子调用过程示意图。
在算子使用期间,需要进行四个阶段的过程:
1)创建运行环境。在使用昇腾加速卡进行计算之前,需要先申请可用的设备资源,框架提供init函数来初始化资源。通过数据模型的数据描述结构生成算子模型文件(.om)和算子调用数据结构描述文件(.json)来初始化设备和运算上下文。
2)数据管理和内存空间管理。该阶段是对算子数据进行准备和初始化的阶段,框架提供的数据模型支持不同空间的内存申请,快速地在主机和设备申请内存空间,支持在不同内存位置自由地深拷贝数据。
3)执行算子计算。在数据准备完成后,框架的run函数负责执行算子的调用,并在加速卡设备上执行运算。将数据模型传入run函数,run函数将数据模型的数据内存地址和数据描述结构传递给算子,执行时根据算子统一模型的算子名称调用对应的动态链接库(.so),根据参数执行相对应的具体自定义的算子函数。执行算子之后,计算结果会保存在设备内存,可以继续用于进一步计算,或者通过数据模型将结果拷贝回主存。
4)资源释放。框架提供finalize函数来自动化释放占用的资源,包括Device、Context等。
如下为使用本发明框架进行3D卷积算子开发。
1)根据3D卷积算子的输入输出参数进行分析,该算子有四个输入参数,分别为三维数据及其维度信息、三维kernel数据以及其维度信息,输出为三维数据以及其维度信息,3D卷积计算过程使用的数据为float类型,所以选用算子统一模型中4个输入和4个输出参数的算子函数模板进行填充逻辑代码。
2)编写3D卷积算子函数的逻辑代码,使用算子函数模板编写的代码和自主编写一个相同功能的函数,基本上是一模一样的,所以从原来的函数改为算子统一模型的函数代码是比较容易的。
3)在准备调用阶段,根据3D卷积的数据构建数据描述结构,并初始化设备。
4)准备数据,实例化数据模型,指定分配内存空间,做必要的数据转移,主要是转移到加速卡设备。
5)调用run函数执行3D卷积算子计算。
6)计算结束后将计算结果拷贝回主存,跟一般3D卷积的计算结果进行比较,结果一致。
7)完成全部计算后,释放占用资源。
对于本领域的技术人员来说,可以根据以上的技术方案和构思,给出各种相应的改变和变形,而所有的这些改变和变形,都应该包括在本发明权利要求的保护范围之内。
Claims (5)
1.一种面向华为昇腾加速卡的自动编译运行C/C++代码的方法,其特征在于,通过昇腾加速卡处理器向上层提供的Ascend平台及其自定义算子的特点,结合C/C++语言编译,以算子函数开发和调用的整体流程并整合主机和昇腾加速卡处理器的数据管理和运行调度能力,实现在昇腾加速卡上执行自定义的函数代码,该方法实现最终为一个软件框架的形式;;其中,包括自定义算子函数的统一描述模型、针对主机和昇腾加速卡处理器内存管理的数据模型、针对Ascend平台自定义算子的自动化配置程序以及自定义算子的调用执行系统。
2.根据权利要求1所述的面向华为昇腾加速卡的自动编译运行C/C++代码的方法,其特征在于,所述自定义算子函数的统一描述模型是为了在满足Ascend平台规定的自定义算子约束的前提下,适应各种类型参数的自定义函数;通过模板编程和多余参数的方式,使得算子函数统一模型可以涵括各种类型数据和规范化入参和返回值。
3.根据权利要求1所述的面向华为昇腾加速卡的自动编译运行C/C++代码的方法,其特征在于,所述针对主机和昇腾加速卡处理器内存管理的数据模型是整合了主存的内存分配方式和昇腾加速卡处理器的内存分配,以两者间的数据拷贝,通过数据模型的数据描述结构产生算子调用时的json描述文件,进而调用算子。
4.根据权利要求1所述的面向华为昇腾加速卡的自动编译运行C/C++代码的方法,其特征在于,所述针对Ascend平台自定义算子的自动化配置程序为一个根据用户自定义的算子、调用的算子及数据模型实例生成配置文件的自动化模块,同时处理与算子无关的Ascend平台规范的逻辑代码。
5.根据权利要求1所述的所述的面向华为昇腾加速卡的自动编译运行C/C++代码的方法,其特征在于,所述自定义算子的调用执行系统为一个自动处理自定义函数调用逻辑的模块,基于数据模型和自动化配置程序,调用执行系统还加强对于执行函数和设备的管理,使用一个哈希表来映射用户所要执行的函数,以及在那个昇腾加速卡设备执行;只为用户提供一个run函数,即可执行自定义的各个函数,简化Ascend平台调用的自定义算子调用流程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111533075.2A CN114461186A (zh) | 2021-12-15 | 2021-12-15 | 一种面向华为昇腾加速卡的自动编译运行c/c++代码的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111533075.2A CN114461186A (zh) | 2021-12-15 | 2021-12-15 | 一种面向华为昇腾加速卡的自动编译运行c/c++代码的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114461186A true CN114461186A (zh) | 2022-05-10 |
Family
ID=81406155
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111533075.2A Pending CN114461186A (zh) | 2021-12-15 | 2021-12-15 | 一种面向华为昇腾加速卡的自动编译运行c/c++代码的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114461186A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115271053A (zh) * | 2022-06-07 | 2022-11-01 | 四川大学 | Cann计算架构下ai处理器算子溢出优化方法及系统 |
-
2021
- 2021-12-15 CN CN202111533075.2A patent/CN114461186A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115271053A (zh) * | 2022-06-07 | 2022-11-01 | 四川大学 | Cann计算架构下ai处理器算子溢出优化方法及系统 |
CN115271053B (zh) * | 2022-06-07 | 2023-05-23 | 四川大学 | Cann计算架构下ai处理器算子溢出优化方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11803404B2 (en) | Deep learning algorithm compiling method, device, and related product | |
Nugteren et al. | Introducing'Bones' a parallelizing source-to-source compiler based on algorithmic skeletons | |
US9766867B2 (en) | Systems and methods for improving performance of mobile applications | |
EP2834744B1 (en) | System and method for memory management | |
CN103135979A (zh) | 终端应用的生成方法、装置及系统 | |
JP2012530995A (ja) | 処理方法 | |
US20220114429A1 (en) | Method and device for generating operation data and related product | |
CN113805882A (zh) | 应用程序开发的方法、装置、电子设备及存储介质 | |
Gschwind et al. | An open source environment for cell broadband engine system software | |
JP2004503866A (ja) | モジュラーコンピュータシステムおよび関連方法 | |
Posadas et al. | Automatic synthesis of embedded SW for evaluating physical implementation alternatives from UML/MARTE models supporting memory space separation | |
CN114327405A (zh) | 数据处理方法、装置、设备及存储介质 | |
Vocke et al. | Extending halide to improve software development for imaging dsps | |
Weber et al. | MATOG: array layout auto-tuning for CUDA | |
CN116107669B (zh) | 深度学习框架的算子注册方法、装置、设备及存储介质 | |
CN114461186A (zh) | 一种面向华为昇腾加速卡的自动编译运行c/c++代码的方法 | |
WO2022105295A1 (zh) | 基于nGraph的GPU后端分布式训练方法和系统 | |
Sandrieser et al. | Explicit platform descriptions for heterogeneous many-core architectures | |
WO2002095561A1 (en) | A parameterized application programming interface for reconfigurable computing systems | |
CN110806891B (zh) | 嵌入式设备软件版本的生成方法及装置 | |
CN112306539A (zh) | 一种单片机应用层开发方法、系统、终端及介质 | |
Harvey et al. | Parallel programming in actor-based applications via OpenCL | |
Posadas et al. | System synthesis from UML/MARTE models: The PHARAON approach | |
Leppänen et al. | Unified OpenCL integration methodology for FPGA designs | |
Acosta et al. | Extending paralldroid with object oriented annotations |
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 |