一种基于cuda的种子分布数据并行获取方法

文档序号:6365060阅读:461来源:国知局
专利名称:一种基于cuda的种子分布数据并行获取方法
技术领域
本发明涉及一种种子分布数据并行获取方法。
背景技术
种子分布计算是森林群落更新繁殖体的主要来源,是森林演化计算的重要子过程。森林中种子的分布情况是成熟成年树生产种子并扩散的结果。种子通过扩散进入森林样地,随着土壤基质的促进作用萌发成幼苗,幼苗受环境条件影响生长成幼年树甚至成年树。生长状况不好的树木会出现衰弱死亡,而个体成熟的成年树继续生产种子,为森林提供天然更新的物质基础。种子分布、萌芽、树木生长和死亡构成森林演化的动态循环过程,反映森林群落的发展情况。种子分布主要受个体胸径(高I. 3米处的树干直径)大小和树种两个因素限制,胸径越大表示越成熟,种子生产能力越强;种子的扩散与树种特性有关,表示为扩散内径曲线。一般来说,某种子分布点距离种子源(产生种子的成年树)越近,扩散到该点的种子数越多;距离越远,数量越小。不同树种扩散距离不同。森林样地里某个种子分布点的种子总量受所有树木个体生产扩散累积。通常,森林样地被简化模拟成矩形区域,由X-Y坐标系统离散化为多个面积相同的样地单元,以每个样地单元的中心点表示样地单元的种子分布点。本系统采用的种子分布模型如下所示,示意图见图I:
权利要求
1.一种基于CUDA的种子分布数据并行获取方法,其特征在于该获取方法在CUDA架构下,在CPU上执行的主机端和在GPU上执行的设备端;所述种子分布数据并行获取方法包括以下步骤 (1)、输入数据内存空间分配并初始化根据样地单元规模分配内存空间存放每个样地单元中心坐标;根据成年树规模分别分配内存空间存放成年树的胸径、空间坐标并初始化;根据种子分布模型所需常量参数分配内存空间并初始化; (2)、输入数据显存空间分配调用CUDAAPI函数cudaMalloc在显存的全局存储器中分配空间用于存放样地单元和成年树数据; (3)、内存到显存的输入数据传输调用CUDAAPI函数cudaMemcpy,将以上输入数据从内存复制到全局存储器对应区域,并调用CudaMemcpyToSymbol将各常量参数直接复制到常量存储器; (4)、输出数据显存空间分配根据内核配置情况分配显存空间,用于存放设备端的计算结果; (5)、输出数据内存空间分配; (6)、设置设备端内核执行配置,调用设备端内核函数计算种子分布,设备端内核函数计算步骤如下 (6. I)根据CUDA内建函数获得线程块的Y索引,即目标样地单元,记为bid_y ; (6. 2)在0号线程中根据bid_y读取目标样地单元的空间坐标保存到共享存储器;初始化数组seeds_thread各元素为0 ;调用CUDA同步函数—syncthreads (),使得块内所有线程在初始化完成后再进行种子分布数计算累加; (6. 3)根据CUDA内建函数获得该线程所在线程网格的X索引,记为tid_x,表示参与该线程计算的成年树集;设置寄存器变量,对每棵成年树i,i < n(n为常量),根据索引tid_xXn+i获得成年树的胸径和空间位置,按照种子分布计算公式计算种子数并累加到寄存器变量;待n次迭加完成后,将该寄存器变量写入共享存储器seedsjhread数组中; (6. 4)调用CUDA同步函数—syncthreads (),采用树形规约算法,通过多线程并发执行实现每个线程的种子数累加操作,得到该线程块的种子贡献总数; 树形规约算法中,s表示数组长度,初始值为T,对于seedsjhread数组的前半部分元素,每一个与比其索引大s的元素相加后更新其值,每次迭代后将s值减半; (6. 5)在0号线程根据线程块索引将结果保存至全局存储器seedsjDlock中,得到种子分布。
2.如权利要求I所述的一种基于CUDA的种子分布数据并行获取方法,其特征在于所述种子分布数据并行获取方法还包括包括以下步骤 ⑵、显存到内存的输出数据传输,调用CUDA API函数cudaMemcpy,将设备端的种子分布计算结果从显存复制到内存相应区域; (8)处理计算结果; (9)释放显存空间,释放内存空间。
3.如权利要求I或2所述的一种基于CUDA的种子分布数据并行获取方法,其特征在于所述步骤¢)中的内核执行配置包括根据种子分布的计算特性划分设备端线程网格和存储器访问模式设置;线程网格用二维表示,X维度表示贡献种子的成年树个体,Y维度表示分布到种子的各样地单元,每个线程块计算一定数量成年树对一个样地单元的种子贡献数;相同Y维度的线程块负责对同一个样地单元的种子数计算;同时;在全局存储器中分配一维线性数组seedsjDlock用于存储每个线程块贡献的种子数;该数组中属于同一样地单元的元素值之和即为该样地单元的种子数终值; 假设共有A棵成年树,每个线程块包含T个线程,每个线程处理n棵成年树,那么X维度共划分为A /(nXT)个线程块;Y维度的线程块数取决于样地单元总数和显卡配置;若以TL表示该内核执行的总线程数上限,那么Y维度的线程块数为(TLXn)/A ;若样地单元总数大于该数值,那么样地单元被分成若干批执行,通过多次执行内核函数完成对所有样地单元的计算; 在所述内核函数中,利用共享存储器存储两部分数据,一是目标样地单元数据;二是每个线程n棵成年树贡献的种子数和,表示为float型数组seeds_thread,该内核共需开辟的共享存储器大小为(T+2) X 4字节,其中T表示seedsjhread数组长度,即块内线程数;2表示目标样地单元X,Y方向上的空间坐标;4表示每个float型占4个字节。
4.如权利要求2所述的一种基于CUDA的种子分布数据并行获取方法,其特征在于所述步骤¢)的内核函数执行完毕后,按照步骤(7)将seedsjDlock数组拷贝回内存。根据所述步骤(8),在CPU端将seedsjDlock中属于同一样地单元的块结果再做累加操作,获得各样地单元的种子数终值。
全文摘要
一种基于CUDA的种子分布数据并行获取方法,该方法在CUDA架构下,在CPU上执行的主机端和在GPU上执行的设备端;所述种子分布数据并行获取方法包括以下步骤(1)、输入数据内存空间分配并初始化;(2)、输入数据显存空间分配;(3)、内存到显存的输入数据传输;(4)、输出数据显存空间分配;(5)、输出数据内存空间分配;(6)、设置设备端内核执行配置,调用设备端内核函数计算种子分布。本发明提供一种在确保精度的同时获得较好的计算性能、降低演化仿真时间的基于CUDA的种子分布数据并行获取方法。
文档编号G06F17/30GK102662641SQ20121011079
公开日2012年9月12日 申请日期2012年4月16日 优先权日2012年4月16日
发明者官馨馨, 汤颖, 范菁, 董天阳 申请人:浙江工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1