Java多线程矩阵乘法

时间:2013-08-11 23:36:11

标签: java multithreading

这是我并行编码基质的代码:

public void multiplyParallel() {
    int numProcessors = Runtime.getRuntime().availableProcessors();
    int step = (int)MATRIX_SIZE/numProcessors;
    for (int i=0; i<numProcessors; i++)  {
        Runnable r = new MatrixMultiply(this.start, this.end);
        new Thread(r).start();
        this.start += step;
        this.end += step;
    }
    this.start = 0;
    this.end = 0;
}

@Override
public void run() { 
    for (int i=this.start; i<this.end; i++) 
        for (int j=this.start; j<this.end; j++)
            for (int k=this.start; k<this.end; k++)
                this.matrix3[i][j] = this.matrix1[i][k] * this.matrix2[k][j];
}

但是当我在1024x1024矩阵上运行此代码时,它只运行2-3 ms,而串行版本运行大约1秒。我应该期待最好的并行版本的1 /(numProcessors)时间。

我有什么问题吗? run()方法的调用次数与我机器上的处理器相同。

1 个答案:

答案 0 :(得分:3)

  

我有什么问题吗?

是的。你没有乘以矩阵。你实际做的是(实际上)将矩阵切片到子矩阵中,然后乘以位于原始矩阵对角线上的那些矩阵的子集

我建议你比较两个版本的计算结果......并从中得出你自己的结论。


矩阵乘法的有效并行化不是一个简单的问题。

以下是一些相关链接,尽管是一般性的:

另请注意,根据维基百科,有more efficient非并行算法而非“天真”(O(N^3))乘法。