Как распараллелить для цикла в Java? - PullRequest
0 голосов
/ 30 января 2019

У меня есть последовательный код для разложения матрицы LU в Java.Мой вопрос заключается в том, как легко сделать функцию разложения параллельной?Есть ли подобные методы, такие как OpenMP или Parallel.for в c #?

Я думаю, что возможно паралеллизировать 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);
    }

}


Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

В Java вы можете использовать параллельные потоки (https://examples.javacodegeeks.com/core-java/java-8-parallel-streams-example/), но чтобы использовать его, ваши циклы for должны иметь как-то независимые итерации. Вы не можете распараллелить цикл for, если следующая итерация зависит от результатов предыдущей итерации. Итак, сначала вам нужносделать ваш алгоритм параллельным или использовать существующие библиотеки Java для параллельной декомпозиции LU, например https://github.com/alexkaratarakis/Parallel-Colt

0 голосов
/ 30 января 2019

Если вы замените свои циклы for на Int Streams, очень легко заставить его работать параллельно:

Пример:

  IntStream.range(0, 10).parallel().forEach(i -> {
    System.out.println(i);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...