Sobes.tech
Junior — Middle

Akými metódami je možné realizovať paralelný výpočet súčtu prvkov poľa pomocou ForkJoinPool?

sobes.tech AI

Odpoveď od AI

Pre paralelného výpočtu súčtu prvkov poľa pomocou ForkJoinPool je možné implementovať rekurzívnu úlohu, ktorá delí pole na časti a súčíta ich paralelne.

Hlavná myšlienka:

  • Ak je veľkosť podpoľa malá, vypočítame súčet priamo.
  • Inak rozdelíme podpole na dve časti, vytvoríme dve podúlohy, spustíme ich paralelne a spojíme výsledky.

Príklad v Jave 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(); // spustí ľavú úlohu asynchrónne
            int rightResult = rightTask.compute(); // vypočíta pravú úlohu v aktuálnom vlákne
            int leftResult = leftTask.join(); // čaká na výsledok ľavej úlohy
            return leftResult + rightResult;
        }
    }
}

// Použitie:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));

Tento prístup efektívne využíva viacvláknové spracovanie na zrýchlenie výpočtu súčtu veľkého poľa.