如何在java中并行化for循环?

tom*_*ral 2 java parallel-processing

我有 java 中 LU 矩阵分解的顺序代码。我的问题是,如何轻松地使分解函数并行?c# 中是否有类似的技术,例如OpenMPParallel.for

我认为,并行化是可能的for loop,但我不知道如何在 Java 中轻松实现这一点。

这是我的代码:

public class LuDecomposition {
    private int size;
    private double[][] matrix;

    public LuDecomposition(double[][] matrix, int size) {
        this.matrix = matrix;
        this.size = size;
    }

    public void printMatrix(double[][] matrix) {
        for(int i=0; i<size; i++) {
            for(int j=0; j<size; j++) {
                System.out.printf("%.2f   ", matrix[i][j]);
            }
            System.out.println();
        }
        System.out.println();
    }

    public void decompose() {
        double[][] upper = new double[this.size][this.size];
        double[][] lower = new double[this.size][this.size];
        double sum = 0.0;

        for(int i=0; i<size; i++) {
            for(int j=0; j<size; j++) {
                upper[i][j] = 0.0;
                lower[i][j] = 0.0;
            }
        } 

        long start = System.nanoTime();

        for(int i=0; i<size; i++) {
            // U matrix
            for(int k=i; k<size; k++) {
                sum = 0.0;
                for(int j=0; j<i; j++) {
                    sum += (lower[i][j] * upper[j][k]);
                }
                upper[i][k] = matrix[i][k] - sum;
            }
            // L matrix
            for(int k=i; k<size; k++) {
                if(i==k) {
                    lower[i][i] = 1;
                } else {
                    sum = 0.0;
                    for(int j=0; j<i; j++) {
                        sum += (lower[k][j] * upper[j][i]);
                    }
                    lower[k][i] = ((matrix[k][i] - sum) / upper[i][i]);
                }

            }
        }
        long end = System.nanoTime();

        //printMatrix(matrix);
        //printMatrix(lower);
        //printMatrix(upper);
        System.out.println("LU decomposition duration(seconds): " + (end - start) / 1000000000.0);
    }

}


Run Code Online (Sandbox Code Playgroud)

谢谢。

mne*_*rco 7

如果用 Int Streams 替换 for 循环,则很容易使其并行运行:

例子:

  IntStream.range(0, 10).parallel().forEach(i -> {
    System.out.println(i);
  });
Run Code Online (Sandbox Code Playgroud)