首页> 中国专利> 一种基于消除OpenCL运行时开销提高GPU程序性能的方法

一种基于消除OpenCL运行时开销提高GPU程序性能的方法

摘要

本申请提供一种基于消除OpenCL运行时开销提高GPU程序性能的方法,所述方法包括:步骤1:构建OpenCL Kerne l编译后代码的高效缓存机制,所述高效缓存机制包括缓存方式和缓存数据结构。步骤2:根据所述高效缓存机制,确定快速查找策略、更新策略及新节点插入方法。步骤3:根据所述快速查找策略、更新策略及新节点插入方法,确定启发式搜索队列的定义、启发式搜索队列的创建及启发式搜索队列的使用。步骤4:根据所述启发式搜索队列,确定运行时对缓存的使用策略,包含查找启发式搜索队列和查找缓存队列,自动判断待调用的OpenCL Kerne l是否需要编译,如果不需要,则返回已经编译好的OpenCL Kerne l;否则调用OpenCL Kerne l编译接口,对该OpenCL Kerne l进行编译,最终实现有效消除OpenCL运行时开销。

著录项

  • 公开/公告号CN114968253A

    专利类型发明专利

  • 公开/公告日2022-08-30

    原文格式PDF

  • 申请/专利权人 中国航空无线电电子研究所;

    申请/专利号CN202210465374.5

  • 申请日2022-04-29

  • 分类号G06F8/41(2018.01);

  • 代理机构中国航空专利中心 11008;

  • 代理人卫媛媛

  • 地址 200233 上海市徐汇区桂平路432号

  • 入库时间 2023-06-19 16:36:32

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-09-16

    实质审查的生效 IPC(主分类):G06F 8/41 专利申请号:2022104653745 申请日:20220429

    实质审查的生效

说明书

技术领域

本发明涉及异构计算技术领域,具体涉及一种基于消除OpenCL运行时开销提高GPU程序性能的方法。

背景技术

OpenCL(Open Computing Language,开放运算语言)程序采用运行时编译方法,也就是说只有在程序执行过程中,才对OpenCL kernel进行编译。OpenCL采用运行时编译的优势是可在不用重新编译OpenCL程序的情况下,能够充分利用新编译器的新特性。然而,运行时编译也存在一个重要的劣势:程序的整体执行时间包含了OpenCL Kernel的编译时间,OpenCL Kernel的运行时编译时间根据实现的不同,在0.5~2ms之间。虽然这么短的时间对于很多程序的执行来说,可以忽略不计。然而,存在两种情况,OpenCL Kernel的运行时编译时间会成为应用OpenCL程序性能的重要因素:

1、OpenCL Kernel本身的执行时间非常短;

2、应用程序会反复多次调用OpenCL kernel。

因此,如何消除或者减小OpenCL Kernel的运行时编译开销,对于OpenCL程序效率的提升具有非常重要的意义。

发明内容

本发明的发明目的采用以下技术方案实现:

一种基于消除OpenCL运行时开销提高GPU程序性能的方法,所述方法包括:

步骤1:构建OpenCL Kernel编译后代码的高效缓存机制,所述高效缓存机制包括缓存方式和缓存数据结构。

步骤2:根据所述高效缓存机制,确定快速查找策略、更新策略及新节点插入方法。

步骤3:根据所述快速查找策略、更新策略及新节点插入方法,确定启发式搜索队列的定义、启发式搜索队列的创建及启发式搜索队列的使用。

步骤4:根据所述启发式搜索队列,确定运行时对缓存的使用策略,包含查找启发式搜索队列和查找缓存队列,自动判断待调用的OpenCL Kernel是否需要编译,如果不需要,则返回已经编译好的OpenCL Kernel;否则调用OpenCL Kernel编译接口,对该OpenCLKernel进行编译,最终实现有效消除OpenCL运行时开销。

可选的,所述确定缓存方式包括:

OpenCL Kernel采用key-value的方式进行缓存,其中,key为kernel name+编译参数,作为OpenCL Kernel的唯一确认符;value为编译好的OpenCL Kernel。

可选的,所述确定缓存数据结构包括:

采用链表队列作为存储OpenCL Kernel的高速缓存方式。

可选的,所述快速查找策略包括:

直接通过Key值进行比较,如果比对成功,直接返回编译好的OpenCL Kernel,同时根据预先定义的更新策略更新整个队列;如果比对不成功,则返回NULL。

可选的,更新策略包括:

如果比对成功的节点为链表的前5个节点,则队列保持不变;

如果比对成功的节点不是链表的前5个节点,则将所述比对成功的节点插入到链表的首部。

