0

这是我并行乘法矩阵的代码:

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 毫秒,而串行版本运行大约 1 秒。我最多应该期望并行版本的 1/(numProcessors) 时间。

有什么我做错了吗?run() 方法被调用的次数与我机器上的处理器数量相同。

4

1 回答 1

3

有什么我做错了吗?

是的。您没有将矩阵相乘。您实际上正在做的是(实际上)将矩阵切成子矩阵,然后将位于原始矩阵对角线上的那些矩阵的子集相乘。

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


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

这里有几个相关的链接,虽然是在一般层面:

另请注意,根据 Wikipedia,有比“朴素”( ) 乘法更有效的非并行算法。O(N^3)

于 2013-08-11T23:42:24.770 回答