OpenCL离散元颗粒系统的优化设计*

2016-09-14 03:28:20许卫明王建华
菏泽学院学报 2016年2期
关键词:球心线程全局

许卫明, 王建华

(1.马鞍山师范高等专科学校,安徽 马鞍山 243041; 2.菏泽市城市管理局,山东 菏泽 274000)



OpenCL离散元颗粒系统的优化设计*

许卫明1, 王建华2

(1.马鞍山师范高等专科学校,安徽 马鞍山 243041; 2.菏泽市城市管理局,山东 菏泽 274000)

针对传统离散元颗粒系统进行大量颗粒运算时,出现的运算时间长、运算效果不理想的问题,通过OpenCL算法对其进行优化改进.将大量颗粒运算分为颗粒间碰撞运算和颗粒与边界的碰撞运算.颗粒间碰撞的运算利用OpenCL编程实现,与边界碰撞的运算利用CPU计算实现,同时在OpenCL算法运行时,根据不同的数据类型,划分不同的存储器,在内存访问上提高算法的运行速度.通过测试,优化后的算法运算效率明显提升.

颗粒系统;OpenCL;GPU;内存访问

离散元方法的基本思想是把不连续体分离成刚性元素集合,利用运动方程来描述刚性元素运动情况,通过迭代的方法对运动方程进行求解,从而得出不连续体的运动形态.最初该方法是针对非连续介质的力学行为的[1].在离散元的颗粒系统中,由于颗粒数量多,存在着大量的颗粒间的碰撞和颗粒与边界的碰撞,对系统的力学进行计算,需处理、跟踪大量的信息,仅凭CPU的运算,效果太差.近年来随着GPU科学计算能力的逐步提高,尤其是GPU的并行计算能力的发展,将计算机的计算能力大幅提升,使得在对颗粒系统中数亿的颗粒模拟计算成为可能,但整体运算时间还是较长,本文对基于OpenCL离散元颗粒系统进行研究,通过在算法上适应GPU构架,同时在内存访问上进行优化,提升离散元的仿真效率.

1 OpenCL简介

OpenCL是由苹果公司和AMD、NVIDIA、Intel等公司制定的一个工业标准和规范,是面向CPU、GPU与其他处理器组合构成的计算机编程的行业标准.该标准可通过公布硬件来提高编程的可移植性.平台模型如图1所示,平台包括各种OpenCL设备及一个宿主机,宿主机与各个OpenCL设备之间的交互通信,通过宿主机定义内核,建立逻辑关系,对各个设备下达命令的方式来完成[2].

图1 OpenCL平台模型

OpenCL定义了五种内存区域,首先为宿主机内存,该内存只有宿主机可见;全局内存,所有设备可见,并允许读写操作;常量内存,用于存储常量,只允许读;局部内存,存储不同设备的公用常量;私有内存,计算中一个工作组的专用内存.在利用OpenCL进行编程时一般遵循以下步骤:1)查支持OpenCL的硬件设备的参数、特性;2)创建OpenCL平台的内核函数;3)在设备上创建上下逻辑关系,管理程序执行时的内核对象;4)传递所需的参数;5)执行内核函数.

2 基于 OpenCL 离散元颗粒系统仿真优化设计

离散元颗粒系统仿真是将颗粒系统中的颗粒假象为独立的球形或椭球型颗粒,计算这些颗粒之间碰撞的受力情况,计算位移与速度,得出下一时步的位置和速度,循环此过程直到计算所有颗粒停止运动为止,或到达规定运算时步,仿真结束.本次的优化运算首先将颗粒的碰撞分为两类:颗粒与颗粒之间的碰撞、颗粒与边界之间的碰撞.

2.1颗粒之间的碰撞计算

颗粒间的碰撞计算流程如图2所示.在OpenCL平台上创建上下逻辑关系,选择硬件设备,创建命令队列,并对命令在队列中排队,从.cl文件中加载OpenCL内核代码.在内存中为内核函数的参数分配空间[3].对于颗粒系统,函数的主要参数为:力学常量,颗粒的数量、坐标、大小、速度和角速度等信息.由于内核函数不能命名指针,只能将颗粒的信息转换成一维数组,核函数最终得出的结果为该时步下的颗粒碰撞受力情况,然后通过分析颗粒的受力情况来计算颗粒的运动状态,得出颗粒的速度,位置信息等状态的变化.

