网络公司网站策划书,泰安百度做网站的,有域名了网站怎么做,网站改版策划书平台Ubuntu 16.04#xff0c;Linux下MPI环境的安装见链接#xff1a;https://blog.csdn.net/lusongno1/article/details/61709460据 Nagel-Schreckenberg 模型#xff0c;车辆的运动满足以下规则#xff1a;1. 假设当前速度是 v #xff0c;和前一辆车的距离为d。2. 如… 平台Ubuntu 16.04Linux下MPI环境的安装见链接https://blog.csdn.net/lusongno1/article/details/61709460据 Nagel-Schreckenberg 模型车辆的运动满足以下规则1. 假设当前速度是 v 和前一辆车的距离为d。2. 如果 d v它在下一秒的速度会提高到 v 1 直到达到规定的最高限速。3. 如果 d v那么它在下一秒的速度会降低到 d - 1 。4. 前三条完成后司机还会以概率 p 随机减速1个单位速度不会为负值。5. 基于以上几点车辆向前移动v这里的v已经被更新个单位。实验规模车辆数量为100 000模拟2000个周期后的道路情况。车辆数量为 500 000 模拟 500个周期后的道路情况。车辆数量为 1 000 000 模拟300个周期后的道路情况。实验设计初始化条件所有车辆初速度为4车辆间距为8最大速度为8最小速度为1最后一辆车的位置是0。减速概率为0.3车辆结构体typedef struct car{int v;int d;int p;
}car;所有车辆为一个数组car_list核心循环//更新距离
car_list[i].dcar_list[i1].p-car_list[i].p;//依赖于前一辆车
//更新速度
if(car_list[i].dcar_list[i].v car_list[i].vvmax)car_list[i].v;//加速
if(car_list[i].dcar_list[i].v)car_list[i].vcar_list[i].d-1;//减速
if(car_list[i].v1 rand()%10 p )car_list[i].v--;//随机减速
//更新位置
car_list[i].pcar_list[i].v;对这段程序进行周期次数的循环并行设计在每个周期中按照核心数0…N-1将车辆分为N个连续的区间每个核心计算各自的部分。i(num_car/numprocs*myid);//指向这个集合的第一个元素除第一个核心外其他的进程K都需要在更新自己的车辆部分之前发送第一辆车的位置到进程K-1除最后一个进程外的其他进程K都要在计算自己部分的最后一辆车时接受进程K1发送的位置数据以更新最后一辆车。为避免标准通信方式导致后面的进程要等待前面的进程执行到最后开始接受的时候才执行完发送采用缓存通信方式MPI_Bsend。if(myid!0){//如果不是第一个线程就要向前发送数据 MPI_Bsend((car_list[i].p),1,MPI_INT,myid-1,myid,MPI_COMM_WORLD);
}
//核心循环if(myid!numprocs-1){//不是最后一个进程MPI_Recv((temp),1,MPI_INT,myid1,myid1,MPI_COMM_WORLD,status);//更新距离car_list[i].dtemp-car_list[i].p;
}在周期结束之前要同步所有进程。MPI_Barrier(MPI_COMM_WORLD);输出结果只在四线程执行时输出到文件将每个进程自己部分的车辆数据发送到第一个进程第一个进程接收其它进程的数据整合后输出并进行统计。车辆的信息输出到result.txt中格式为 进行输出的线程号 第几辆车速度 位置 和前一辆车的距离统计输出到statistic.txt中前面输出的是速度统计对应的速度有几辆车 。后面是位置统计在位置范围有几辆车结果分析可见不管哪种规模都会有大量的车处于速度为1的状态随机减速会导致堵车情况。运行时间分析10000rank0time:12.911823rank1time:12.937384rank2time:12.968312rank3time:12.837026100000rank0time:127.054991rank1time:127.597898rank2time:127.428670rank3time:127.302298 rank0time:169.043639rank1time:169.092520rank2time:169.038982 rank0time:137.758731rank1time:137.782351 rank0time:255.181992500000rank0 time:158.620365rank1time:159.041463rank2time:158.827125rank3time:158.519957 rank0time:211.242267rank1time:211.114535rank2time:211.117872 rank0time:171.935731rank1time:171.970319 rank0time:319.567614 1000000rank0 time:190.271859rank1time:190.056185rank2time:189.846401rank3time:190.314395 rank0time:211.273677rank1time:211.328568rank2time:211.304030 rank0time:172.247044rank1time:172.281147 rank0time:318.965036规模时间/s100k*2k255137169127500k*0.5k3191712111581000K*0.3k318172211190加速比100k*2k11.8613141.5088762.007874500k*0.5k11.8654971.5118482.0189871000K*0.3k11.8488371.5071091.673684实验遇到的问题1.如何串行执行MPI的并行是进程的并行所以MPI_Finalize()只是将资源释放了并不是之后的程序就串行执行了要想串行可以指定一个进程执行。2.结果输出在用进程0输出所有车辆数据时发现只有线程0处理的部分数据有变更其余数据维持在初始化时的状态。那么应该是每个进程是将处理了自己部分的数据的备份而不是在原有数据的基础上处理的。所以要一个进程进行输出。如果每个进程都自己输出数据就会产生文件写冲突而导致结果的不可预知所以要将其它进程的数据发送到一个进程用一个进程进行输出。3.进程同步如果进程间通信时设置的tag可以区分所有周期比如设置为j*10myid那么在每个周期结束时就没有必要同步所有进程。但是在这样修改之后运行时间没有什么区别应该是核心的处理能力类似同步产生的开销并不明显。源程序#include stdio.h
#include stdlib.h
#include time.h
#include mpi.hint num_car100000;
int num_cycle[]{2000,500,300};const int v04,vmax8,p5;typedef struct car
{int v;int d;int p;
}car;
car car_list[1000000];int count[10]{0,0,0,0,0, 0,0,0,0,0};
int pos_count[20*810000*8]{0};//count per 100int main(int argc,char *argv[])
{//四线程写结果的时候打开文件FILE*fp fopen(result_100000.txt,w);FILE*fp2 fopen(statistic_100000.txt,w);//初始条件int i0;for(i0;inum_car;i){car_list[i].vv0;car_list[i].pvmax*i;car_list[i].dvmax;}int myid, numprocs;clock_t starttime,endtime;int namelen;char processor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(argc,argv);MPI_Comm_size(MPI_COMM_WORLD,numprocs);MPI_Comm_rank(MPI_COMM_WORLD,myid);int* mpi_buffermalloc(sizeof(int)*1000000);MPI_Buffer_attach(mpi_buffer,sizeof(int)*1000000);//模拟过程开始starttimeclock();int j0;for(j0;j2000;j){i(num_car/numprocs*myid);//指向这个集合的第一个元素if(myid!0)//如果不是第一个线程就要向前发送数据{ MPI_Bsend((car_list[i].p),1,MPI_INT,myid-1,j*10myid,MPI_COMM_WORLD);}for(;inum_car/numprocs*(myid1)-1;i){//更新距离car_list[i].dcar_list[i1].p-car_list[i].p;//更新速度if(car_list[i].dcar_list[i].v car_list[i].vvmax)car_list[i].v;if(car_list[i].dcar_list[i].v)car_list[i].vcar_list[i].d-1;srand(i*num_carj);if( car_list[i].v1 ){int rrand()%10;if(rp){car_list[i].v--;//printf(#);}}//更新位置car_list[i].pcar_list[i].v;}if(myid!numprocs-1)//不是最后一个进程{int temp;MPI_Status status;MPI_Recv((temp),1,MPI_INT,myid1,j*10myid1,MPI_COMM_WORLD,status);//更新距离car_list[i].dtemp-car_list[i].p; //printf(%d temp %d %d\n,myid,temp,car_list[i].d);}//更新速度if(car_list[i].vvmax)car_list[i].v;if(car_list[i].dcar_list[i].v)car_list[i].vcar_list[i].d-1;srand((unsigned) time(NULL));if( car_list[i].v1 rand()%10 p ){car_list[i].v--;}//更新位置car_list[i].pcar_list[i].v;//MPI_Barrier(MPI_COMM_WORLD);}//for cycle//模拟过程结束endtimeclock();printf(rank%d time:%lf\n,myid,(double)(endtime-starttime)/CLOCKS_PER_SEC);//四线程的时候向文件写结果别的线程时注释掉好了MPI_Barrier(MPI_COMM_WORLD);if(myid0){MPI_Send((car_list),sizeof(car)*num_car/4,MPI_BYTE,3,myid,MPI_COMM_WORLD); }if(myid1){MPI_Send((car_listnum_car/4),sizeof(car)*num_car/4,MPI_BYTE,3,myid,MPI_COMM_WORLD); }if(myid2){MPI_Send((car_list2*num_car/4),sizeof(car)*num_car/4,MPI_BYTE,3,myid,MPI_COMM_WORLD); }if(myidnumprocs-1){MPI_Status status;MPI_Recv((car_list),sizeof(car)*num_car/4,MPI_BYTE,0,0,MPI_COMM_WORLD,status);MPI_Recv((car_listnum_car/4),sizeof(car)*num_car/4,MPI_BYTE,1,1,MPI_COMM_WORLD,status);MPI_Recv((car_list2*num_car/4),sizeof(car)*num_car/4,MPI_BYTE,2,2,MPI_COMM_WORLD,status); int a;for(a0;anum_car;a){fprintf(fp,%d %d:%d %d %d\n,myid,a,car_list[a].v,car_list[a].p,car_list[a].d);}for(i0;inum_car;i){count[car_list[i].v];pos_count[car_list[i].p/1000];}int k;for(k0;k10;k){fprintf(fp2,%d\t:%d\n,k,count[k]);}for(k0;k2*8num_car*8/1000;k){fprintf(fp2,%d\t%d\n,k,pos_count[k]);} }MPI_Barrier(MPI_COMM_WORLD);fclose(fp);fclose(fp2);MPI_Finalize();return 0;
}转载于:https://www.cnblogs.com/biaoJM/p/10186706.html