Я пишу программу, работающую с матричным параллельным программированием, используя платформу Executorservice. И я установил значение fixedpoolsize равным 4, однако меня удивляет то, что когда размер матрицы установлен на 5000, скорость использования многопоточности по сравнению с последовательным выполнением превышает 4 (что также является ядром моего процессора). И я проверил, что мой процессор не поддерживает гиперпоточность.
На самом деле я использую контейнер Callable and Future, поскольку моя задача многопоточности требует возврата результата.
// Part of code for parallel programming
double[][] x = new double[N][N];
List<Future<double[]>> futureList = new ArrayList<>();
for (int k=0;k<N;k++)
{
Future<double[]>temp=service.submit(new Thread.Task(N,k,matrix,vector));
futureList.add(temp);
}
for (int j = 0; j < N; j++) {
x[j]=futureList.get(j).get();
}
public double[] call() throws Exception {
for (int i = N - 1; i >= 0; i--)
{
double sum = 0;
for (int j = i + 1; j < N; j++)
{
sum += matrix[i][j] * x[j];
}
x[i] = (vector[i][k] - sum) / matrix[i][i];
}
return x;
}
// Part of code for Serial programming
double[][] x = new double[N][N];
for (int k=0;k<N;k++)
{
for (int i = N - 1; i >= 0; i--)
{
double sum = 0;
for (int j = i + 1; j < N; j++)
{
sum += matrix[i][j] * x[j][k];
}
x[i][k] = (vector[i][k] - sum) / matrix[i][i];
}
}
Короче, я просто убираю внутренний цикл, чтобы позволить ему запустить поток, и оставляю внешний цикл без изменений.
Нокак может быть такое ускорение?
Поскольку из моей предыдущей концепции максимальное ускорение может быть только 4. И я проверил, что задача на самом деле выполняется четырьмя потоками.