简体   繁体   English

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

[英]How to parallelize for loop in java?

I have sequential code for LU matrix decomposition in java. 我在Java中有LU矩阵分解的顺序代码。 My question is, how to easily make decompose function parallel? 我的问题是,如何轻松地使分解函数并行化? Is there any similar techniques like OpenMP or Parallel.for in c#? c#中是否有类似OpenMPParallel.for的类似技术?

I think, that It's possible to paralellize for loop but I don't know how to easily achieve this in Java. 我认为,可以并行引用for loop但我不知道如何在Java中轻松实现这一目标。

Here is my code: 这是我的代码:

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);
    }

}


Thank you. 谢谢。

If you replace your for loops with Int Streams, it is very easy to make it run in parallel: 如果将In循环替换为for循环,则很容易使其并行运行:

Example: 例:

  IntStream.range(0, 10).parallel().forEach(i -> {
    System.out.println(i);
  });

In Java you can use parallel streams ( https://examples.javacodegeeks.com/core-java/java-8-parallel-streams-example/ ) but to utilize it your for loops have to have somehow independent iterations. 在Java中,您可以使用并行流( https://examples.javacodegeeks.com/core-java/java-8-parallel-streams-example/ ),但是要使用它,for循环必须以某种方式进行独立的迭代。 You cannot parallelize for loop if next iteration depends on results of previous iteration. 如果下一次迭代取决于上一次迭代的结果,则无法并行化for循环。 So you first need to make your algo parallel or use existing Java libraries for parallel LU decomposition like https://github.com/alexkaratarakis/Parallel-Colt 因此,您首先需要使算法并行化或使用现有的Java库进行并行LU分解,例如https://github.com/alexkaratarakis/Parallel-Colt

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

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