是否可以并行运行以下代码?

时间:2019-11-09 13:26:27

标签: java parallel-processing

实际上,以下代码对矩阵进行了高斯消除。我的工作是尝试一些Java并发技术,使其成为并行程序。 但是,问题在于每个外部循环都具有来自先前循环的数据依赖性。而且我尝试过在外部循环中使用并行技术的成本太高。有人可以帮我吗?如何让以下代码并行运行?在这种情况下,Java并发技术中是否可以处理任何技术?

    for (int i = 0; i <1; i++) {

        int max = i;
        for (int j = i + 1; j < N; j++) {
            if (Math.abs(matrix[j][i]) > Math.abs(matrix[max][i])) {
                max = j; 
            }
        }

        double[] temp = matrix[i]; 
        matrix[i] = matrix[max];
        matrix[max] = temp; 


        for (int k = i + 1; k < N; k++) 
        {
            double alpha = matrix[k][i] / matrix[i][i]; 
            for (int j = i; j < N; j++) 
            {
                matrix[k][j] -= alpha * matrix[i][j];
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

由于修改后的数据不重叠,因此k循环完成的工作可以并行进行。

只需将循环主体完成的工作委托给线程。

最简单的方法是使用Java 8并行流,即将k循环替换为:

final int ii = i; // since 'i' is not effectively-final
IntStream.range(ii + 1, N).parallel().forEach(k -> {
    double alpha = matrix[k][ii] / matrix[ii][ii];
    for (int j = ii; j < N; j++) {
        matrix[k][j] -= alpha * matrix[ii][j];
    }
});