CN115904328A - 一种基于llvm中间语言的跨gpu架构的并行计算框架的转化方法 - Google Patents
一种基于llvm中间语言的跨gpu架构的并行计算框架的转化方法 Download PDFInfo
- Publication number
- CN115904328A CN115904328A CN202211555197.6A CN202211555197A CN115904328A CN 115904328 A CN115904328 A CN 115904328A CN 202211555197 A CN202211555197 A CN 202211555197A CN 115904328 A CN115904328 A CN 115904328A
- Authority
- CN
- China
- Prior art keywords
- parallel computing
- framework
- gpu
- intermediate language
- opencl
- 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
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及计算机GPU并行计算领域,尤其涉及一种基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法。本发明的具体内容包括:针对各个模块,对两种不同的并行计算框架的实现的对比情况进行分析并预处理;并行计算框架基本转化模型的设计;深度神经网络库的转化实现;深度学习计算框架的加速引擎库的实现,最终支持深度学习计算框架运行在不同架构GPU设备上。具体流程和主要工作如图1所示。通过该框架转化方法可以更好的实现异构并行计算和深度学习任务。
Description
(一)技术领域
本发明涉及计算机GPU并行计算领域,尤其涉及一种基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法。
(二)背景技术
框架转化是伴随着异构并行编程模型研究时产生的问题而来。例如,异构并行编程涉及的多GPU系统集群中,GPU硬件标准很难统一,导致在编程模型中难以合理分配异构计算资源,通过研究框架转化方法可以很好的解决这种问题。
通过分析比较,基于使用的广泛性、框架的相似性对框架转化的模型进行选型。目前主要的并行编程框架有Cuda、OpenCL、OpenMP、MPI、Spark等,但其中Cuda和OpenCL是当前主流的通用GPU计算设计的框架,而且两者都有在计算设备上执行的内核、在其中有并行运行的线程,以及管理设备内存和启动计算内核等方法,适合进行框架转化的研究。
框架转化中的目标框架要求具有在各种设备上可以普遍运行的可移植性。以Cuda和OpenCL这两种主流的通用GPU计算设计框架比较来看,Cuda一直是几乎所有通用GPU应用程序的实际编程环境,但该框架仅在英伟达GPU上可用,传统上在利用额外的多核或众核设备,例如AMD、FPGA等显卡时,需要在其他框架中重新实现。另一方面,OpenCL是面向异构系统的并行编程标准和编程环境,它的出现为异构计算提供了一种通用和开放的解决方案,克服了Cuda仅在英伟达GPU上可用的弊端。通过可用于CPU、GPU和其他类型的加速器的实现,OpenCL因此有望实现“一次编写,随处运行”即可移植性的异构计算生态系统。
框架转化涉及编译框架的选型,以便于将源并行计算框架转化到目标编程框架。现阶段针对此类问题采用的编程框架主要包括Cetus编译框架、HIP编译器、SYCL高级编程模型、Clang编译器。在这里选择Clang编译器,因为以下三个原因:第一,Clang编译速度相对更快、编译产出更小。因为Clang只需要完成词法和语法分析,代码优化和机器代码的生成工作由LLVM完成;第二,Clang产出的LLVM中间语言,与平台无关,是连接编译器前端和LLVM后端的一个桥梁。LLVM的C++接口可以提供操作编译生成的每行指令的成千上万的类,即我们无须直接对以往复杂格式的中间代码格式的抽象语法树进行操作,而是进一步将抽象语法树变成LLVM中间语言类的实例,然后在内存中交给LLVM后端处理。第三,LLVM现已支持英伟达GPU,可以很好的在中间语言层面对CUDA源语言进行很好的抽象。
将框架转化思路运用在深度学习领域。目前主流的深度学习框架都是用英伟达CUDA语言编写和维护的,因此通过框架转化到OpenCL可以更好的实现异构并行计算和深度学习任务。
(三)发明内容
在框架转化中,首先针对Cuda的主机端和设备端源程序的两个主要处理过程——编译和链接进行处理:1)编译处理:在设备端和主机端LLVM中间代码级别上,考虑到CUDA和OpenCL的架构差异,需要改变中间代码对设备端函数调用的处理方式,解决参数方面的移植性问题,然后根据LLVM自顶向下的分层结构,采用设计模式中装饰模式和解释器模式的思想,自上而下层层转化设备端核函数,2)链接处理:对OpenCL驱动库进行处理,引入与LLVM中间代码相关的接口,进而可以实现与LLVM中间代码链接最终形成可执行在OpenCL上的程序。
然后将基于Cuda架构实现的深度学习底层GPU加速引擎库进行转化。完整拷贝引擎库所支持的一套Cuda接口的实现,重写为支持OpenCL的接口。
基于上述思路,本申请提出了一种基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法,包含如下步骤:
S1.预处理。针对各个模块,对两种不同的并行计算框架的实现的对比情况进行分析并预处理。
S2.并行计算框架基本转化模型的设计。用编译器将源并行计算框架先转为LLVM中间语言并进行处理,并设计并行计算框架基本转化模型,转化核函数的形式并运行。
S3.深度神经网络库的转化实现。在已有转化实现的矩阵运算库的基础上进行转化实现。
S4.深度学习计算框架的加速引擎库的实现。结合上述转化方法,支持深度学习计算框架运行在不同架构GPU设备上。
1.预处理
针对Cuda涉及的几个模块和OpenCL编程模型中涉及的模块,将两者中相似的模块进行替代,缺少的功能进行实现,多余的功能进行剔除。
2.并行计算框架基本转化模型的设计
首先将Cuda主机端源程序通过某种编译器编译成某种与平台无关的中间语言。
接下来,LLVM对Cuda生成的中间语言分为两个部分:主机端中间语言代码和设备端中间语言代码。对于主机端部分,首先将CUDA原先包含的运行时API头文件的解释用转换程序的实现来替代;对于设备端中间语言代码的调用部分,还涉及NVVM中间语言的处理,其本质上就是LLVM中间语言,只不过支持了GPU硬件的一些特性,比如层次化的内存结构、专用的指令和寄存器等,例如用来读取GPU中的一些特殊寄存器。
将前面编译形成的设备端中间语言代码,转化为OpenCL形式的设备端核函数:我们从LLVM中间语言格式中最顶层的模块层逐渐向下依次遍历函数层、基本块层、直到指令层。在最后的这一层,我们根据核函数每一行中间语言指令的具体功能转化为相应的OpenCL语句,从而实现转化为OpenCL形式的设备端核函数。
接下来,将前面编译形成的LLVM中间语言的主机端程序,结合上面转化后的OpenCL的设备端核函数,用OpenCL基本执行流程继续编译运行。
3.深度神经网络库的转化实现
因为深度神经网络库是在矩阵运算库的基础上实现的,所以我们借助现有的Cuda转化来的、可运行在OpenCL的第三方矩阵运算库CLBlast,它是由C++11实现一个轻量级的矩阵运算库,即基本线性代数里操作向量和矩阵的子程序。
第一:分析深度神经网络库的标准例程,例如向前和向后卷积、池化、规范化和激活层等操作,我们分析它们的例程实现采用的接口设计,进而在CLBlast提供的一些算法的基础上实现对深度神经网络库的转化,以便在OpenCL硬件设备上加速运行神经网络例程。
第二:对于神经网络的每个例程,抽离分解出并行执行的核函数部分,并基于前面基本转化模型的设计转为OpenCL形式。
第三:对于某些例程,可以用各种不同的算法实现,这些算法都提供相同的数值结果。通过这种方式,这种库可以为每个例程通过选择不同算法和参数,来适应不同的硬件特性,优化性能。
4.深度学习计算框架的加速引擎库的实现
为了实现深度学习计算框架在不同GPU设备的运行,首先分析用来深度学习计算的具体架构结构,如图4所示:整个框架以C API为界,分为前端和后端两个部分,其中后端且进一步分为4层,其中第四层是设备层:提供多种异构设备的支持,如CPU GPU TPU FPGA等;并通过C API建立前后端的连接。
接下来进一步分析第四层设备层中的并行执行引擎框架。它是管理GPU设备的接口,这种GPU封装需要与GPU设备通信的库,在并行执行引擎框架里封装了几个常见的基本的核心运算,并行执行引擎框架框架内部看,可以分为平台层、引擎框架核心层和库支持层。
对引擎框架核心层和库支持层分别进行处理。其中引擎框架核心层这一层提供了Cuda执行子,这是与Cuda相关联的接口,我们对应该接口的实现,重写为支持OpenCL的接口;而库支持层提供各种底层加速库的接入,该层主要负责接入DNN、BLAS、RNG和FFT模块,可以直接与前面转化后的并行计算框架的相关库相关联。
最后对第二层计算层的op算子进行研究,图5所示。它与并行执行引擎框架也是相关联的,对于每个op算子的实现来说,因为OpenCL的设备管理层中的并行执行引擎支持GPU执行引擎和CPU执行引擎,所以都有cpu和gpu两种实现的算法。可以对一些例如矩阵转置的并行的op算子的gpu接口进行转化和实现。
(四)附图说明
图1为本发明提供的自定义的并行计算框架基本转化模型的主要工作;
图2为本发明提供的OpenCL基本执行流程图;
图3为本发明提供的LLVM IR的基本结构;
图4为本发明提供的深度学习计算框架图;
图5为本发明提供的op算子的种类和实例;
(五)具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明实施方案作进一步详细描述。
(1)针对各个模块,对两种不同的并行计算框架的实现的对比情况进行分析并预处理:
S101,对CUDA和OpenCL的各个模块中的各个接口的功能原子化,并进行比较,如下表1。观察两者中相似的模块功能、缺少的功能和多余的功能。
表1
S102,增加相似接口内缺少的部分原子性功能。比如对于分配内存来说,Cuda的实现和与之对应的OpenCL的实现之间存在着细微的差异,因为OpenCL提供多出一位的区域来指明分配和使用的信息,可以在Cuda的实现基础上多一层封装增加此功能。
S103,对整个接口或单个接口中的部分原子功能的多余实现进行剔除。比如Cuda需要显式创建事件,这在OpenCL里是在指令队列上执行其它操作连带创建的,无需显式创建。
(2)用编译器将源并行计算框架先转为LLVM中间语言并进行预处理,并设计并行计算框架基本转化模型,转化核函数的形式并运行。自定义的并行计算框架基本转化模型如图1所示,基于这个模型实施的伪代码如下:
算法输入:Cuda_Source_Code
算法输出:host_module,device_module
说明:Cuda_Source_Code是Cuda源程序,get()是将Cuda源程序解析,Clang_Complile是Clang编译Cuda,parseIRfile()是将编译后的中间文件模块化,getVariable()是获取主机端设置的核函数参数信息,find()找到插入的位置,host_module::insert()是对主机端插入语句的具体描述,change()是转化为LLVM形式的设备端核函数名称,setStaticVariable()是设置静态全局变量,replace()将指令替换成对应OpenCL格式的代码。
算法详细说明如下:
Step1:通过Clang编译器将Cuda源程序转化为LLVM中间语言形式的两个文件
Step2:我们利用LLVM提供的对中间语言编程的接口,进一步将LLVM中间语言形式的核函数进行预处理
Step3:在转化模型的最后,将编译形成的LLVM中间语言的设备端核函数形式,按照图3对应LLVM IR的各层级格式,层层转化为OpenCL的核函数形式。
Step4:接下来就是要添加OpenCL基本执行流程,执行转化后的OpenCL代码,一般性的OpenCL执行流程如图2所示
(3)对基于源并行计算框架的相关库进行转化为目的框架的实现。与库相关的转化,最重要的是对例程的核函数的转化,具体的方法如下:
S301,对例程涉及到核函数的情况进行分类,有些是纯涉及核函数的基础例程,而有些是在这个基础例程之上的更高级别的例程,需要将这些例程划分开。
S302,实例说明
对于纯涉及核函数的基础例程,以cuDNN中用来优化卷积的im2col例程为实验对象,以下进行简要的说明。
1.自定义通道数为channels,height_col*width_col大小的卷积核。
2.找出例程的可并行化部分,即负责每个二维的矩形框元素展开为一维部分,并将其组织为相应的核函数,每个核函数负责相应的矩形框元素的展开,即会同时运行channels*height_col*width_col个核函数。
3.可以利用前面实现的基本转化模型将im2col例程的核函数实现转化为OpenCL的核函数。
4.对于主机端的程序部分,仍然要添加OpenCL基本执行流程,在其中调用核函数执行。
S303,对于更高级别的例程,例如前向传播计算,是在前面提到的im2col例程的基础上实现的。
(4)结合上述转化方法,支持深度学习计算框架运行在不同架构GPU设备上。以Tensorflow为实验对象,主要的操作方法如下:
S401,转化op算子对应的gpu实现。
S402,完整拷贝一整套Tensorflow支持的Cuda接口的实现,重写为支持OpenCL的接口。
S403,使用构建工具重新构建Tensorflow,将OpenCL的接口的各个实现与之前实现的转换程序的库连接构建起来。通过这种方法,我们将Tensorflow原先使用Cuda执行算子的支持转交给OpenCL运行。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。
Claims (6)
1.一种基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法,其特征在于,
包括如下内容:
S1.预处理。针对各个模块,对两种不同的并行计算框架的实现的对比情况进行分析并预处理。
S2.并行计算框架基本转化模型的设计。用编译器将源并行计算框架先转为LLVM中间语言并进行处理,并设计并行计算框架基本转化模型,转化核函数的形式并运行。
S3.深度神经网络库的转化实现。在已有转化实现的矩阵运算库的基础上进行转化实现。
S4.深度学习计算框架的加速引擎库的实现。结合上述转化方法,支持深度学习计算框架运行在不同架构GPU设备上。
2.根据权利要求1所述的基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法,其特征在于,S1所述的各个模块,指的是设备管理类、内存管理类、流管理类、事件管理、内核启动这几个模块。
3.根据权利要求1所述的基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法,其特征在于,S1所述的分析并预处理,包括:
S301、对CUDA和OpenCL的各个模块中的各个接口的功能原子化,并进行比较;
S302、增加相似接口内缺少的部分原子性功能;
S303、对整个接口或单个接口中的部分原子功能的多余实现进行剔除。
4.根据权利要求2所述的基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法,其特征在于,S2所述的转为LLVM中间语言并进行处理,具体步骤如下:
S401、先将原先传入函数参数形式的各个参数,转变为多个获取各个变量的语句,这是为了与OpenCL传入核函数的方式相匹配;
S402、在主机端指明设备端核函数名称和核函数所在文件的路径,以便获得完整设备端核函数源码来转化和调用
S403、通过在基本转化模型中设置静态全局变量,可以存储与GPU端分配内存的相关变量,这样设备端可以获取到,而对于与GPU端内存分配无关的变量无需额外的进行改变。
5.根据权利要求1所述的基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法,其特征在于,S3所述的转化实现,具体如下:
S501、对例程涉及到核函数的情况进行分类,有些是纯涉及核函数的基础例程,而有些是在这个基础例程之上的更高级别的例程,需要将这些例程划分开。
S502、对于更高级别的例程,例如前向传播计算,是在前面提到的im2col例程的基础上实现的。
6.根据权利要求1所述的基于LLVM中间语言的跨GPU架构的并行计算框架的转化方法,其特征在于,S4所述的加速引擎库的实现,具体如下:
S601、转化op算子对应的gpu实现。
S602,完整拷贝一整套Tensorflow支持的Cuda接口的实现,重写为支持OpenCL的接口。
S603,使用构建工具重新构建Tensorflow,将OpenCL的接口的各个实现与之前实现的转换程序的库连接构建起来。通过这种方法,我们将Tensorflow原先使用Cuda执行算子的支持转交给OpenCL运行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211555197.6A CN115904328A (zh) | 2022-12-06 | 2022-12-06 | 一种基于llvm中间语言的跨gpu架构的并行计算框架的转化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211555197.6A CN115904328A (zh) | 2022-12-06 | 2022-12-06 | 一种基于llvm中间语言的跨gpu架构的并行计算框架的转化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115904328A true CN115904328A (zh) | 2023-04-04 |
Family
ID=86493601
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211555197.6A Pending CN115904328A (zh) | 2022-12-06 | 2022-12-06 | 一种基于llvm中间语言的跨gpu架构的并行计算框架的转化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115904328A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116991600A (zh) * | 2023-06-15 | 2023-11-03 | 上海一谈网络科技有限公司 | 图形调用指令的处理方法、装置、设备及存储介质 |
-
2022
- 2022-12-06 CN CN202211555197.6A patent/CN115904328A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116991600A (zh) * | 2023-06-15 | 2023-11-03 | 上海一谈网络科技有限公司 | 图形调用指令的处理方法、装置、设备及存储介质 |
CN116991600B (zh) * | 2023-06-15 | 2024-05-10 | 上海一谈网络科技有限公司 | 图形调用指令的处理方法、装置、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Lee et al. | OpenMPC: Extended OpenMP programming and tuning for GPUs | |
US9489183B2 (en) | Tile communication operator | |
Rodrigues et al. | An MDE approach for automatic code generation from UML/MARTE to OpenCL | |
US20130283250A1 (en) | Thread Specific Compiler Generated Customization of Runtime Support for Application Programming Interfaces | |
Ziogas et al. | Productivity, portability, performance: Data-centric Python | |
US7983890B2 (en) | Method and apparatus performing automatic mapping for a multi-processor system | |
Meng et al. | Dataflow-driven GPU performance projection for multi-kernel transformations | |
Lee et al. | OpenMPC: extended OpenMP for efficient programming and tuning on GPUs | |
Viglas | Just-in-time compilation for SQL query processing | |
CN115904328A (zh) | 一种基于llvm中间语言的跨gpu架构的并行计算框架的转化方法 | |
Bloch et al. | Programming heterogeneous cpu-gpu systems by high-level dataflow synthesis | |
Dastgeer et al. | The PEPPHER composition tool: performance-aware composition for GPU-based systems | |
Lin et al. | Enable OpenCL compiler with Open64 infrastructures | |
Gebremedhin | Parmodelica: Extending the algorithmic subset ofmodelica with explicit parallel languageconstructs for multi-core simulation | |
Sakai et al. | Towards automating multi-dimensional data decomposition for executing a single-GPU code on a multi-GPU system | |
Harvey et al. | Parallel programming in actor-based applications via OpenCL | |
Hornung et al. | A case for improved C++ compiler support to enable performance portability in large physics simulation codes | |
Jacob et al. | Raising the Level of Abstraction of GPU-programming. | |
Fumero et al. | Using compiler snippets to exploit parallelism on heterogeneous hardware: a Java reduction case study | |
Barve et al. | Parallelism in C++ programs targeting objects | |
CN1687897A (zh) | 用户指导的程序半自动并行化方法 | |
Huchant | Static Analysis and Dynamic Adaptation of Parallelism. | |
US11556357B1 (en) | Systems, media, and methods for identifying loops of or implementing loops for a unit of computation | |
Cantiello et al. | Compilers, techniques, and tools for supporting programming heterogeneous many/multicore systems | |
Dong et al. | A Translation Framework for Virtual Execution Environment on CPU/GPU Architecture |
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 |