Module: PRuby::PArrayRange
- Defined in:
- lib/pruby/array-range.rb
Overview
Definition des methodes paralleles qui s'appliquent directement (et uniquement) a des Array ou des Range.
Les methodes publiques sont les suivantes:
-
peach
-
peach_index
-
pmap
-
preduce
Ces methodes sont definies dans le present module, mais ensuite les classes Array et Range sont etendues avec ces methodes (vie des includes).
Instance Method Summary collapse
-
#peach(opts = {}, &b) ⇒ self, self.to_a
Execute un bloc de code sur chacun des elements d'un Array ou Range.
-
#peach_index(opts = {}, &b) ⇒ self
Execute un bloc de code sur chacun des indices d'un Array.
-
#pmap(opts = {}, &b) ⇒ Array
Applique un bloc de code sur chacun des elements d'un Array ou Range pour produire un nouvel Array avec les resultats.
-
#preduce(val_initiale, opts = {}, &b) ⇒ T, Fixnum
Applique un bloc, qui devrait avoir deux arguments et etre associatif, pour produire la reduction des elements d'un Array ou d'un Range.
Instance Method Details
#peach(opts = {}, &b) ⇒ self, self.to_a
Par defaut, si aucune option n’est specifiee, ceci est equivalent a utiliser PRuby.nb_threads threads avec un mode :static true. Donc: “pfoo()” = “pfoo( nb_threads: PRuby.nb_threads, static: true )” (pour pfoo = peach, peach_index, pmap, preduce).
Execute un bloc de code sur chacun des elements d'un Array ou Range
41 42 43 44 45 |
# File 'lib/pruby/array-range.rb', line 41 def peach( opts = {}, &b ) return to_a.peach( opts, &b ) if self.class == Range __pforall__( self, false, opts, &b ) end |
#peach_index(opts = {}, &b) ⇒ self
Par defaut, si aucune option n’est specifiee, ceci est equivalent a utiliser PRuby.nb_threads threads avec un mode :static true. Donc: “pfoo()” = “pfoo( nb_threads: PRuby.nb_threads, static: true )” (pour pfoo = peach, peach_index, pmap, preduce).
Execute un bloc de code sur chacun des indices d'un Array
62 63 64 65 66 67 |
# File 'lib/pruby/array-range.rb', line 62 def peach_index( opts = {}, &b ) DBC.require( self.class != Range, "*** La methode peach_index ne peut pas etre utilisee avec un Range" ) __pforall__( self, true, opts, &b ) end |
#pmap(opts = {}, &b) ⇒ Array
Par defaut, si aucune option n’est specifiee, ceci est equivalent a utiliser PRuby.nb_threads threads avec un mode :static true. Donc: “pfoo()” = “pfoo( nb_threads: PRuby.nb_threads, static: true )” (pour pfoo = peach, peach_index, pmap, preduce).
Applique un bloc de code sur chacun des elements d'un Array ou Range pour produire un nouvel Array avec les resultats
82 83 84 85 86 |
# File 'lib/pruby/array-range.rb', line 82 def pmap( opts = {}, &b ) return to_a.pmap( opts, &b ) if self.class == Range __pforall__( Array.new(size), false, opts, &b ) end |
#preduce(val_initiale, opts = {}, &b) ⇒ T, Fixnum
Utilise toujours une repartition statique par tranche d’elements adjacents! Raison: pcq. trop complique de faire autrement… mais surtout pas necessaire, car il n’y a pas (il ne devrait pas y avoir!?) vraiment de difference dans le temps d’execution entre les taches!
La valeur initiale est utilisee… par chacun des threads! Ceci implique que si cette valeur n’est pas un element neutre de l’operation binaire, alors le resultat final dependra du nombre de threads utilises. Donc, il est preferable d’utiliser un element neutre.
Applique un bloc, qui devrait avoir deux arguments et etre associatif, pour produire la reduction des elements d'un Array ou d'un Range.
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/pruby/array-range.rb', line 131 def preduce( val_initiale, opts = {}, &b ) return to_a.preduce( val_initiale, opts, &b ) if self.class == Range return val_initiale if size == 0 nb_threads = __nombre_de_threads__( opts[:nb_threads], size ) resultat = (0...nb_threads).map { val_initiale } fork_and_wait_threads_adj( nb_threads, nil, true ) do |i| resultat[PRuby.thread_index] = yield( resultat[PRuby.thread_index], self[i] ) end # La reduction finale peut devoir etre faite de facon differente. b = opts[:final_reduce] if opts[:final_reduce] resultat.reduce(&b) end |