一种OpenCL内核程序中随机数产生方法及装置与流程

文档序号:11230119阅读:825来源:国知局
一种OpenCL内核程序中随机数产生方法及装置与流程

本发明涉及大数据处理技术领域,特别是涉及一种opencl内核程序中随机数产生方法及装置。



背景技术:

目前,异构计算主要是指使用不同体系架构的计算单元组成系统的计算方式,能够根据每个计算子系统的结构特点为其分配不同的计算任务,在提高服务器的计算性能、能效比和计算实时性方面体现出了传统架构所不具备的优势,其常见的计算单元类别包括cpu、gpu、dsp、asic、fpga等。现场可编程门阵列(fieldprogrammablegatearray,fpga)是一种新型的异构计算加速器件,由可编程的逻辑块和互联网络组成,可在不同逻辑执行多个线程,实现流水线并行处理,具有较强的并行处理能力。将fpga等专用芯片作为加速设备与cpu相配合形成fpga异构计算平台,能够在降低系统功耗的同时提升数据中心的计算能力,加速数据处理。传统的fpga开发以硬件描述语言(hdl)来实现并行运算,对开发者要求较高,开发周期也较长。opencl是由khronosgroup针对异构计算装置(heterogeneousdevice)所设计的标准api以及程式语言。自标准化之后,cpu和gpu厂商很快宣布其产品支持opencl编程模型。随着fpga厂商的opencl编译综合工具成熟化,fpga也实现了采用opencl高级语言的算法调试模式,并可直接写入fpga进行程序验证,为fpga广泛应用于通用计算领域进行应用快速开发提供了便利性保证。opencl程序包括主机端(host)程序和内核(kernel)程序两部分,其中内核程序即为核心算法的计算过程,在fpga上实现;主机端程序由cpu负责对内核程序进行数据传输和执行调度。

大数据处理是fpga异构计算的热门领域,涉及机器学习和数据挖掘的算法中随机数产生用于数据抽样仿真等问题是常用的计算手段,c和c++语言标准中提供了经典的伪随机数产生函数rand()函数,但是基于fpga的opencl高级编程模型的标准不支持rand伪随机数产生,使得数据挖掘算法中的数据抽样等操作在fpga异构计算平台上不能实现并行优化,影响了算法的整体性能。



技术实现要素:

本发明的目的是提供一种opencl内核程序中随机数产生方法及装置,以解决opencl标准中不能实现随机数产生的问题。

为解决上述技术问题,本发明提供一种opencl内核程序中随机数产生方法,该方法包括:

在内核程序中设置随机种子参数,利用伪随机数计算公式计算得到随机数;

将新的随机种子参数保存于移位寄存器数组的第一位;

通过倒序移位方法控制新的随机种子参数移动到移位寄存器数组的最后一位。

优选的,利用伪随机数计算公式计算得到随机数,包括:

对随机种子参数进行初始化,对上次计算得到的随机种子参数进行更新得到新的随机种子参数,利用新的随机种子参数计算得到新的随机参数。

优选的,将新的随机种子参数保存于移位寄存器数组的第一位之前,还包括:

定义一个移位寄存器数组,将移位寄存器数组最后一位用于更新随机种子参数。

优选的,所述通过倒序移位方法控制新的随机种子参数移动到移位寄存器数组的最后一位,包括:

每次产生随机数后,对移位寄存器进行倒序移位,将新的随机种子逐渐移位到移位寄存器数组的最后一位,用于参与下个随机数的计算。

本发明还提供一种opencl内核程序中随机数产生装置,用于实现上述方法,包括:

计算模块,用于在内核程序中设置随机种子参数,利用伪随机数计算公式计算得到随机数;

保存模块,用于将新的随机种子参数保存于移位寄存器数组的第一位;

移动模块,用于通过倒序移位方法控制新的随机种子参数移动到移位寄存器数组的最后一位。

优选的,所述计算模块具体用于在内核程序中设置随机种子参数,对随机种子参数进行初始化,对上次计算得到的随机种子参数进行更新得到新的随机种子参数,利用新的随机种子参数计算得到新的随机参数。

优选的,所述保存模块还包括:

定义单元,用于定义一个移位寄存器数组,将移位寄存器数组最后一位用于更新随机种子参数。

