Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Concurrent programmeren / hyper en race 🆕
Afstemmen met :batch en :degree
Zowel .hyper als .race accepteert twee
bijwoorden die bepalen hoe het werk over threads verdeeld
wordt: :degree en :batch. Je hebt ze zelden
nodig, maar het zijn de knoppen waar je naar grijpt wanneer je op
snelheid afstemt.
:degree — hoeveel
workers
:degree bepaalt hoeveel werkthreads tegelijk lopen:
say (1..5).hyper(:degree(2)).map(*²); # (1 4 9 16 25)Standaard ligt de graad dicht bij het aantal CPU-kernen dat de
machine heeft — op een machine met acht kernen is het 7,
wat één kern voor het hoofdprogramma overlaat. Hem veel hoger zetten dan
het aantal kernen helpt zelden, omdat er niet meer kernen zijn om op te
draaien, en de extra coördinatie kan het zelfs vertragen.
:batch — hoeveel
elementen tegelijk
:batch bepaalt hoeveel elementen elke worker in één keer
neemt voordat hij om meer terugkomt:
say (1..6).hyper(:batch(2)).map(*²); # (1 4 9 16 25 36)De standaardbatch is 64, en de grootte is een
afweging:
- Een grote batch betekent minder heen en weer tussen de workers en de scheduler — minder overhead, wat goed is wanneer elk element ongeveer evenveel kost.
- Een kleine batch verdeelt het werk gelijkmatiger wanneer sommige elementen veel duurder zijn dan andere, zodat geen enkele worker met alle trage blijft zitten — ten koste van meer coördinatie.
Je kunt beide tegelijk instellen, op .race net zo goed
als op .hyper:
say (1..6).race(:degree(2), :batch(3)).map(*²).sum; # 91Als je benieuwd bent wat de standaardwaarden werkelijk zijn, kun je er via Rakudo’s interne onderdelen naar gluren. Let op: dit leest een private attribuut — het is geen stabiele API, en de getallen hangen van je machine af:
my $h := (1..10).hyper;
say $h.^attributes.first(*.name.contains('config')).get_value($h).raku;
# HyperConfiguration.new(batch => 64, degree => 7)Hier is batch de vaste standaardwaarde 64,
terwijl degree 7 is — één minder dan de acht
kernen van deze machine.
Het blijven slechts hints
Net als .hyper en .race zelf
vragen deze bijwoorden om een bepaalde verdeling in
plaats van haar te garanderen. Een compiler mag ze honoreren, bijstellen
of volledig negeren — beschouw :batch en
:degree dus als knoppen om aan te draaien bij het
afstemmen, niet als beloften over hoe het werk precies zal lopen.
Praktijk
Maak de 1 quiz over de inhoud van dit onderwerp.
Cursusnavigatie
← Ongeordend parallellisme met race | Quiz — batch en degree →
💪 Of ga direct naar de oefeningen in deze
sectie.