实际上,以下代码对矩阵进行了高斯消除。我的工作是尝试一些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];
}
}
}
答案 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];
}
});