图2 颗粒间碰撞计算流程

2.1.1接触判断与位移增量计算

首先建立局部坐标系,以遍历球颗粒i的球心为坐标原点,与颗粒j的球心连线作为x轴,选取x轴的垂直平面与X-Y平面平行的直线为y轴,再由右手螺旋法则确定z轴,建立空间坐标系,如图3所示.

图3 颗粒间局部坐标系

全局坐标与局部坐标的转换矩阵为

在转换矩阵中Lij表示两球i和j的球心距,(Xi,Yi,Zi)、(Xj,Yj,Zj)表示两球在全局坐标系中的坐标,(l,m,n)是x轴在全局坐标内的方向向量.进行接触判断时,要将该颗粒与比该颗粒编号大的颗粒进行判断,计算过程通过GPU并行进行计算,判定球体是否接触的方法为:计算两颗球的球心距与两个球的半径和的大小,当球心距大于半径和时,两球没有接触,当球心距小于半径和时,两球接触.

2.1.2力学计算

两球发生碰撞时,根据受力分析,颗粒的受力包括法向接触力、切向接触力和回转力矩.力学的计算过程在计算接触判断的线程中完成.

在t时步下,发生碰撞的的颗粒i在x轴方向的法向接触力为

(1)

在公式中kx为刚性系数,Cij为两球叠加量,hx为法向阻尼系数.

在t时步下沿局部坐标系的y、z的作用力为切向弹性力与切向阻尼力的和,则沿y轴的切向接触力为

(2)

根据相同的原理可得沿z轴的切向接触力

(3)

在t时步下,回转力矩为弹性分量和阻尼分量的和,则回转力矩的计算公式为

M(t)=Mt-Δt-krΔφ-hrΔφ/Δt

(4)

kr,hr分别为回转度系数和阻尼系数.

以上的接触判断及力学计算,使用OpenCL算法,在GPU中完成的,选取平台并创建命令队列,主程序通过命令队列对核函数进行任务分配和操作运算.GPU的多线程并行运算与CPU的不同,每个线程访问内存都是连续的.

2.2颗粒边界的碰撞计算

颗粒系统的边界分为好多种,如远行平面、扇形平面等,在进行颗粒与边界碰撞时要区分对待.

2.2.1接触判断

判断过程中使用虚函数P2BContact()返回接触标志,以此来判定与边界是否接触.判定的方法为比较球心到边界的距离和球颗粒的半径,当半径大于到边界的距离时,则判定为接触,否则不接触.

设平面方程ax+by+cz+e=0,边界的半径为R,则球心到边界的距离为

(5)

2.2.2颗粒与边界的力学计算

与边界的力学计算同颗粒间的力学计算大致相同,主要的区别在于颗粒相对于边界自身的质量可以忽略不计,因此边界不会因为颗粒的碰撞而产生运动[1].计算之前要根据不同的材质建立数据库,方便在程序录入的情况下调用相对应的参数.

(6)

(7)

计算结束后对每个颗粒的作用力和力矩进行相加之后再与核函数返回计算结果相加,根据受力情况计算颗粒的运动状态.

3 内存访问优化

在OpenCL算法运行时,好的内存访问模式可以加快读、写缓冲区的速度,从而提升计算运行速度和效率.传统的CPU优化内存的方式不适应OpenCL设备内存,必须探寻新的内存优化技术,来提高OpenCL设备的运行速度.

3.1全局内存访问

在OpenCL的核函数中应用比较广泛的为全局内存,决定全局内存性能的因素有访存次数和访存模式.访存次数就是核函数中全局内存被读、写的次数,次数过度就会降低程序整体的运行效率,而在这些内存中,被访问的次数最多的数据一般为工作组的共享数据,解决的方法为利用局部内存访问速度比全局内存快的特点,将共享数据写入该工作组的局部内存中去[5].访存模式,GPU中一般采用多线程分段处理,CPU的分段遍历方式为每个线程都顺序访问数组的每一个元素,如果采用这种方式,在访问第一个元素时,破坏了GPU数据访问的局部要求,会对整个运算效率造成影响,会降低运算性能,解决的方法是采用合并读取的方式,这样可以将数组按线程分为不同的运算区域,读取的都是数组相邻的元素,这样既符合了OpenCL的内存局部性,又有效的提高了缓冲区数据的读、写速度.

