并行编程报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
并行编程报告
课程名称:并行编程原理
专业班级:物联网1102 班
学号 : U*********
学生姓名:***
指导教师:**
报告日期: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 完成这项工作。
创建一个新的线程:
int pthread_create( pthread_t *thread,
const pthread_attr_t *attr,
void *(*func) (void *),
void *arg);
thread 表示线程 ID,与线程中的 pid 概念类似
attr 表示设定线程的属性,可以暂时不用考虑
func 表示新创建的线程会从这个函数指针处开始运行
arg 表示这个函数的参数指针
返回值为 0 代表成功,其他值为错误编号。
主进程等待线程结束:
int pthread_join( pthread_t thread, void **retval );
thread 表示线程 ID,与线程中的 pid 概念类似
retval 用于存储等待线程的返回值
两个矩阵相乘:
一个 m 行 n 列的矩阵与一个 n 行 p 列的矩阵可以相乘,得到的结果是一个
m 行 p 列的矩阵,其中的第 i 行第 j 列位置上的数为第一个矩阵第 i 行上的 n 个
数与第二个矩阵第 j 列上的 n 个数对应相乘后所得的 n 个乘积之和。
实验结果
实验随机产生的矩阵 B 的数据
并行以及串行计算时间对比实验代码
1.并行计算矩阵相乘代码:
#include
#include
#include
#include
#include
#include
/*定义矩阵中元素的上限,避免相乘后溢出*/
#define RANGE 150
/*矩阵A有M行N列,矩阵B有N行M列*/
#define M 200
#define N 300
int matrixA[M][N];
int matrixB[N][M];
int arr[M][M][N];
int res[M][M]={0};
void *func(void *arg);
void put();
void *func(void *arg)//每个子线程要完成的任务
{
int k=*(int *)arg;
int i,j;
for(i=0;i for(j=0;j arr[i][j][k]=matrixA[i][k]*matrixB[k][j]; pthread_exit(NULL); } main() { //随即产生两个矩阵 int i,j,k; srand((unsigned)time(NULL)); for(i=0;i for(j=0;j matrixA[i][j] = rand()%RANGE; for(i=0;i for(j=0;j matrixB[i][j] = rand()%RANGE; clock_t start=clock();//开始计时 pthread_t tids[N]; for(i=0;i { if(pthread_create(&tids[i],NULL,func,(void *)&i)) //产生线程,去完成矩阵相乘的部分工作量 { perror("pthread_create"); exit(1); } } for(i=0;i pthread_join(tids[i],NULL);//等待所有的子线程计算结束 for(i=0;i for(j=0;j for(k=0;k res[i][j]+=arr[i][j][k]; clock_t finish=clock();//结束计算 printf("并行计算用时%.2f秒\n",(long)(finish-start)/1E6); put(); exit(0); } void put() { FILE *file1,*file2,*file3;