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