java 多執行緒平行計算之矩陣乘法(星星筆記)
阿新 • • 發佈:2019-01-29
用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