3.2局部内存访问

局部内存是GPU每个线程组上都能快速访问的内存区域,访问速度要比全局内存速度快,利用局部内存可以减少对全局内存的读、写操作.程序运行中如果无法将数据分段合并时,将这些数据放入局部内存中,这样可以提高缓冲区的读写速度,从而提高运行的效率.存储体冲突时降低局部内存访存性能下降的主要因素,本文通过采用均匀访存的方法尽量避免冲突的发生.

均匀访存的方法基本思想为,任意两个相邻的线程同时访问局部内存中位置间隔相同的区域,核心就是访问间隔,间隔不同,访问的区域就不同,这样的访问也会造成不同的线程访问同一个内存区域[6].OpenCL对局部内存的读写映射到GPU的LDS上,OpenCL可以将32组线程为一组并行访问.间隔为2的线程访问如图4所示.

图4 间隔为2的均匀访问

从图4可看出存储0和2处发生冲突,如果将间隔设为3,访问情况如图5所示.

图5 间隔为3的均匀访问

从图中可以得出每一个线程都有不同的存储体,整个周期内访问均没出现存储体冲突.因此只要选择的间隔合适,采用均匀访存的方法可以避免存储体冲突的发生,提高整个程序运行的效率.

4 结论

通过OpenCL算法对传统离散元颗粒系统进行优化改进,将大量颗粒运算分为颗粒间碰撞运算和颗粒与边界的碰撞运算,并利用OpenCL编程实现颗粒间碰撞的运算,利用CPU计算实现边界碰撞的运算,同时在OpenCL算法运行时,根据不同的数据类型,划分不同的存储器,在内存访问上提高算法的运行速度.极大的发挥了GPU的并行计算能力,提升离散元颗粒系统的仿真效率.

[1]赵啦啦,赵跃民,刘初升,等.湿颗粒堆力学特性的离散元法模拟研究[J]. 物理学报, 2014(03):1-9.

[2]季顺迎,赵金凤,狄少丞,等.面向环境力学的离散元分析软件研发和工程应用[J]. 计算机辅助工程, 2014(1):69-75.

[3] 詹云,赵新灿,谭同德.基于OpenCL的异构系统并行编程[J]. 计算机工程与设计, 2012(11):4191-4195.

[4] 陈钢,吴百锋.面向OpenCL模型的GPU性能优化[J]. 计算机辅助设计与图形学学报, 2011(04):571-581.

[5] 韩博,周秉锋.GPGPU性能模型及应用实例分析[J]. 计算机辅助设计与图形学学报, 2009(09).

[6] 徐泳,孙其诚,张凌,等.颗粒离散元法研究进展[J]. 力学进展, 2003(02):251-259.

On Optimization Design of OPENCL Discrete Element Particle System

XU Wei-ming1, WANG Jian-hua2

(1.Maanshan Teacher’s College, Maanshan Anhui 243041, China 2. Heze City Administration Bureau, Heze Shandong 274000, China)

Due to the long operation time and unsatisfactory effect of traditional discrete element particle system carrying out a large number of granular computing, OPENCL algorithm is used for the optimization. The large number of particles are divided into inter particle collision and the collision between the particles and the boundary. The operation of inter particle collision is realized by OPENCL programming and the operation of the boundary collision is realized by CPU. At the same time, different memory is partitioned according to different data types in OPENCL algorithm. By testing, the optimized algorithm is obviously improved.

particle system; OPENCL; GPU; memory access

1673-2103(2016)02-0023-05

2015-12-07

安徽省一般教学研究项目(2013jyxm300 )

许卫明,男(1981-),安徽怀宁人,讲师,硕士,研究方向:计算机网络

F416.67

A

猜你喜欢
球心线程全局
Cahn-Hilliard-Brinkman系统的全局吸引子
量子Navier-Stokes方程弱解的全局存在性
直击多面体的外接球的球心及半径
落子山东,意在全局
金桥(2018年4期)2018-09-26 02:24:54
?如何我解决几何体的外接球问题
例析确定球心位置的策略
浅谈linux多线程协作
环球市场(2017年36期)2017-03-09 15:48:21
画好草图,寻找球心
新思路:牵一发动全局
中国卫生(2014年5期)2014-11-10 02:11:26
Linux线程实现技术研究