Возможно ли запустить мой следующий код параллельно? - PullRequest
0 голосов
/ 09 ноября 2019

На самом деле следующий код выполняет гауссово исключение для матрицы. И моя работа состоит в том, чтобы попробовать какую-то технику параллельного выполнения 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 голосов
/ 09 ноября 2019

Работа, выполняемая циклом 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];
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...