簡體   English   中英

Java多線程矩陣乘法

[英]Java multi-thread matrix multiplication

嘗試使多線程矩陣乘法在Java中工作。 給定一個(mxn)矩陣,一個(nxk)矩陣和“ t”線程來執行操作。

我的程序在矩陣為正方形且t == n時起作用。 當以t <n運行時,其他線程不執行其他操作,而是返回部分完成的矩陣。 當矩陣不是正方形時,其他線程將返回數組超出范圍的錯誤並且不會運行。 我真的很感謝任何建議。 以下是相關的代碼段

開始線程。 multipliers是MatrixMultiplier的數組,MatrixMultiplier是稍后定義的類。

    Multiply multiply = new Multiply(cols_mat,rows_mat2);

    for (int i = 0; i < threads ; i ++){
        multipliers[i] = new MatrixMultiplier(multiply);
    }

    for (int i = 0; i < threads; i++){
        my_threads[i] = new Thread(multipliers[i]);
    }

    for (int i = 0; i < threads; i++){
        my_threads[i].start();
    }

    for (int i = 0; i < threads ; i++){
        my_threads[i].join();
    }

定義矩陣乘法的乘類

class Multiply extends MatrixMultiplication{

private int i;
private int j;
private int chance;

public Multiply(int i, int j){
    this.i=i;
    this.j=j;
    chance=0;
}

public synchronized void multiplyMatrix(){

    int sum=0;
    int a=0;
    for(a=0; a<i; a++){
        sum = 0;
        for ( int b = 0; b<j; b++){
            sum=sum+mat[chance][b]*mat2[b][a];
        }
        result[chance][a]=sum;  
    }

    if(chance >=i)
        return;
    chance++;
}

}

和矩陣乘法器

class MatrixMultiplier implements Runnable {

private final Multiply mul;

public MatrixMultiplier(Multiply mul){
    this.mul=mul;
}

@Override
public void run(){
    mul.multiplyMatrix();
}

}

我個人認為問題出在if(chance> = i)return; 但是我還沒有找到一種在程序仍在工作的情況下將線程的列職責納入其中的方法。 再次,任何指向我正確方向的建議將不勝感激。 謝謝

您的代碼有幾個問題。

t個線程假定只需要t乘即可生成結果矩陣。 當m!= k或t!= m或t!= k時不是這種情況。 線程是僅處理您的請求的工作線程。 我會考慮使每個MatrixMultiplier都可以訪問mxn,nxk,mxk矩陣和rolcolumn條目容器。

 class MatricMultiplier {
      private double a[][], b[][], results[][];
      private Queue<..> entries;
      ....
 }

然后,run方法將使用entry容器為所得的mxk矩陣的給定條目計算總和。 運行方法可能變為:

   run() {
      for(Entry entry = entries.poll() ; entry != null ; entry = entries.poll()) {
          int row = entry.row;
          int col = entry.col;
          double sum = 0.0;
          for(int i = 0 ; i < a[row].length ; i++) {
              sum += a[row][i] * b[i][col];
          }
          results[row][col] = sum;
      }
   }

這里要注意的三件事與您所擁有的有所不同。

  1. 您沒有使用同步塊
  2. 每個條目都在為結果矩陣的唯一行/列計算答案
  3. 不再需要Multiple類

然后,您可以創建t個線程來處理entry容器中的每個條目,並在entry容器為空時退出。

請注意,entities容器應該是java.util.concurrent包中可用的並發Queue容器之一。

剩下的任務是如何創建行列條目容器。 這是您可以使用的一些代碼:

 Queue<..> entries = new Concurrent...<..>();
 int rowSize = a.length;
 int colSize = b[0].length;
 for(int row = 0 ; row < rowSize ; row++) {
    for(int col = 0 ; col < colSize ; col++) {
      entries.add(new RowColumnEntry(row,col));
    }
 }

注意a和b是mxn和nxk矩陣。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM