Java多线程矩阵乘法

时间:2014-12-06 16:51:33

标签: java multithreading matrix thread-synchronization

尝试使用多线程矩阵乘法在Java中工作。给出(m×n)矩阵,(n×k)矩阵和'线程来执行操作。

当矩阵为正方形且t == n时,我的程序有效。当运行t< n,其他线程不接受其他操作,并返回部分完成的矩阵。当矩阵不是方形时,附加线程返回数组超出边界错误并且不运行。我真的很感激任何建议。以下是相关的代码段

开始线程。 multipliers是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&gt; = i)返回;但我还没有找到一种方法来将线程的列职责纳入程序仍然有效。再次,任何建议指向我正确的方向将非常感激。谢谢

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

t个线程假设生成结果矩阵只需要t次乘法。当m!= k或t!= m或t!= k时不是这种情况。线程是仅处理您的请求的工作线程。我会考虑让每个MatrixMultiplier都能访问mxn,nxk,mxk矩阵和rolcolumn条目容器。

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

然后,run方法将使用entries容器来计算生成的mxk矩阵的给定条目的总和。 run方法可以变为:

   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. 不再需要多个课程
  4. 然后,您可以创建t个线程来处理条目容器中的每个条目,并在条目容器为空时退出。

    请注意,条目容器应该是java.util.concurrent包中可用的并发队列容器之一。

    剩下的任务是如何创建rowcolumn条目容器。以下是您可以使用的一些代码:

     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矩阵。

    希望这有帮助。