1. 程式人生 > >java 多執行緒平行計算之矩陣乘法(星星筆記)

java 多執行緒平行計算之矩陣乘法(星星筆記)

用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