在开发Java软件的过程中,我在这里问Java Concurrent - no speedUp 获得LU算法 - 虚假共享?为什么我没有加快使用 CyclicBarrier 并行化此代码的速度。
public void decompose(){
int n = A.length;
for(int k=0; k<n-1;k++) {
for(int i=k+1; i<n; i++) {
A[i][k] = A[i][k]/A[k][k];
for(int j=k+1; j<n; j++) {
A[i][j] = A[i][j] - A[i][k] * A[k][j];
}
}
}
decomposed = true;
}
该算法基本上是做矩阵的高斯归约
经过一番讨论(如果您感兴趣,请查看评论),用户 (brettw) 使用 Fork/Join Java 框架回复了此解决方案:
public void decompose()
{
final Semaphore semaphore = new Semaphore(0);
class Decompose extends RecursiveAction {
private final int k;
Decompose(int k) {
this.k = k;
}
protected void compute() {
final int n = A.length;
for (int i = k + 1; i < n; i++) {
A[i][k] = A[i][k] / A[k][k];
for (int j = k + 1; j < n; j++) {
A[i][j] = A[i][j] - A[i][k] * A[k][j];
}
}
semaphore.release();
}
}
ForkJoinPool mainPool = new ForkJoinPool();
for (int k = 0; k < A.length - 1; k++) {
mainPool.execute(new Decompose(k));
}
semaphore.acquireUninterruptibly(A.length - 1);
}
问题是该算法不会产生预期的结果,因为没有与工作人员同步(每一行都必须更新所有值以增加k
值)。
我的问题是:
由于我无法预见线程/工作者的数量,您会建议什么样的同步策略?