优选的,所述移动模块具体用于每次产生随机数后,对移位寄存器进行倒序移位,将新的随机种子逐渐移位到移位寄存器数组的最后一位,用于参与下个随机数的计算。

本发明所提供的一种opencl内核程序中随机数产生方法及装置,在内核程序中设置随机种子参数,利用伪随机数计算公式计算得到随机数;将新的随机种子参数保存于移位寄存器数组的第一位;通过倒序移位方法控制新的随机种子参数移动到移位寄存器数组的最后一位。可见,始终将随机种子中间结果即新的随机种子参数保存于移位寄存器数组的第一位,通过倒序移位控制随机种子移动到寄存器数组的最后一位,最后一位始终用于伪随机数计算公式中更新随机种子参数,这样利用伪随机随机数计算公式解决opencl标准不支持c语言标准中的rand随机数产生函数的问题,并利用移位寄存器倒序移位策略解决了计算公式中的参数依赖问题,能够在opencl的内核函数中产生随机数,解决opencl标准中不能实现随机数产生的问题。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本发明所提供的一种opencl内核程序中随机数产生方法的流程图;

图2为opencl代码在fpga中并行计算流程示意图;

图3为本发明所提供的一种opencl内核程序中随机数产生装置的结构示意图。

具体实施方式

本发明的核心是提供一种opencl内核程序中随机数产生方法及装置,以解决opencl标准中不能实现随机数产生的问题。

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参考图1,图1为本发明所提供的一种opencl内核程序中随机数产生方法的流程图,该方法包括:

s11:在内核程序中设置随机种子参数,利用伪随机数计算公式计算得到随机数;

s12:将新的随机种子参数保存于移位寄存器数组的第一位;

s13:通过倒序移位方法控制新的随机种子参数移动到移位寄存器数组的最后一位。

可见,该方法中,始终将随机种子中间结果即新的随机种子参数保存于移位寄存器数组的第一位,通过倒序移位控制随机种子移动到寄存器数组的最后一位,最后一位始终用于伪随机数计算公式中更新随机种子参数,这样利用伪随机随机数计算公式解决opencl标准不支持c语言标准中的rand随机数产生函数的问题,并利用移位寄存器倒序移位策略解决了计算公式中的参数依赖问题,能够在opencl的内核函数中产生随机数,解决opencl标准中不能实现随机数产生的问题。

基于上述方法,进一步的,步骤s11中,利用伪随机数计算公式计算得到随机数的过程具体为:对随机种子参数进行初始化,对上次计算得到的随机种子参数进行更新得到新的随机种子参数,利用新的随机种子参数计算得到新的随机参数。

进一步的的,步骤s12之前还包括:定义一个移位寄存器数组,将移位寄存器数组最后一位用于更新随机种子参数。

进一步的,步骤s13的过程具体为:每次产生随机数后,对移位寄存器进行倒序移位,将新的随机种子逐渐移位到移位寄存器数组的最后一位,用于参与下个随机数的计算。

本发明主要利用基于opencl标准的fpga对大数据处理算法实现加速设计,利用随机数函数计算公式解决opencl标准不支持c语言标准中的rand随机数产生函数的问题,并利用移位寄存器倒序移位策略解决了计算公式中的参数依赖问题,能够在opencl的kernel(内核)函数中产生随机数,并利用循环开展实现算法的并行化优化,提高了opencl编程模型在算法优化中的应用范围和算法的计算性能。

其中,在opencl的kernel函数中实现随机数产生,利用移位寄存器倒序移位方法解决算法中的数据依赖,提升算法性能。

其中,kernel函数在fpga上进行计算的算法部分进行unroll全展开,进一步并行优化提升算法在fpga上的计算性能。

发明提供了一种opencl内核程序中随机数产生算法的并行优化设计方法,该方案充分利用移位寄存器,在内核程序中定义伪随机数产生计算公式,并用移位寄存器倒序移位解决计算公式中的参数依赖,在多个随机数产生计算过程中实现流水线的全部展开并行计算,进一步提升了分布式框架下算法的计算性能。

本方法主要是解决opencl标准中不能实现随机数产生的问题,首先在kernel程序中设置随机种子参数,利用伪随机数计算公式计算产生随机数,然后始终将随机种子中间结果保存于移位寄存器数组的第0位,通过倒序移位控制随机种子移动到寄存器数组的第2位,该位始终用于伪随机数计算公式中更新随机种子参数,此方法解决了循环产生多个随机数时随机种子参数存在数据依赖的问题,最终通过fpga中循环展开,实现并行计算,同时产生多个随机数用于其他数据处理操作,如sql查询中的随机抽样等,进一步提升了算法的并行性。

