并行编程报告课程名称:并行编程原理专业班级:物联网1102班学号:U201114483学生姓名:陈炳良指导教师:金海报告日期:2014-6-11计算机科学与技术学院目录实验一:利用pthread并行实现矩阵的乘法运算....................................................3实验目的...............................................................................................3实验概述...............................................................................................3实验结果...............................................................................................3实验代码...............................................................................................5实验总结...............................................................................................9实验二:使用并行方法优化K-means算法............................................................10实验目的...............................................................................................10实验概述...............................................................................................10实验结果...............................................................................................10实验代码..............................................................................................11实验总结..............................................................................................18实验一:利用pthread并行实现矩阵的乘法运算实验目的该实验旨在让学生掌握利用pthread进行并行程序设计和性能优化的基本原理和方法,了解并行程序设计中数据划分和任务划分的基本方法,并能够利用pthread实现矩阵的乘法运算的并行算法,然后对程序执行结果进行简单分析和总结。具体包括:利用for循环编写串行的矩阵乘法运算;熟悉pthread进行线程创建、管理和销毁的基本原理和方法;利用pthread对上述串行的矩阵乘法运算加以改造;通过调整数据划分和任务划分的粒度(改变工作线程的数目),测试并行程序的执行效率;对实验结果进行总结和分析。实验概述使用pThread完成这项工作。创建一个新的线程:intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*func)(void*),void*arg);thread表示线程ID,与线程中的pid概念类似attr表示设定线程的属性,可以暂时不用考虑func表示新创建的线程会从这个函数指针处开始运行arg表示这个函数的参数指针返回值为0代表成功,其他值为错误编号。主进程等待线程结束:intpthread_join(pthread_tthread,void**retval);thread表示线程ID,与线程中的pid概念类似retval用于存储等待线程的返回值两个矩阵相乘:一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵,其中的第i行第j列位置上的数为第一个矩阵第i行上的n个数与第二个矩阵第j列上的n个数对应相乘后所得的n个乘积之和。实验结果实验随机产生的矩阵B的数据并行以及串行计算时间对比实验代码1.并行计算矩阵相乘代码:#includestdio.h#includetime.h#includepthread.h#includestdlib.h#includeunistd.h#includememory.h/*定义矩阵中元素的上限,避免相乘后溢出*/#defineRANGE150/*矩阵A有M行N列,矩阵B有N行M列*/#defineM200#defineN300intmatrixA[M][N];intmatrixB[N][M];intarr[M][M][N];intres[M][M]={0};void*func(void*arg);voidput();void*func(void*arg)//每个子线程要完成的任务{intk=*(int*)arg;inti,j;for(i=0;iM;i++)for(j=0;jM;j++)arr[i][j][k]=matrixA[i][k]*matrixB[k][j];pthread_exit(NULL);}main(){//随即产生两个矩阵inti,j,k;srand((unsigned)time(NULL));for(i=0;iM;i++)for(j=0;jN;j++)matrixA[i][j]=rand()%RANGE;for(i=0;iN;i++)for(j=0;jM;j++)matrixB[i][j]=rand()%RANGE;clock_tstart=clock();//开始计时pthread_ttids[N];for(i=0;iN;i++){if(pthread_create(&tids[i],NULL,func,(void*)&i))//产生线程,去完成矩阵相乘的部分工作量{perror(pthread_create);exit(1);}}for(i=0;iN;i++)pthread_join(tids[i],NULL);//等待所有的子线程计算结束for(i=0;iM;i++)//合。for(j=0;jM;j++)for(k=0;kN;k++)res[i][j]+=arr[i][j][k];clock_tfinish=clock();//结束计算printf(并行计算用时%.2f秒\n,(long)(finish-start)/1E6);put();exit(0);}voidput(){FILE*file1,*file2,*file3;if((file1=fopen(matrixA,wt))==NULL){perror(fopen);exit(1);}if((file2=fopen(matrixB,wt))==NULL){perror(fopen);exit(1);}if((file3=fopen(res,wt))==NULL){perror(fopen);exit(1);}inti,j,k;for(i=0;iM;i++){for(j=0;jN;j++)fprintf(file1,%-8d,matrixA[i][j]);fprintf(file1,\n);}fclose(file1);for(i=0;iN;i++){for(j=0;jM;j++)fprintf(file2,%-8d,matrixB[i][j]);fprintf(file2,\n);}fclose(file2);for(i=0;iM;i++){for(j=0;jM;j++)fprintf(file3,%-8d,res[i][j]);fprintf(file3,\n);}fclose(file3);}2.串行计算矩阵相乘代码:#includestdio.h#includetime.h#includepthread.h#includestdlib.h#includeunistd.h#includememory.h/*定义矩阵中元素的上限,避免相乘后溢出*/#defineRANGE150/*矩阵A有M行N列,矩阵B有N行M列*/#defineM200#defineN300intmatrixA[M][N];intmatrixB[N][M];intarr[M][M][N];intres[M][M]={0};void*func(void*arg);voidput();main(){//随即产生两个矩阵inti,j,k;srand((unsigned)time(NULL));for(i=0;iM;i++)for(j=0;jN;j++)matrixA[i][j]=rand()%RANGE;for(i=0;iN;i++)for(j=0;jM;j++)matrixB[i][j]=rand()%RANGE;clock_tstart=clock();//开始计时for(i=0;iM;i++)for(j=0;jM;j++)for(k=0;kN;k++)res[i][j]+=matrixA[i][k]*matrixB[k][j];clock_tfinish=clock();//结束计算printf(串行计算用时%.2f秒\n,(long)(finish-start)/1E6);put();exit(0);}voidput(){FILE*file1,*file2,*file3;if((file1=fopen(matrixA,wt))==NULL){perror(fopen);exit(1);}if((file2=fopen(matrixB,wt))==NULL){perror(fopen);exit(1);}if((file3=fopen(res,wt))==NULL){perror(fopen);exit(1);}inti,j,k;for(i=0;iM;i++){for(j=0;jN;j++)fprintf(file1,%-8d,matrixA[i][j]);fprintf(file1,\n);}fclose(file1);for(i=0;iN;i++){for(j=0;jM;j++)fprintf(file2,%-8d,matrixB[i][j]);fprintf(file2,\n);}fclose(file2);for(i=0;iM;i++){for(j=0;jM;j++)fprintf(file3,%-8d,res[i][j]);fprintf(file3,\n);}fclose(file3);}实验总结由于本次随机矩阵相乘的计算量不是很大,所以最终的比较结果是,串行计算时间要远远小于并行计算时间,其主要原因是因为并行计算中要创建,销毁线程,这个过程消耗了大部分时间。与此同时,我对串行编程有了更加深刻的了解,对并行编程也有了初步的感官,对我日后的优化编程有了很深的启发。实验二:使用并行方法优化K-means算法实验目的该项目要求学生了解并掌握对复杂问题进行并行程序设计和优化的方法。在相关工具和框架的帮助下,利用数据划分和任务划分方法实现并行算法,并对并行算法进行优化。在了解熟悉K-means问题的基础上建立合适的数据结构与程序结构,编写程序求解K-means问题,分析算法的时间与空间复杂度。根据并行算法并行化过程中的问题