可选的,新节点插入方法包括:

新节点插入到队列的第5位置。

可选的,所述启发式搜索队列的定义包括:

启发式搜索队列只包含kernel缓存队列中常用的kernel序列,采用key-value的链表表示,启发式搜索队列包含了应用中OpenCL Kernel的调用顺序,具有重复的kernel缓存节点,启发式搜索队列具有最大长度N。

可选的,所述启发式搜索队列的创建包括:

OpenCL程序每次调用kernel时,将对应的kernel节点插入到启发式搜索队列中,当启发式队列的长度等于2*N后,采用KMP算法获得最小重复队列,所述最小重复队列就是启发式搜索队列。

可选的,所述启发式搜索队列的使用包括:

OpenCL程序调用新kernel时,将key值与启发式队列的第一个节点进行比对,如果比对成功,则返回该kernel,并将该节点插入到队列末尾,如果访问不成功,则查询缓存队列,并将该节点插入到队列末尾。

可选的,所述查找启发式搜索队列包括:

首先根据Kernel生成的key查找启发式搜索队列,如果找到返回对应kernel,如果找不到,则搜索缓存队列;

所述查找缓存队列包括:

如果在缓存队列中找到对应的kernel,则将该kernel插入到对搜索队列中,并返回该kernel,如果找不到,则直接调用OpenCL中定义的kernel编译接口重新编译,实现有效消除OpenCL运行时开销。

本发明具有以下技术效果:

1、本发明提供的一种基于消除OpenCL运行时开销提高GPU程序性能的方法消除或者降低OpenCL Kernel运行时编译开销,提高OpenCL程序性能。

2、本发明提供的一种基于消除OpenCL运行时开销提高GPU程序性能的方法,对应用程序人员无感知,无需手动操作,提高了编程效率。

3、本发明提供的一种基于消除OpenCL运行时开销提高GPU程序性能的方法,可根据编译器的更新结果,随时更新OpenCL Kernel的编译结果。

附图说明

为进一步说明本发明的技术内容,以下结合附图及实施案例对本发明详细说明如下,其中:

图1为现有技术中的一个典型的深度学习网络的示意图;

图2为本申请实施例提供的一种基于消除OpenCL运行时开销提高GPU程序性能的方法的流程示意流程图。

具体实施方式

现有技术在深度学习应用中,越来越多的深度学习模型移植到嵌入式平台上,在嵌入式平台上执行整个深度学习网络完成深度学习的检测过程。如下面的一个典型深度学习网络如图1所示。

图1中,该深度学习网络共包含15层网络,其中conv层需要执行convolution(卷积)、batchnorm(批处理规范)和activation(激活)三个函数,对于这个15层的深度学习网络来说,会调用34次OpenCL Kernel。

以max_pooling(最大池化)层为例,当输入规模为208*208,Channel数目为32时,OpenCL Kernel总的执行时间分布如下:

执行时间:0.15ms

OpenCL kernel加载时间:0.537ms

OpenCL kernel总执行时间0.79ms

其中,OpenCL kernel的加载时间绝大部分为运行时编译时间。对于整个深度学习网络来说,总的OpenCL运行时编译时间可达18ms。对于实时的深度学习网络来说,网络的平均执行时间不能超过60ms,18ms的编译时间“太长”了。

所以,消除或者减小OpenCL Kernel的运行时编译开销,对于OpenCL程序效率的提升具有非常重要的意义。

OpenCL标准针对如何消除OpenCL kernel运行时编译开销的问题,提供了一个标准接口:clCreateProgramWithBi nary(用二进制代码创建cl程序)。该机制的核心是在OpenCL Kernel第一次运行时,将编译后的二进制代码保存(保存到文件或者缓存中),当该Kernel再次执行时,直接使用已编译好的二进制代码创建OpenCL Program(OpenCL程序),但仍然需要调用clBuildProgram(编译cl程序)接口。这种方法在能够在一定程度上减少OpenCL Kernel的编译时间,但是该方法也存在着很多缺陷:

1、依然需要调用clBuil dProgram,存在OpenCL kernel的编译时间;

2、二进制文件的缓存需要应用程序开发人员手工时间,增加了程序开发人员的编程负担,对应用程序开发人员的要求较高;

3、无统一实现标准,实现方法的优劣直接决定OpenCL程序的运行效率。

相对于上面现有解决方案的缺陷,本专利在无感知情况下大幅减低OpenCLKernel的运行时开销,从而提升整个基于OpenCL的GPU(graphics processing unit,图形处理器)程序的性能。

下面详细描述本发明的实施方式,所述实施方式的示例在附图中示出。

实施例一

