Junior — Middle
Jakými metodami lze realizovat paralelní výpočet součtu prvků pole pomocí ForkJoinPool?
sobes.tech AI
Odpověď od AI
Pro paralelní výpočet součtu prvků pole pomocí ForkJoinPool lze implementovat rekurzivní úlohu, která dělí pole na části a součty provádí paralelně.
Hlavní myšlenka:
- Pokud je velikost podpole malá, spočítáme součet přímo.
- Jinak rozdělíme podpole na dvě části, vytvoříme dvě podúlohy, spustíme je paralelně a spojíme výsledky.
Příklad v Java s RecursiveTask<Integer>:
import java.util.concurrent.*;
public class SumTask extends RecursiveTask<Integer> {
private static final int THRESHOLD = 1000;
private int[] array;
private int start, end;
public SumTask(int[] array, int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
int length = end - start;
if (length <= THRESHOLD) {
int sum = 0;
for (int i = start; i < end; i++) {
sum += array[i];
}
return sum;
} else {
int mid = start + length / 2;
SumTask leftTask = new SumTask(array, start, mid);
SumTask rightTask = new SumTask(array, mid, end);
leftTask.fork(); // spouští levý úkol asynchronně
int rightResult = rightTask.compute(); // vypočítá pravý úkol v aktuálním vlákně
int leftResult = leftTask.join(); // čeká na výsledek levého úkolu
return leftResult + rightResult;
}
}
}
// Použití:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));
Tento přístup efektivně využívá vícvláknové zpracování ke zrychlení součtu velkého pole.