微粒群算法并行化实现
一、实验目的
本实验来自基于并行微粒群快速查找无线传感网络移动节点位置,实验只对微粒群最优位置进行并行化,意在熟悉并掌握OpenMP,MPI编程。考察不同条件对并行算法执行时间的影响;考察迭代次数和种群数目对串、并行算法执行时间加速比和效率的影响。
二、问题描述
微粒群算法完整公式:位置:;,表示速度,速度更新为:,位置更新:。
粒子通过跟踪两个极值来更新自己的速度和位置。一个极值是粒子本身到目前为止所找到的最优解pbest。而在这个种群中至少有一个粒子是最好的,即种群的全局历史最优位置。
串行算法伪代码核心部分:
void renew_var(int *m)//查找全局最优值
{
int i, j;
for(i=0; i<P_num; i++) //计算每个粒子的适应度
{
particle_loc_fit[i] =全局最优解;
for(j=0; j<dim; j++) {
particle_loc_best[i][j] = 全局最优向量
}
}
for(i=0,j=-1; i<P_num; i++)//更新全局变量
{
if(particle_loc_fit[i]<gfit){
gfit = 全局最优解;
j = i;
}
}
- 并行化步骤
在实验中我先采用OpenMP对微粒群算法进行并行化,发现加速比和效率并不明显,而后又在Ubuntu下对算法进行MPI并行化,并行化效果比OpenMP显著。
OpenMP并行化步骤:通过omp_set_num_threads()库函数设置线程数My_rank;调用OpenMP库函数omp_get_wtime()获取当前时间tstart;#pragma omp parallel for开始做并行区部分结束后再次调用omp_get_wtime()获取时间获取时间tstop,tstop –tstart即为并行消耗时间。
MPI并行化步骤:(并行化在两个台计算机进行,在host文件下配置地址及进程数)
- 首先将问题分割成多个任务,在本实验中我将粒子数目进行划分,每个进程处理的粒子数目区间为(a,b)。a=my_rank*(p_num/comm_sz);b=a+(p_num/comm_sz);
- 每个进程的迭代次数为N;
for(j=0;j<N;j++)
{ renew_particle(a,b);renew_var(a,b,&m);}
(3)将每一个进程计算的最优值都发给0号进程,0号进程计算结果归并,并进入下一次迭代计算。
if(my_rank==0) for(i<comm_sz)
MPI_Send(particle_glo_best,50,MPI_DOUBLE,i,0,MPI_COMM_WORLD; MPI_Send(&gfit,1,MPI_DOUBLE,i,0,MPI_COMM_WORLD);
else
MPI_Recv(particle_glo_best,50,MPI_DOUBLE,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
MPI_Recv(&gfit,1,MPI_DOUBLE,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);}
- 运行结果分析
1基于OpenMP的实验结果分析:
随着微粒群算法中种群迭代次数N的不断增加,以及线程数目的变化如下表所示
表1 基于OpenMP 微粒群算法串行并行的运行时间(单位:秒)
my_rank | 10 | 15 | 100 | 300 | 400 |
1 | 4.097292 | 4.315023 | 8.956858 | 26.436293 | 36.387453 |
2 | 3.716794 | 3.906565 | 5.203545 | 16.061598 | 20.309881 |
4 | 3.323195 | 3.460104 | 3.941863 | 10.972851 | 14.060052 |
8 | 1.612647 | 2.270058 | 3.707671 | 11.063294 | 14.662151 |
16 | 1.273863 | 1.699038 | 4.636931 | 10.925684 | 14.9901038 |
实验结果中加速比最好的是当N=400,My_rank=4时,加速比为2.571.效率为0.64。
效率最好的是当N=400,My_rank=2时,加速比为1.792,效率为0.89。由于算法具有收敛性所以当线程数目达到一定的数值时时间呈现增大的趋势,加速比和效率也会呈现减小的趋势。
2基于MPI的实验结果分析:
基于MPI的并行化数据分析随着粒子数目和进程数的增加时间变化如下表所示:
粒子数 | 单机 | 多机2进程 | 多机4进程 | 多机6进程 | 多机8进程 |
20000 | 2.214 | 0.745216 | 0.439040 | 0.986179 | 0.853238 |
30000 | 2.658 | 0.945895 | 0.658439 | 1.302238 | 1.582922 |
40000 | 3.387 | 1.12186 | 0.839391 | 1.406544 | 1.50095 |
50000 | 4.749 | 1.62186 | 1.039731 | 1.841682 | 2.197528 |
基于MPI的微粒群加速比如下表所示:
表1 加速比 表2 效率
粒子数 | 多机2 | 多机4 | 多机6 | 多机8 | 粒子数 | 多机2 | 多机4 | 多机6 | 多机8 |
20000 | 1.4 | 5.0 | 2.33 | 2.6 | 20000 | 0.7 | 1.25 | 0.38 | 0.325 |
30000 | 2.79 | 3.8 | 2.04 | 1.68 | 30000 | 1.39 | 0.95 | 0.34 | 0.21 |
40000 | 2.7 | 4.1 | 2.41 | 2.26 | 40000 | 1.35 | 1.025 | 0.401 | 0.28 |
50000 | 2.9 | 4.61 | 2.58 | 2.16 | 50000 | 1.45 | 1.15 | 0.43 | 0.27 |
基于MPI的微粒群并行化在Ubuntu环境下进行并行的。由以上实验数据可分析随着粒子数和进程数的增加时间都会又增加,当粒子数从20000增加到50000时虽然整体时间呈现增大的趋势但是加速比也呈现逐渐提升的趋势。因为数据规模的逐渐增大,多进程并行计算的时间在总运算实践中比重增大,多进程通信的时间在总运算中所占据的比重逐渐减小。有实验数据可以看出无论是基于MPI的并行还是基于OpenMP的并行,其加速比和效率都会呈现下降的趋势,原因是当问题规模较小时,串行算法仍然要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较串行有了提升。 并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了。由以上数据可以看出当进程数为4粒子数为20000时加速比达到最大值,当进程数为2 粒子数为50000时效率达到最大值。
综合OpenMP并行的微粒群算法的加速比和效率来看利用MPI进行并行化的效果要明显优于OpenMP的效果,这也是我另选择MPI进行并行化的原因。但是无论是OpenMP多线程并行还是MPI的多机并行都达到了加快数据计算速度的目的。
实验代码 :https://download.youkuaiyun.com/download/m0_37840214/11208889