繁体   English   中英

Java并发-Fork / Join中的线程同步-LU分解

[英]Java Concurrent - Thread synchronization in Fork/Join - LU decomposition

在开发Java软件期间,我在这里问Java并发-没有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 Framework答复了此解决方案:

    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值)。

我的问题是:

由于我无法预见线程/工人的数量,您会建议哪种同步策略?

您没有按照预期的方式使用Fork-Join池。 您需要将工作分为几小部分。 然后分解()每个部分并合并结果。

compute()需要以下代码:

if (work < max) {
   work left = split left half
   work right = split right half
   fork (left) 
   right.compute()
   left.join()
} 

不拆分工作,您将不会使用多个线程。 使用信号量单线程工作,您将永远看不到速度的提高。

查看API中使用此框架的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM