Visualizzazione dei risultati da 1 a 6 su 6

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    al di la del fatto che quando vedo campi e metodi senza un modificatore di visibilità provo la stessa sensazione di unghiate sopra la lavagna, io fare così:

    codice:
    public void parallelizzaEdEsegui(Collection<? extends RecursiveTask<Double>> tasks) {
       ForkJoinPool fjp = new ForkJoinPool();
       for(RecursiveTask<Double> t : tasks)
          fjp.invoke(t);
    }
    le tue classi (... e anche qui sorvolo) che eseguono conti estendono tutte RecursiveTask. Quindi puoi instanziarle, infilarle in una collection qualsiasi (lista, mappa, set o che ne sò) e darla in pasto a questo metodo...

    edit:
    alternativamente, usando varargs:
    codice:
    public void parallelizzaEdEsegui(RecursiveTask<Double>... tasks) {
      ForkJoinPool fjp = new ForkJoinPool();
       for(RecursiveTask<Double> t : tasks)
          fjp.invoke(t);
    }
    come prima ma invece di buttare tutto in una collection devi fare una roba tipo:
    codice:
    parallelizzaEdEsegui(new Sum(nums,0, nums.length), new Sum(nums,1, nums.length), ... );


    ovvero darle come parametro alla funzione quante volte vuoi...
    Ultima modifica di kuarl; 19-01-2014 a 16:24

  2. #2
    Quote Originariamente inviata da kuarl Visualizza il messaggio
    al di la del fatto che quando vedo campi e metodi senza un modificatore di visibilità provo la stessa sensazione di unghiate sopra la lavagna, io fare così:

    codice:
    public void parallelizzaEdEsegui(Collection<? extends RecursiveTask<Double>> tasks) {
       ForkJoinPool fjp = new ForkJoinPool();
       for(RecursiveTask<Double> t : tasks)
          fjp.invoke(t);
    }
    le tue classi (... e anche qui sorvolo) che eseguono conti estendono tutte RecursiveTask. Quindi puoi instanziarle, infilarle in una collection qualsiasi (lista, mappa, set o che ne sò) e darla in pasto a questo metodo...

    edit:
    alternativamente, usando varargs:
    codice:
    public void parallelizzaEdEsegui(RecursiveTask<Double>... tasks) {
      ForkJoinPool fjp = new ForkJoinPool();
       for(RecursiveTask<Double> t : tasks)
          fjp.invoke(t);
    }
    come prima ma invece di buttare tutto in una collection devi fare una roba tipo:
    codice:
    parallelizzaEdEsegui(new Sum(nums,0, nums.length), new Sum(nums,1, nums.length), ... );


    ovvero darle come parametro alla funzione quante volte vuoi...
    Non capisco come dovrei modificare il codice e ho timore che tu ti sia dimenticato di portare fuori da Sum questo pezzo:

    codice:
    for (int i = start; i < end; i++) {
                    sum += data[i];
                    for (int j = start; j < end; j++) {
                        sum += data[j];
                        sum -= data[j];
                    }
                }
    Se riesci a farmi vedere l'esempio completo forse riesco a comprendere la tua idea.
    Più pratica in futuro...

  3. #3
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    no, continuo a non capire. Se vuoi trasformare codice single thread in multi thread devi riscrivere tutto. La bacchetta magica non esiste. Se si tratta solo di operazioni algebriche puoi valutare la possibilità di utilizzare librerie parallele, così non dovrai scrivertele da solo.

    Un esempio è openCL. Ti fornisce una libreria di funzioni per il calcolo parallelo che può essere eseguita sia su CPU sfruttando i vari core e set di istruzioni specialistici per queste operazioni, sia le GPU.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.