Sobes.tech
Junior — Middle

Koje metode možete koristiti za implementaciju paralelnog računanja sume elemenata niza pomoću ForkJoinPool?

sobes.tech АИ

Одговор од АИ

Za paralelno izračunavanje sume elemenata niza pomoću ForkJoinPool, može se implementirati rekurzivni zadatak koji deli niz na delove i sabira ih paralelno.

Glavna ideja:

  • Ako je veličina podniza mala, računamo sumu direktno.
  • U suprotnom, delimo podniz na dva dela, kreiramo dva podzadatka, pokrećemo ih paralelno i spajamo rezultate.

Primer u Javi sa 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(); // pokreće levu zadatak asinhrono
            int rightResult = rightTask.compute(); // računa desnu zadatak u trenutnom thread-u
            int leftResult = leftTask.join(); // čeka rezultat leve zadatka
            return leftResult + rightResult;
        }
    }
}

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

Ovaj pristup efikasno koristi višestruko procesiranje za ubrzanje sabiranja velikog niza.