Sobes.tech
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.