Ciao a tutti,
sono alle prese con lo studio degli algoritmi di ordinamento e ho un problema con il quicksort.
In particolare ho provato ad eseguire il quicksort sfruttando il calcolo parallelo ma ottengo tempi nettamente più alti rispetto alla versione sequenziale.
Uso i forkJoinTask per suddividere il lavoro e il mio processore ha 4 core fisici (8 virtuali).
Qui il codice del ForkJoinTask:
qui il codice del metodo wrappler:codice:static class ParallelQuickSorter extends RecursiveAction{ int [] a; int from; int to; int numThreadAvailable; Random generator; public ParallelQuickSorter(int[] a, int from, int to, int numThreadAvailable, Random generator) { this.a = a; this.from = from; this.to = to; this.numThreadAvailable = numThreadAvailable; this.generator = generator; } @Override protected void compute() { if(from >= to) return; if(numThreadAvailable <= 1) qsortHoare(a, from, to, generator); //versione sequenziale int iPivot = from + generator.nextInt(to - from + 1); int pivot = a[iPivot]; int i = from; int j = to; do{ while(a[i] < pivot) i++; while(a[j] > pivot) j--; if(i <= j) swap(a, i++, j--); }while(i <= j); ParallelQuickSorter left = new ParallelQuickSorter(a, from, j, numThreadAvailable / 2, generator); ParallelQuickSorter right = new ParallelQuickSorter(a, i, to, numThreadAvailable / 2, generator); invokeAll(left, right); } }
qui un immagine di un pezzo significativo dell output del programma con i tempi di ordinamento con diversi algoritmi:codice:public static void parallelQuickSort (int [] a){ int numCores = Runtime.getRuntime().availableProcessors(); Random generator = new Random(); ForkJoinPool pool = ForkJoinPool.commonPool(); ParallelQuickSorter sorter = new ParallelQuickSorter(a, 0, a.length - 1, numCores, generator); pool.invoke(sorter); }
risultati1.jpg
Qualsiasi aiuto è apprezzato,
Grazie
PS, scusate l'indentazione. Caricandolo sul sito mi si è un pochetto scombussolata


Rispondi quotando