一种OpenCL内核提交的方法及装置与流程

文档序号:24120530发布日期:2021-03-02 11:06阅读:46来源:国知局
一种OpenCL内核提交的方法及装置与流程
一种opencl内核提交的方法及装置
技术领域
[0001]
本发明涉及计算机高性能并行计算领域,特别是涉及一种opencl内核提交的方法及装置。


背景技术:

[0002]
近年来,高性能并行计算技术快速发展,opencl作为并行计算的通用标准被各大芯片厂商广泛采用。
[0003]
opencl是为了解决不同架构的硬件间的并行计算问题而产生的,opencl标准能够让开发人员专注于算法的设计和优化,而不需要关注各个平台的编程语言以及底层硬件的细节等问题,极大的提高了开发效率。
[0004]
opencl内核通俗来讲就是在硬件中执行的一个函数,计算设备中的每个计算单元都会执行相同的函数,但是使用的数据却不同,从而达到并行运算高效处理大量数据的目的。opencl标准只规定了通用的编程框架,具体的计算方法仍需要各大厂商自行设计。


技术实现要素:

[0005]
本发明的目的是为了克服上述背景技术的不足,提供一种opencl内核提交的方法及装置,使其在保证满足opencl标准框架的前提下,给硬件合理的分配工作任务,将opencl内核提交到硬件进行执行,提高并行运算的效率。
[0006]
本发明提供的一种opencl内核提交的方法,包括如下步骤:s1、在主机程序中创建内核后,将内核信息传递给opencl的内核提交模块;s2、检查工作项维度是否满足从一维转二维的条件,若满足则进行转换;s3、检查opencl内核是否使用了局部内存,若使用了该类型的变量,则在特定存储区域申请相应大小的空间保存该变量;s4、检查opencl内核中是否设置了局部工作组的大小,若已设置则需要判断设置的数据是否合法,若不合法或未设置则自适应分配一个合适的局部工作组项数;s5、启动opencl的工作线程,将包含opencl内核信息的命令缓冲提交到硬件设备。
[0007]
在上述技术方案中,所述步骤s2包括如下子步骤:s21、判断工作项维度的大小和全局工作项数量的值,若同时满足维度为1且全局工作项数量的值大于最大全局工作项数量这两个条件,则执行子步骤s22,若不满足条件,则跳转执行步骤s3;s22、首先取一个值base作为一个基数,用来将工作项的维度由1维变为2维,若在步骤s1中传递的参数中设置了局部工作组项数的值,则将其值作为base的初始值,否则令base为一个合适的初始常数值,这个值取决于设备所能支持的最大并行工作项数量和工作组数量;s23、用全局工作项数量的值除以base,设得到的商为result,得到的余数为mod;s24、判断result的大小,若小于或等于最大全局工作项数量,则继续判断mod的值,若不为0,则转化后的2维工作项大小为globalworksize[result+1,base];若为0,则转化后的2维工作项大小globalworksize[result,base];若result的值大于maxglobalworksize,则将base变为原来的2倍并跳转到子步骤s23;s25、检查opencl内核中是否设置了参数全局偏移量的值,若设置了全局偏移量
的值且不为0,则将全局偏移量的值去除以子步骤s21到子步骤s24中得到的base值,得到的新的商为result_offset和余数mod_offset,得到转化后的2维数组偏移量大小为globalworkoffset[result_offset,result_mod]。
[0008]
在上述技术方案中,所述步骤s3包括如下子步骤:s31、从opencl内核中依次读取所有设置为opencl局部内存类型的变量,计算它们各自的大小,得到需要的空间大小之和;s32、从设备上动态分配一块所需空间之和容量的非主机内存;s33、将所有的opencl局部内存类型变量的值写入到所述非主机内存区域中,并返回相对应的指针以供后续访问。
[0009]
在上述技术方案中,所述步骤s4包括如下子步骤:s41、检查opencl内核中是否设置了局部工作组的大小,若已设置则检查全局工作项大小是否与局部工作组大小成倍数关系且局部工作组的值小于最大局部工作组大小,若满足关系则执行子步骤s51,若不满足关系则执行子步骤s42;s42、给局部工作组预设一个值size,对每一个维度的工作项,比较最大全局工作项数量除以size的商和最大工作组数量的大小关系,若前者小于或等于后者,则取size为最终的局部工作组在对应维度上的值;否则执行子步骤s43;s43、将size变为原来的两倍,并比较此时的size是否大于最大局部工作组大小,若是则取size的一半为局部工作组在对应维度上的值,否则跳转到子步骤s42。
[0010]
在上述技术方案中,所述步骤s5包括如下子步骤:s51、刷新相关着色器状态以及指令这些相关数据,根据工作项的分配情况计算执行opencl内核所要分配的线程数;s52、将opencl内核的信息传递给计算设备系统的命令队列中,修改命令队列的状态,使得包含opencl内核信息的命令进入硬件设备中,以指定的线程数并行执行,最终完成opencl内核的提交。
[0011]
本发明还提供了一种opencl内核提交的装置,包括如下部分:内核信息创建提交模块:在主机程序中创建内核后,将内核信息传递给opencl的内核提交模块;工作项维度转换模块:检查工作项维度是否满足从一维转二维的条件,若满足则进行转换;局部内存变量模块:检查opencl内核是否使用了局部内存,若使用了该类型的变量,则在特定存储区域申请相应大小的空间保存该变量;局部工作组模块:检查opencl内核中是否设置了局部工作组的大小,若已设置则需要判断设置的数据是否合法,若不合法或未设置则自适应分配一个合适的局部工作组项数;opencl工作线程模块:启动opencl的工作线程,将包含opencl内核信息的命令缓冲提交到硬件设备。
[0012]
在上述技术方案中,所述工作项维度转换模块包括如下单元:工作项维度判断单元:判断工作项维度的大小和全局工作项数量的值,若同时满足维度为1且全局工作项数量的值大于最大全局工作项数量这两个条件,则执行base值设定单元,若不满足条件,则跳转执行局部内存变量模块;base值设定单元:首先取一个值base作为一个基数,用来将工作项的维度由1维变为2维,若在内核信息创建提交模块中传递的参数中设置了局部工作组项数的值,则将其值作为base的初始值,否则令base为一个合适的初始常数值,这个值取决于设备所能支持的最大并行工作项数量和工作组数量;全局工作项数量除法单元:用全局工作项数量的值除以base,设得到的商为result,得到的余数为mod;result大小判断单元:判断result的大小,若小于或等于最大全局工作项数量,则继续判断mod的值,若不为0,则转化后的2维工作项大小为globalworksize[result+1,base];若为0,则转化后的2维工作项大小globalworksize[result,base];若result的值大于maxglobalworksize,则将base变为
原来的2倍并跳转到子步骤s23;全局偏移量单元:检查opencl内核中是否设置了参数全局偏移量的值,若设置了全局偏移量的值且不为0,则将全局偏移量的值去分别除以工作项维度判断单元、base值设定单元、全局工作项数量除法单元和result大小判断单元中得到的base值,得到的新的商为result_offset和余数mod_offset,得到转化后的2维数组偏移量大小为globalworkoffset[result_offset,result_mod]。
[0013]
在上述技术方案中,所述局部内存变量模块包括如下单元:opencl局部内存变量单元:从opencl内核中依次读取所有设置为opencl局部内存类型的变量,计算它们各自的大小,得到需要的空间大小之和;动态分配单元:从设备上动态分配一块所需空间之和容量的非主机内存;opencl局部内存变量写入单元:将所有的opencl局部内存类型变量的值写入到所述非主机内存区域中,并返回相对应的指针以供后续访问。
[0014]
在上述技术方案中,所述局部工作组模块包括如下单元:局部工作组判断单元:检查opencl内核中是否设置了局部工作组的大小,若已设置则检查全局工作项大小是否与局部工作组大小成倍数关系且局部工作组的值小于最大局部工作组大小,若满足关系则执行opencl内核线程分配单元,若不满足关系则执行局部工作组值size预设单元;局部工作组值size预设单元:给局部工作组预设一个值size,对每一个维度的工作项,比较最大全局工作项数量除以size的商和最大工作组数量的大小关系,若前者小于或等于后者,则取size为最终的局部工作组在对应维度上的值;否则执行局部工作组值size比较单元;局部工作组值size比较单元:将size变为原来的两倍,并比较此时的size是否大于最大局部工作组大小,若是则取size的一半为局部工作组在对应维度上的值,否则跳转到局部工作组值size预设单元。
[0015]
在上述技术方案中,所述opencl工作线程模块包括如下单元:opencl内核线程分配单元:刷新相关着色器状态以及指令这些相关数据,根据工作项的分配情况计算执行opencl内核所要分配的线程数;opencl内核信息提交单元:将opencl内核的信息传递给计算设备系统的命令队列中,修改命令队列的状态,使得包含opencl内核信息的命令进入硬件设备中,以指定的线程数并行执行,最终完成opencl内核的提交。
[0016]
本发明opencl内核提交的方法及装置,具有以下有益效果:
[0017]
在满足opencl标准框架的前提下,通过给硬件合理的分配工作任务,将opencl内核提交到硬件进行执行,提高了并行运算的效率。
附图说明
[0018]
图1为本发明opencl内核提交的方法的整体流程示意图;
[0019]
图2为本发明opencl内核提交的方法中步骤s2的流程示意图;
[0020]
图3为本发明opencl内核提交的方法中步骤s3的流程示意图;
[0021]
图4为本发明opencl内核提交的方法中步骤s4的流程示意图;
[0022]
图5为本发明opencl内核提交的方法中步骤s5的流程示意图;
[0023]
图6为本发明opencl内核提交的装置的整体结构示意图;
[0024]
图7为本发明opencl内核提交的装置中工作项维度转换模块的结构示意图;
[0025]
图8为本发明opencl内核提交的装置中局部内存变量模块的结构示意图;
[0026]
图9为本发明opencl内核提交的装置中局部工作组模块的结构示意图;
[0027]
图10为本发明opencl内核提交的装置中opencl工作线程模块的结构示意图。
具体实施方式
[0028]
下面结合附图及实施例对本发明作进一步的详细描述,但该实施例不应理解为对本发明的限制。
[0029]
如图1所示,本发明提供了一种opencl内核提交的方法,其包括如下步骤:
[0030]
s1、在主机程序中创建内核后,将内核信息传递给opencl的内核提交模块。
[0031]
s2、检查工作项维度是否满足从一维转二维的条件,若满足则进行转换。
[0032]
可选地,如图2所示,所述步骤s2包括如下子步骤:
[0033]
s21、判断工作项维度的大小和globalworksize(全局工作项数量)的值,若同时满足维度为1且globalworksize的值大于maxglobalworksize(最大全局工作项数量)这两个条件,则执行步骤s22,若不满足条件,则跳转执行步骤s3。
[0034]
s22、首先取一个值base作为一个基数,用来将工作项的维度由1维变为2维,若在s1中传递的参数中设置了localworksize(局部工作组项数)的值,则将其值作为base的初始值,否则令base为一个合适的初始常数值,这个值取决于设备所能支持的最大并行工作项数量和工作组数量。
[0035]
s23、用globalworksize的值除以base,设得到的商为result,得到的余数为mod。
[0036]
s24、判断result的大小,若小于或等于maxglobalworksize,则继续判断mod的值,若不为0,则转化后的2维工作项大小为globalworksize[result+1,base];若为0,则转化后的2维工作项大小globalworksize[result,base]。若result的值大于maxglobalworksize,则将base变为原来的2倍并跳转到步骤s23。
[0037]
s25、检查opencl内核中是否设置了参数globalworkoffset(全局偏移量)的值,若设置了globalworkoffset的值且不为0,则将globalworkoffset的值去除以步骤s21到s24中得到的base值,得到的新的商为result_offset和余数mod_offset,得到转化后的2维数组偏移量大小为globalworkoffset[result_offset,result_mod]。
[0038]
s3、检查opencl内核是否使用了局部内存,若使用了该类型的变量,则在特定存储区域申请相应大小的空间保存该变量。
[0039]
可选地,如图3所示,所述步骤s3包括如下子步骤
[0040]
s31、从opencl内核中依次读取所有设置为opencl局部内存类型的变量,计算它们各自的大小,得到需要的空间大小之和。
[0041]
s32、从设备上动态分配一块所需空间之和容量的非主机内存。
[0042]
s33、将所有的opencl局部内存类型变量的值写入到这块内存区域中,并返回相对应的指针以供后续访问。
[0043]
s4、检查opencl内核中是否设置了局部工作组的大小,若已设置则需要判断设置的数据是否合法,若不合法或未设置则自适应分配一个合适的局部工作组大小。
[0044]
可选地,如图4所示,所述步骤s4包括如下子步骤:
[0045]
s41、检查opencl内核中是否设置了局部工作组的大小,若已设置则检查全局工作项大小是否与局部工作组大小成倍数关系且局部工作组的值小于maxlocalworksize(最大局部工作组大小),若满足关系则执行步骤s51,若不满足关系则执行步骤s42。
[0046]
s42、给localworksize(局部工作组)预设一个值size,这个值的大小取决于计算设备的着色器核心的数量。对每一个维度的工作项,比较maxglobalworksize(最大工作项数量)除以size的商和maxworkgroupcount(最大工作组数量)的大小关系,若前者小于或等于后者,则取size为最终的localworksize在对应维度上的值;否则执行步骤s43。
[0047]
s43、将size变为原来的两倍,并比较此时的size是否大于maxlocalworksize(最大局部工作组大小),若是则取size的一半为localworksize在对应维度上的值,否则跳转到步骤s42。
[0048]
s5、启动opencl的工作线程,将包含opencl内核信息的命令缓冲提交到硬件设备。
[0049]
可选地,如图5所示,所述步骤s5包括如下子步骤:
[0050]
s51、刷新相关着色器状态以及指令等相关数据,根据工作项的分配情况计算执行opencl内核所要分配的线程数。
[0051]
s52、将opencl内核的信息传递给计算设备系统的命令队列中,修改命令队列的状态,使得包含有opencl内核信息的命令进入硬件设备中,以指定的线程数并行执行,最终完成opencl内核的提交。
[0052]
如图6所示,本发明还提供了一种opencl内核提交的装置,包括如下部分:
[0053]
内核信息创建提交模块:在主机程序中创建内核后,将内核信息传递给opencl的内核提交模块;
[0054]
工作项维度转换模块:检查工作项维度是否满足从一维转二维的条件,若满足则进行转换;
[0055]
可选地,如图7所示,所述工作项维度转换模块包括如下单元:
[0056]
工作项维度判断单元:判断工作项维度的大小和全局工作项数量的值,若同时满足维度为1且全局工作项数量的值大于最大全局工作项数量这两个条件,则执行base值设定单元,若不满足条件,则跳转执行局部内存变量模块;
[0057]
base值设定单元:首先取一个值base作为一个基数,用来将工作项的维度由1维变为2维,若在内核信息创建提交模块中传递的参数中设置了局部工作组项数的值,则将其值作为base的初始值,否则令base为一个合适的初始常数值,这个值取决于设备所能支持的最大并行工作项数量和工作组数量;
[0058]
全局工作项数量除法单元:用全局工作项数量的值除以base,设得到的商为result,得到的余数为mod;
[0059]
result大小判断单元:判断result的大小,若小于或等于最大全局工作项数量,则继续判断mod的值,若不为0,则转化后的2维工作项大小为globalworksize[result+1,base];若为0,则转化后的2维工作项大小globalworksize[result,base];若result的值大于maxglobalworksize,则将base变为原来的2倍并跳转到子步骤s23;
[0060]
全局偏移量单元:检查opencl内核中是否设置了参数全局偏移量的值,若设置了全局偏移量的值且不为0,则将全局偏移量的值去分别除以工作项维度判断单元、base值设定单元、全局工作项数量除法单元和result大小判断单元中得到的base值,得到的新的商为result_offset和余数mod_offset,得到转化后的2维数组偏移量大小为globalworkoffset[result_offset,result_mod];
[0061]
局部内存变量模块:检查opencl内核是否使用了局部内存,若使用了该类型的变
量,则在特定存储区域申请相应大小的空间保存该变量;
[0062]
可选地,如图8所示,所述局部内存变量模块包括如下单元:
[0063]
opencl局部内存变量单元:从opencl内核中依次读取所有设置为opencl局部内存类型的变量,计算它们各自的大小,得到需要的空间大小之和;
[0064]
动态分配单元:从设备上动态分配一块所需空间之和容量的非主机内存;
[0065]
opencl局部内存变量写入单元:将所有的opencl局部内存类型变量的值写入到所述非主机内存区域中,并返回相对应的指针以供后续访问;
[0066]
局部工作组模块:检查opencl内核中是否设置了局部工作组的大小,若已设置则需要判断设置的数据是否合法,若不合法或未设置则自适应分配一个合适的局部工作组项数;
[0067]
可选地,如图9所示,所述局部工作组模块包括如下单元:
[0068]
局部工作组判断单元:检查opencl内核中是否设置了局部工作组的大小,若已设置则检查全局工作项大小是否与局部工作组大小成倍数关系且局部工作组的值小于最大局部工作组大小,若满足关系则执行opencl内核线程分配单元,若不满足关系则执行局部工作组值size预设单元;
[0069]
局部工作组值size预设单元:给局部工作组预设一个值size,对每一个维度的工作项,比较最大全局工作项数量除以size的商和最大工作组数量的大小关系,若前者小于或等于后者,则取size为最终的局部工作组在对应维度上的值;否则执行局部工作组值size比较单元;
[0070]
局部工作组值size比较单元:将size变为原来的两倍,并比较此时的size是否大于最大局部工作组大小,若是则取size的一半为局部工作组在对应维度上的值,否则跳转到局部工作组值size预设单元;
[0071]
opencl工作线程模块:启动opencl的工作线程,将包含opencl内核信息的命令缓冲提交到硬件设备;
[0072]
可选地,如图10所示,所述opencl工作线程模块包括如下单元:
[0073]
opencl内核线程分配单元:刷新相关着色器状态以及指令这些相关数据,根据工作项的分配情况计算执行opencl内核所要分配的线程数;
[0074]
opencl内核信息提交单元:将opencl内核的信息传递给计算设备系统的命令队列中,修改命令队列的状态,使得包含opencl内核信息的命令进入硬件设备中,以指定的线程数并行执行,最终完成opencl内核的提交。
[0075]
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
[0076]
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1