并行编程报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档