Visualizzazione dei risultati da 1 a 1 su 1

Visualizzazione discussione

  1. #1
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120

    [Java] Quicksort parallelo più lento di quello sequenziale

    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:
    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 il codice del metodo wrappler:
    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);
    }
    qui un immagine di un pezzo significativo dell output del programma con i tempi di ordinamento con diversi algoritmi:
    risultati1.jpg


    Qualsiasi aiuto è apprezzato,
    Grazie

    PS, scusate l'indentazione. Caricandolo sul sito mi si è un pochetto scombussolata
    Ultima modifica di Nikopol; 21-05-2015 a 22:35
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.