这是我并行编码基质的代码:
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()方法的调用次数与我机器上的处理器相同。
答案 0 :(得分:3)
我有什么问题吗?
是的。你没有乘以矩阵。你实际做的是(实际上)将矩阵切片到子矩阵中,然后乘以位于原始矩阵对角线上的那些矩阵的子集。
我建议你比较两个版本的计算结果......并从中得出你自己的结论。
矩阵乘法的有效并行化不是一个简单的问题。
以下是一些相关链接,尽管是一般性的:
http://www.cs.berkeley.edu/~yelick/cs267-sp04/lectures/13/lect13-pmatmul-6x.pdf - 从第17页开始。
http://www.slideshare.net/pkpramit/matrix-multiplicationan-example-of-concurrent-programming
Parallel Matrix Multiplication in Java 6 ...包含一些Java代码(YMMV)。
另请注意,根据维基百科,有more efficient非并行算法而非“天真”(O(N^3)
)乘法。