操作系统实验——串行、多线程和线程池三种方式计算矩阵乘法

操作系统实验——串行、多线程和线程池三种方式计算矩阵乘法


注:写实验报告的同学在复制代码的时候记得改一改变量名和函数!最好看懂了自己写一下!不要直接copy!太明显了~~

1.实验目的:以多线程(并行)、串行以及线程池三种形式计算矩阵乘法,统计分析三种方法所需要的时间,并根据公式speedup<=1/(s+(1-s)/n),计算出顺序执行占用比s.

2.对公式speedup<=1/(s+(1-s)/n)的解释:speedup=串行时间/并行时间,又称加速比,s是顺序执行占用比,也就是程序中必须串行(单线程)执行的部分,n是你的电脑的内核数,可通过设备管理器查看

3.实现思路:
    1)定义两个较大的1024阶方阵和确定线程数量n(n从2-1024*1024均可以)
    2)实现一个singleThread()函数,用来串行(直接)计算矩阵乘法
    3)实现一个工作线程workThread,每个线程完成矩阵乘法运算工作的1/n,创建n个线程,用多线程计算矩阵乘法
    4)声明一个线程池,将n个线程放入线程池中进行管理,用线程池进行矩阵乘法的运算

4.代码
工作线程类workThread:
package cn.edu.seu.yujun.OS;
/**
 * 
 * @author Fish
 * Date:2015/4/7
 */
public class WorkThread implements Runnable {
	private int start;//计算开始位置,以此区分工作线程工作任务
	private int [][]A;
	private int [][]B;
	private int [][]C;
	
	//工作线程构造方法
	public WorkThread(int start,int [][]A,int [][]B,int [][]C){
		this.start=start;
		this.A=A;
		this.B=B;
		this.C=C;
	}
	
	@Override
	public void run() {
		int i,j,k;
		//根据线程数量划分每个工作线程任务
		for(i=start; i
驱动类Driver:
package cn.edu.seu.yujun.OS;
/**
 * @author Fish
 * Date:2015/4/7
 */
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Driver {
	public final static int M=1024;//定义常量:矩阵A的行数
	public final static int K=1024;//定义常量:矩阵A的列数,矩阵B的行数
	public final static int N=1024;//定义常量:矩阵B的列数
	final static int NUM_THREADS=2;//定义常量:线程数量
	private static int [][]A;//矩阵A
	private static int [][]B;//矩阵B
	private static int [][]C;//矩阵C
	//---------------------
	//驱动类构造方法
	public Driver(){
		A=new int[M][K];
		B=new int[K][N];
		C=new int[M][N];//A、B、C初始化
		fillRandom(A);//用0-99的随机数初始化矩阵A
		fillRandom(B);//用0-99的随机数初始化矩阵B
		for(int i=0;i

5.运行结果:
操作系统实验——串行、多线程和线程池三种方式计算矩阵乘法_第1张图片
操作系统实验——串行、多线程和线程池三种方式计算矩阵乘法_第2张图片
根据上述结果可以看出:并不是线程数量越多,运算速度越快!运算时间与许多因素有关,创建线程也需要时间!在一些小型运算中,创建线程的时间甚至比计算时间还长;另外,曾测试过在程序中将for循环修改成顺序一条条语句,运算时间降低了很多!在不同时间进行计算结果也不太一致~~
操作系统实验——串行、多线程和线程池三种方式计算矩阵乘法_第3张图片
操作系统实验——串行、多线程和线程池三种方式计算矩阵乘法_第4张图片

随着线程数量增多,运算时间反而越来越长~~
另外,不同的电脑可能不太一样!大家可以自己测试一下~~

下面我们来计算一下s:
选取4线程时的数据,speedup=7058/4815=1.465,电脑内核数n是4,带入公式中可以得到s<=57.7%,也就是程序中必须单线程执行的占所有的比例小于57.7%

你可能感兴趣的:(Java)