Junior — Middle
Kādiem veidiem var īstenot paralēlo elementu summas, izmantojot ForkJoinPool?
sobes.tech AI
Atbilde no AI
Lai paralēli skaitītu masīva elementu summu ar ForkJoinPool palīdzību, var īstenot rekursīvu uzdevumu, kas dalās masīvā uz daļām un skaita to summu paralēli.
Galvenā ideja:
- Ja apakšmasīva lielums ir mazs, skaitām summu tieši.
- Pretējā gadījumā dalām apakšmasīvu uz divām daļām, izveidojam divus uzdevumus, izpildām tos paralēli un apvienojam rezultātus.
Piemērs Java valodā ar 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(); // palaidžiam kairiąją užduotį asinhroniškai
int rightResult = rightTask.compute(); // skaičiuojame dešiniąją užduotį dabartiniame sraute
int leftResult = leftTask.join(); // laukiame kairiosios užduoties rezultato
return leftResult + rightResult;
}
}
}
// Piemērs lietošanai:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));
Šāda pieeja efektīvi izmanto daudzprocesora iespējas paātrinot lielu masīvu summēšanas aprēķinu.