Kurso de Raku / Funkcia, samtempa, reaktiva kaj reta programado / Samtempa programado / hyper kaj race 🆕

Paralela map per hyper

Voku .hyper sur listo antaŭ mapgrep, kaj la laboro disvastiĝas trans plurajn laborfadenojn — dum la rezultoj tamen revenas en la originala ordo:

say (1..5).hyper.map(* * 2); # (2 4 6 8 10)

Ĉi tio aspektas precize kiel ordinara map, kaj la rezulto estas identa; la sola diferenco estas, ke la duobligoj eble estis kalkulitaj sur malsamaj kernoj samtempe.

.hyper funkcias kun grep ĝuste same — ĉiu elemento estas testata paralele, kaj tiuj, kiuj trapasas, tamen revenas en sia originala ordo:

say (1..10).hyper.grep(* %% 2); # (2 4 6 8 10)

Ĉar .hyper konservas la ordon, ĝi estas rekta anstataŭaĵo por malrapida mapgrep: nenio, kio dependas de la ordo de la rezultoj, devas ŝanĝiĝi. La avantaĝo aperas nur kiam la laboro por ĉiu elemento estas sufiĉe granda por superpezi la koston de kunordigi fadenojn — kvadratigi nombron estas multe tro malmultekosta por vere indi paraleligon. Por vere multekosta laboro por ĉiu elemento sur granda listo, .hyper povas transformi longan atendon en mallongan kontraŭ la prezo de unu sola metodvoko.

Unu aferon indas memori: ĉu la laboro vere disvastiĝas trans kernoj, dependas de la kompililo. La lingvo fiksas la rezultojn — kaj, por .hyper, ilian originalan ordon — sed ĝi ne postulas efektivan paralelan plenumon. .hyper kaj .race petas paralelecon prefere ol postuli ĝin, do donita kompililo povas plenumi ilin sur fadenaro aŭ povas senbrue trakti la elementojn laŭvice. Traktu ilin kiel ŝancon por rapidigo, ne kiel garantion pri ĝi.

Ĉar la ordo estas konservata, operacioj, kiuj dependas de ĝi, tamen eliras ĝuste. Ĉi tie ĉiu vorto estas majuskligata paralele, kaj tamen la pecoj rekuniĝas en la frazon en sia originala sinsekvo:

say <raku is fun>.hyper.map(*.uc).join(' '); # RAKU IS FUN

Praktiko

Vin atendas 1 kvizo pri la enhavo de ĉi tiu temo.

Kursa navigado

hyper kaj race 🆕   |   Kvizo — hyper


💪 Aŭ iru rekte al la ekzercoj de ĉi tiu sekcio.