在kernel中利用伪随机数计算公式产生n个随机数的伪代码如下所示:

首先对随机种子进行初始化,每次产生新的随机数时利用上次计算得到的随机种子更新得到新的随机种子,然后利用新的随机种子参数计算得到新的随机数;该计算方法简单有效,但是在fpga中计算时,随机种子参数存在前后依赖关系,无法并行展开计算,影响了计算性能;经过移位寄存器移位处理保存中间结果的伪代码如下所示:

首先定义一个移位寄存器数组,数组最后一位用于更新随机种子参数,每次产生随机数后,对寄存器进行倒序移位,更新移位寄存器最后一位的值,并将计算的新的随机种子保存于数组第一位;如此循环计算随机数时,随机种子更新只与寄存器数组的最后一位有关,与其他参数无关,数据依赖消除,在fpga中可以实现循环展开并行计算,fpga中并行计算流程如图2所示。

在kernel中利用伪随机数计算公式产生n个随机数的伪代码中,首先设置随机数产生的范围和初始化随机种子参数,然后利用常用的类c语言标准中的rand()随机数产生函数的计算公式计算更新新的随机种子,并利用计算得到的随机种子计算得到随机数。由于该计算算法设计在fpga上执行时存在数据依赖,导致在循环展开并行计算时时钟周期较大,计算性能不理想。经过移位寄存器移位处理保存中间结果的伪代码中,增加了移位寄存器数组设置,每次用数组的最后一位参与计算随机种子,并将计算得到的新的随机种子暂放在寄存器数组的第一位,通过倒序移位的方法,将新的随机种子逐渐移动到数组最后一位,参与下个随机数的计算,此方法有效的解决了随机数计算时随机种子的数据依赖问题,使的fpga的时钟周期优化为最优cycle=1;解决数据依赖后的opencl内核程序可以通过循环展开的方式,提高fpga计算的并行性,进一步提升算法的计算性能,算法计算流程如图2所示。

具体的,本发明首先将随机数产生函数用opencl高级编程语言编码实现,在fpga板卡本地内存中设置移位寄存器用于保存随机种子的中间结果,并通过倒序移位将随机种子逐渐移动到数组最后一位用于下一个随机数的计算中,解决数据依赖问题,使得opencl核心代码的时钟周期优化为最优1,最后通过循环展开提高opencl内核程序在fpga上计算时的并行性,提高计算性能。

请参考图3,图3为本发明所提供的一种opencl内核程序中随机数产生装置的结构示意图,该装置用于实现上述opencl内核程序中随机数产生方法,该装置包括:

计算模块101,用于在内核程序中设置随机种子参数,利用伪随机数计算公式计算得到随机数;

保存模块102,用于将新的随机种子参数保存于移位寄存器数组的第一位;

移动模块103,用于通过倒序移位方法控制新的随机种子参数移动到移位寄存器数组的最后一位。

可见,该装置中,始终将随机种子中间结果即新的随机种子参数保存于移位寄存器数组的第一位,通过倒序移位控制随机种子移动到寄存器数组的最后一位,最后一位始终用于伪随机数计算公式中更新随机种子参数,这样利用伪随机随机数计算公式解决opencl标准不支持c语言标准中的rand随机数产生函数的问题,并利用移位寄存器倒序移位策略解决了计算公式中的参数依赖问题,能够在opencl的内核函数中产生随机数,解决opencl标准中不能实现随机数产生的问题。

基于上述装置,进一步的,计算模块具体用于在内核程序中设置随机种子参数,对随机种子参数进行初始化,对上次计算得到的随机种子参数进行更新得到新的随机种子参数,利用新的随机种子参数计算得到新的随机参数。

进一步的,保存模块还包括:定义单元,用于定义一个移位寄存器数组,将移位寄存器数组最后一位用于更新随机种子参数。

进一步的,移动模块具体用于每次产生随机数后,对移位寄存器进行倒序移位,将新的随机种子逐渐移位到移位寄存器数组的最后一位,用于参与下个随机数的计算。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

以上对本发明所提供的一种opencl内核程序中随机数产生方法及装置进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1