Java并行矩阵乘法

时间:2016-04-27 19:05:49

标签: java multithreading

有人可以帮帮我吗?我正在尝试使用并行编程 - Java进行矩阵乘法。 这是我到目前为止所尝试的

public class MatrixParallel22 extends Thread{
final static int noThreads = 2 ;
public static void main(String args[]) throws Exception{
    //get the start time
    long startTime = System.currentTimeMillis();

    MatrixParallel [] threads = new MatrixParallel [noThreads] ;
    for(int me = 0 ; me < noThreads ; me++) {
        threads [me] = new MatrixParallel(me) ;
        threads [me].start() ;
    }

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

    long endTime = System.currentTimeMillis();

    System.out.println("Calculation completed in " +
                         (endTime - startTime) + " milliseconds");
}
int me ;
 public MatrixParallel(int me) {
      this.me = me ;
  }
 public void run() {

     //generate two matrices using random numbers
    int matrix1 [][] = matrixGenerator();
    int matrix2 [][] = matrixGenerator();

    //get the number of rows from the first matrix
    int m1rows = matrix1.length;
    //get the number of columns from the first matrix
    int m1cols = matrix1[0].length;
    //get the number of columns from the second matrix
    int m2cols = matrix2[0].length;

    //multiply the matrices and put the result in an array
    int[][] result = new int[m1rows][m2cols];
        for (int i=0; i< m1rows; i++){
           for (int j=0; j< m2cols; j++){
              for (int k=0; k< m1cols; k++){
                 result[i][j] += matrix1[i][k] * matrix2[k][j];
           }
        }
     }        

 }
 public static int[][] matrixGenerator(){
     //create an array
    int matrix [][] = new int[550][550];
    //create a random generator
    //and fill it with random numbers
    Random r = new Random( );
    for(int i=0; i < matrix.length; i++){
        for(int j=0; j < matrix[i].length; j++){
            matrix[i][j] = r.nextInt( 10000 );
        }
    }
    return matrix;
}

}

在这种情况下,我正在尝试设置变量中的线程数,然后测量并查看程序在增加/减少线程数时执行的速度。

//更新 - 当我执行代码..它工作正常。但问题是,如果我增加线程数,执行时间就会变慢。 例如,有2个线程,我得到316毫秒 有8个线程,我得到755毫秒 我不知道哪个部分是错的。这是我执行线程的方式吗?

1 个答案:

答案 0 :(得分:1)

完全可以预期,当您使用更多线程时,您的程序运行速度不会更快,因为您在每个单独的工作程序中为乘法创建了新的矩阵。您不是将任务拆分为多个可以由不同工作线程并行处理的部分。

  • 这本身不会导致您看到的性能进一步下降,因此很可能您遇到了一些与使用过多线程相关的潜在问题,如重大争用,缓存抖动等。

至于加速Java中的简单矩阵乘法实现,有许多类似的问题和非常好的答案(如Peter Lawrey's answer here)。

如果您实际使用的是大(n>> 500)的矩阵,您也可以尝试Strassen's algorithm。当然,任何用于矩阵乘法的专用工具都会将简单的Java实现从水中吹出来,但我假设你这样做的部分原因是为了好玩,部分是为了练习。

修改

看起来您不确定如何拆分和(尝试)并行化任务。最明显的分而治之策略要求将每个矩阵分成4个象限,并将n - 维矩阵的1个乘法转换为n/2 - 维矩阵的8个乘法,大致如下:

 A11 | A12     B11 | B12     A11*B11 | A11*B12     A12*B21 | A12*B22 
|----+----| x |----+----| = |--------+--------| + |---------+-------|
 A21 | A22     B21 | B21     A21*B11 | A21*B21     A22*B21 | A22*B22 

Strassen的算法可以使用非常精确选择的A ij 和B ij 矩阵的操作将此减少到7次乘法。

您还可以将使用多个线程获得的加速比与精心选择的数组迭代顺序的加速比较(请参阅Wayne and Sedgewick's illustration here)。