用java编写两个n阶的方阵A和B的相乘程序,结果存放在方阵C中,其中使用Runnable接口实现矩阵的乘法。
方阵A和B的初始值如下:(同时开两个线程)
输出:c中所有元素之和、程序的执行时间
具体的程序如下:
package com.xing.matrix; /** * * @author Yinxing * */ public class Matrixmul { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub int i,j,t = 0; int leng = 1500; long startTime,endTime; long a[][] = new long[leng][leng]; long b[][] = new long[leng][leng]; //--------------对矩阵A和矩阵B进行初始化------------- for(i=0;i<leng;i++) { t=i+1; for(j=0;j<leng;j++) { a[i][j]=t++; b[i][j]=1; } } Matrix matrixone = new Matrix(a, b, 0, leng); Matrix matrixtwo = new Matrix(a, b, 1, leng); Thread threadone = new Thread(matrixone); Thread threadtwo = new Thread(matrixtwo); //-------------------并行计算-------------------- startTime = System.currentTimeMillis(); threadone.start(); threadtwo.start(); threadone.join(); threadtwo.join(); endTime = System.currentTimeMillis(); System.out.println("并行结果 = " + (matrixone.getSum() + matrixtwo.getSum())); System.out.println("并行时间 = " + (endTime - startTime)); //-------------------串行计算-------------------- startTime = System.currentTimeMillis(); Matrix matrixthree = new Matrix(a, b, 0, leng); matrixthree.serial(); endTime = System.currentTimeMillis(); System.out.println("串行结果 = " + matrixthree.getSum()); System.out.println("串行时间 = " + (endTime - startTime)); } } class Matrix implements Runnable{ private long A[][]; private long B[][]; private long C[][]; private int start ; private int end ; private long sum = 0 ; public Matrix(long a[][],long b[][],int st,int en){ this.A = a; this.B = b; this.start = st; this.end = en; this.C = new long[en][en]; } @Override public void run() { // TODO Auto-generated method stub int i,j,k; for( i=start; i< end; i += 2) { for( j=0;j<end;j++) { C [i][j] = 0; for( k=0; k< end;k++) { C[i][j]+=A[i][k]*B[k][j]; } } } for( i=start; i<end; i+=2) for( j=0; j<end; j++) sum += C[i][j]; } public void serial() { //串行计算一个矩阵的乘法然后在求和 int i,j,k; for( i=0; i< end; i ++) { for( j=0;j<end;j++) { C[i][j]=0; for( k=0; k< end;k++) { C[i][j]+=A[i][k]*B[k][j]; } } } for( i=0; i<end; i++) for( j=0; j<end; j++) sum += C[i][j]; } public long getSum() { return this.sum; } }运行结果如下:(其中利用多核并行的部分为乘法和求和)
相对加速比为:58692/32020= 1.832979387882573