基于CUDA架构的并行PSO求解方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于 CUDA 架构的并行 PSO 求解方法
蔡勇,李光耀,王琥
(湖南大学汽车车身先进设计制造国家重点实验室,长沙 410082)
摘要:粒子群优化算法(PSO)是一个迭代的求解过程,当问题较复杂时需要一个庞大的粒子 群进行优化解的搜索。因此,设计出高效的 PSO 求解方法是有必要的。本文通过对传统 PSO 算法的分析, 结合目前被广泛使用的基于 GPU 的并行计算技术, 设计出了一种快速的并行 PSO 求解方法。本算法的执行基于统一计算.架构(CUDA) ,使用 GPU 大量的线程并行处理各个粒 子的搜索过程来加速整个粒子群的收敛速度。程序充分使用 CUDA 所自带的各种数值求解库, 从而保证了程序的稳定性和易写性。通过对多个基准优化测试函数的求解证明,相对于基于 CPU 的串行计算方法,在求解精度一致的前提下,基于 CUDA 架构的并行 PSO 求解方法可以 取得 40 倍以上的计算加速比。 关键词:粒子群优化算法; 并行计算;GPU;CUDA
Vid (t 1) wVid (t ) c1 r1 ( PpBd (t ) X id (t )) c 2 r2 ( PgBd (t ) X id (t ))
(1) (2)
X id (t 1) X id (t ) Vid (t )
其中, i 1,2,..N , N 是指人口,即粒子群中的粒子数。 d 1,2,..D , D 是求解空间的维度。在公式 1 各公式 2 中,学习因子 c1 和 c 2 是非负的常数, r1 和 r2 是[0,1]范围的随机数, Vid [ Vmax , Vmax ] ,其 中 Vmax 由所指示的目标优化函数决定。 如果粒子的某一维度的速度超过 Vmax , 将会被设为 Vmax 。Vmax 主 要决定着 PSO 的收剑速度。 w 称为惯性权重,用于平衡全局和局部的搜索能力,一般为[0,1]中常数。
2
[4]
CUDA(Compute Unified Device Architecture,统一计算设备架构) ,是由显示芯片设计制造商 NVIDIA 公司推出的一种基于 GPU 的并行计算架构。它的提出简化了通用计算映射到 GPU 上执行的过程, 大大缩短了计算程序的开发难度和周期。CUDA 通过线程组层次结构、共享存储器、屏蔽同步这三个抽象 提供了细粒度的数据并行化和线程并行化计算模型。线程组层次结构指 CUDA 利用 3 个向量将线程组织成 为三个不同的层次。GPU 可以访问到的存储空间同样具有层次结构。CUDA 线程可在执行过程中访问多个 存储器空间的数据。CUDA 线程首先被划分为线程块,每个线程块所拥有的线程数不能超过 512 个。每个 线程都有一个私有的本地存储器。 每个线程块都有一个共享存储器, 该存储器对于块内的所有线程都是可 见的,并且与块具有相同的生命周期。线程块的上级为组织线程块三维向量,叫做块网格(grid) 。块网 格(grid)也同样被一个三维向量组织,最终形成一个庞大的线程组。线程组中的所有的线程都可访问相 同的全局存储器。 可以被 GPU 调用并执行的函数称为内核(kernel) ,CUDA 提供一种类 c 的编程语言,使编程人员可 以脱离图形编程方便的编写在 GPU 进行计算的程序。CUDA 在调用 kernel 将由多个 CUDA 线程同时执行多 次。图1表示基于 CUDA 的通用计算流程。首先由 CPU 进行相关的前处理,包括输入数据的读取以及存储 空间分配等。然后,将用于计算的数据从主板的内存复制到 GPU 的存储空间中。GPU 进行计算后,将计算 结果由 GPU 传回到内存中,供中央处理器 CPU 计算使用。
1
[3] [2] [1]
高了 PSO 算法的计算速度,即使对于大规模的粒子群也能快速进行优化求解。同时,这种并行计算方法并 不需要特殊的硬件支持,在普通个人电脑上就能进行计算,因此,具有很高的实用价值。这种并行 PSO 算法也适用于其它基于群体的优化搜索算法,可以帮助科研人员进行更多其它优化算法的效率优化。
1 粒子群优化(PSO)算法
PSO 是一种简单而有效的优化算法。 PSO 依照鸟群或鱼群寻找食物的方法寻找适应函数的最佳值。 作 为启发算法中的一种,PSO 由于其强健、有效和简单而被广泛的使用。在 PSO 算法中第一个优化问题的最 佳值的搜索是由一个群体中的多个粒子完成。 在每一个迭代步中, 每个粒子的速度和位置要根据粒子迄今 所经历的最佳位置( PpBd (t ) )和整个群体中所找到的最佳位置( PgBd (t ) )进行更新。在传统的 PSO 算法 [1]中,粒子的速度和位置的更新由公式 1 和公式 2 进行计算。
引言
粒子群优化算法(PSO)起源于鸟类和鱼类的群体智能,是一种基于群体的新型随机元启发式搜索算 法,由 Eberhart 和 Kennedy 等在 1995 年提出 。相比于传统的基于种群的优化算法,PSO 算法更加容 易执行,并且可以一直维持一个强的收敛和全局搜索能力,目前广泛应用于函数优化、人工神经网络、 数据聚类等问题,并取得了很好的优化效果。但是在进行复杂问题的求解时,PSO 算法往往需要成千上 万的粒子进行全局搜索,由于 PSO 算法的求解过程属于一个迭代过程,这会产生大量的计算时间,因此, 找到一种高效的 PSO 求解方法是十分必要的。并行计算是解决计算效率一个非常有效的途径。传统的并 行 PSO 算法主要有两种,一种是在并行机群上运行,如基于 MPI 的并行 PSO 计算方法 ,另外则是基于 OpenMP 的多线程并行模拟技术 。这种传统的方法在取得了一定计算效率的同时也具有几点的不足:并 行 PSO 算法一般是基于粒子的并行,如果采用一个线程进行一个粒子的计算,对于一个拥有数千粒子的 模型则需要启动数成个线程进行计算,这在传统的并行计算平台启动如此多的线程,一方面需要高昂的 硬件成本, 另一方面会导致大量进程间的通信和复杂管理损耗。 基于 OpenMP 的多线程并行模拟技术中的 实际进行并行计算线程是有限的,所以取得的加速比也是十分有限的,所以, 我们认为在传统的粗粒度 的并行计算方法并不是十分适应于 PSO 算法。 基于 GPU 的并行计算是目前被广泛使用的细粒度并行计算途径。统一计算架构(CUDA)是由 NVIDIA 公司提出的一种基于 GPU 的并行计算架构。本文提出了一种基于 CUDA 架构并行 PSO 求解方法,极大的提
[8] [7] [6]
4
表 1 利用 CUBLAS 查找极值 流程 找到极值的索引号 通过找到极值 3.3 随机数的产生 在 PSO 算法中粒子速度的更新依靠于随机数的产生。以前,基于 GPU 的随机数产生机理的缺失成为 限制 GPU 在优化算法计算方面的主要原因。传统的方法是在 CPU 端生成随机数后再传输到 GPU 端中,由 上文的分析,我们知道这对程序效率是不利的。目前,也有多少基于 GPU 的并行随机数生成方法,如文 献 。这些方法实现了 GPU 上随机数的产生,但如果单独在优化算法中使用也是十分困难的。所以,我 们同样使用 CUDA API 中提供的库来解决这个问题。CURAND
[5]
图 1 基于 CUDA 的通用计算流程
3 基于 CUDA 的并行 PSO 算法
在 PSO 算法计算过程中,除了群体最优位置和最优速度是由所有粒子所决定外,其它个体的值均由
3
粒子自身所有,粒子的计算也是相独立的。因此,非常适于基于指令并行的并行计算模式,并且适合于在 GPU 上实现。由于现代 GPU 中片段着色器在 CUDA 中被抽象成为每一个线程的处理器,GPU 被划分为是一 种单指令多线程(SIMD)并行计算设备。因此,可以在 CUDA 中建立与粒子数相同的线程数,每个 GPU 线程执行每个粒子更新计算, 充分利用 GPU 的并行性, 将多个粒子计算的时间缩短成和一个粒子计算的时 间相似。在 GPU 上实现并行 PSO 算法需要解决以下问题:数据存储问题;最佳适应值的 GPU 并行搜索;GPU 的随机数产生和 PSO 算法的 GPU 转化。 3.1 GPU 中数据存储 在基于 GPU 并行计算程序设定时,首先应该考虑到数据存储的问题。为了保证程序计算效率应该全 面平衡如下几点。首先是尽量减少 CPU 和 GPU 之间的数据交换,因为,由于硬件的限制这种类型的传输速 度很慢。其次要注意到 CUDA 架构中多层内存结构的利用,要根据数据的类型及使用情况合理分配到各种 内存空间中。 PSO 算法中的数据结构相对比较简单, 在 CUDA 架构中可以在全局显存中采用与 CPU 中相同的数组用 来存储粒子位置,粒子速度等信息。不同之处在于,CUDA 架构中设备以是一维线性的形式存储,如果原 数组是二维或多维数组, 要通过下标转换后以一维数组的形式定位。 在设备计算能力 2.0 以下的设备执行 时,对于这些数组应该注意到读取的对齐问题,因此,使用 cudaMallocPitch()等语句进行全局显存的分 配是十分必要的。同时,在同一计算块内应该充分使用共享显存等,降低全局显存较慢的读写速率对程序 执行效率的影响。 对于计算能力 2.0 以上计算设备, 这些相关优化技巧可以弱化, 因为其硬件本身能过一、 二级缓存技术等掩盖了全局显存的读写速率问题。 3.2 最佳适应值的 GPU 并行搜索 最佳适应值的搜索要求在所有粒子找到的局部最佳值中能过求极值的找到全局最佳值。在基于 GPU 的并行计算中有三种方法可能完成这个操作。第一方法是先将 GPU 中的局部最佳值复制到 CPU 中,在 CPU 中串行完成极值的查找。第二种方法是通过并行缩减 的方法直接在 GPU 中找到极值。由于 CPU 与 GPU 间 数据传输速度的限制, 第一种算法中数据传输所花费的时间将极大的影响地影响算法运行速度。 第二方法 所采用的并向缩减算法是目前最广泛应用的并行极值求解方法, 目前也有多个的基于 GPU 的并行缩减算法 在文献中提到 。但这种采用这种算法将带来额外的编程量,并且为了最大化的发挥算法的计算效率,往 往需要根据不同设备计算能力对运行参数进行设定, 带来了程序编写上困难。 为此, 适时是使用 CUDA API 中所提供各种数值计算库是十分必要的。CUBLAS 是基于 CUDA 的基本线性代数库(BLAS)实现。它支持 访问 NVIDIA GPU 的计算资源。通 CUBLAS 可能方便的在 GPU 直接进行并行极值查找,并且极值将直接存储 到 CPU 端的变量中。具体的实现方法如表 1 所示。
[10] [9]
代码
cublasIdamin(handle1, iPSONum, BestFit, 1, &idex); cublasGetVector(1,sizeof(double),&BestFit [idex-1],1,&BestFit,1);
2 A 并行计算架构
作为计算机中图像处理核心,随着人们对图像处理要求不断提高,GPU 的计算性能越来越强大,其 浮点处理能力已经达到了同时期 CPU 的 10 倍以上, 而其外部存储器带宽则是 CPU 的 5 倍以上。 新一代 GPU 已经发展成为了一种高度并行化、多线程、多核的处理器。这些新的发展,给 GPU 在通用计算领域上的应 用注入了强劲的动力,特别适合于计算密集性、可高度并行化的计算。早期的 GPU 通用计算平台经历了直 接使用图形学 API 编程到后期利用 Cg(c for graphic)着色语言编程将通用计算映射到图形处理过程中 的顶点处理中的过程,如参考文献 4 中,李建明等采用 Cg 语言将 PSO 算法到移植到 GPU 上进行计算,在 取得了一定加速比的同时,却需要花费大量的时间用于数据结构的调整等,编程强度很高 。两种形式都 要求程序员对图像处理过程及 GPU 的结构有较深入的理解, 并且由于数据需要映射到纹理中, 这使编程过 程对数据的处理变得非常的复杂,对于特定的问题甚至是不可实现的,因此,它的应用范围有限,主要还 是以与图形处理有关的领域为主。
相关文档
最新文档