本实施例详细的提供了一种基于消除OpenCL运行时开销提高GPU程序性能的方法,以图1中包含15层网络的整个深度学习网络来说,总的OpenCL运行时编译时间由18ms左右降低到2ms以内,具体流程如图2所示,方法包括:如图2所示,本申请提供一种基于消除OpenCL运行时开销提高GPU程序性能的方法,包括如下步骤:

步骤1:构建OpenCL Kernel编译后代码的高效缓存机制,所述高效缓存机制包括缓存方式和缓存数据结构。

需要说明的是,OpenCL Kernel为OpenCL内核程序,用OpenCL C编程语言编写,用OpenCL C编译器编译的函数,所有OpenCL实现都必须支持OpenCL内核和OpenCL C编程语言。

具体的,确定缓存方式:OpenCL Kernel采用key-value的方式进行缓存,其中,key为kernel name+编译参数,作为OpenCL Kernel的唯一确认符;value为编译好的OpenCLKernel。

具体的,确定缓存数据结构:采用链表队列作为存储OpenCL Kernel的高速缓存方式。

需要说明的是,采用链表队列的主要原因是链表队列便于查找和插入。

步骤2:根据所述高效缓存机制,确定快速查找策略、更新策略及新节点插入方法。

具体的,快速查找策略:直接通过Key值进行比较,如果比对成功,直接返回编译好的OpenCL Kernel,同时根据预先定义的更新策略更新整个队列;如果比对不成功,则返回NULL;

具体的,更新策略:如果比对成功的节点为链表的前5个节点,则队列保持不变;如果比对成功的节点不是链表的前5个节点,则将所述比对成功的节点插入到链表的首部;

需要说明的是,定义OpenCL Kernel的快速查找和更新策略,引入Cache机制和启发式的搜索策略,从根本上消除OpenCL Kernel的搜索开销。

具体的,新节点插入方法:新节点插入到队列的第5位置。

步骤3:根据所述快速查找策略、更新策略及新节点插入方法,确定启发式搜索队列的定义、启发式搜索队列的创建及启发式搜索队列的使用。

具体的,启发式搜索队列的定义:启发式搜索队列只包含kernel缓存队列中常用的kernel序列,依然采用key-value的链表表示,启发式搜索队列包含了应用中OpenCLKernel的调用顺序,具有重复的kernel缓存节点,启发式搜索队列具有最大长度N;

需要说明的是,常用的kernel序列指该算法中被调用次数靠前的几个kernel,根据算法不同而变化。

具体的,启发式搜索队列的创建:OpenCL程序每次调用kernel时,将对应的kernel节点插入到启发式搜索队列中,当启发式队列的长度等于2*N后,采用KMP算法获得最小重复队列,所述最小重复队列就是启发式搜索队列;

具体的,启发式搜索队列的使用:OpenCL程序调用新kernel时,将key值与启发式队列的第一个节点进行比对,如果比对成功,则返回该kernel,并将该节点插入到队列末尾,如果访问不成功,则查询缓存队列,并将该节点插入到队列末尾。

需要说明的是,字符串查找算法(KMP算法,Knuth-Morris-Pratt)是可以在文本串中快速查找模式串的一种算法。

实际应用中,通过定义启发式搜索队列能够从根本上消除OpenCL Kernel的搜索开销。

步骤4:根据所述启发式搜索队列,确定运行时对缓存的使用策略,包含查找启发式搜索队列和查找缓存队列,自动判断待调用的OpenCL Kernel是否需要编译,如果不需要,则返回已经编译好的OpenCL Kernel;否则调用OpenCL Kernel编译接口,对该OpenCLKernel进行编译,最终实现有效消除OpenCL运行时开销。

具体的,查找启发式搜索队列:首先根据Kernel生成的key查找启发式搜索队列,如果找到返回对应kernel,如果找不到,则搜索缓存队列;

具体的,查找缓存队列:如果在缓存队列中找到对应的kernel,则将该kernel插入到对应搜索队列中,并返回该kernel,如果找不到,则直接调用OpenCL中定义的kernel编译接口重新编译,实现有效消除OpenCL运行时开销。

综上所述,本申请提供一种基于消除OpenCL运行时开销提高GPU程序性能的方法,即减少OpenCL kernel运行时开销。该方法能够在应用程序开发人员无感知的情况下,自动决定待调用的OpenCL Kernel是否已经编译,从而消除或者降低OpenCL Kernel的运行时开销。本发明不仅可以大幅减低OpenCL Kernel的运行时开销,提升整个OpenCL程序的性能,而且是在程序员完全无感知情况下,不会增加应用程序开发人员的负担。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号