Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Паралелно програмиране / hyper и race 🆕
Настройка с :batch и :degree
И .hyper, и .race приемат две наречия,
които управляват как работата се разделя между нишките:
:degree и :batch. Рядко ви трябват, но именно
към тях посягате, когато настройвате за скорост.
:degree — колко
работници
:degree задава колко работни нишки вървят
едновременно:
say (1..5).hyper(:degree(2)).map(*²); # (1 4 9 16 25)По подразбиране степента е близо до броя процесорни ядра на машината
— на осемядрена машина тя е 7, оставяйки едно ядро за
основната програма. Вдигането ѝ много над броя на ядрата рядко помага,
защото повече ядра за работа няма, а допълнителната координация може
дори да забави нещата.
:batch — по колко
елемента наведнъж
:batch задава по колко елемента взема всеки работник
наведнъж, преди да се върне за още:
say (1..6).hyper(:batch(2)).map(*²); # (1 4 9 16 25 36)Партидата по подразбиране е 64, а размерът е
компромис:
- Голяма партида означава по-малко разкарване между работниците и планировчика — по-малко допълнителни разходи, което е добре, когато всеки елемент струва приблизително еднакво.
- Малка партида разпределя работата по-равномерно, когато някои елементи са далеч по-скъпи от други, така че никой работник не засяда с всички бавни — срещу цената на повече координация.
Можете да зададете и двете наведнъж, и то при .race също
както при .hyper:
say (1..6).race(:degree(2), :batch(3)).map(*²).sum; # 91Ако ви е любопитно какви всъщност са стойностите по подразбиране, можете да надникнете в тях през вътрешностите на Rakudo. Забележете, че това чете частен атрибут — не е стабилен API, а числата зависят от вашата машина:
my $h := (1..10).hyper;
say $h.^attributes.first(*.name.contains('config')).get_value($h).raku;
# HyperConfiguration.new(batch => 64, degree => 7)Тук batch е фиксираната стойност по подразбиране
64, а degree е 7 — с едно
по-малко от осемте ядра на тази машина.
Те пак са само подсказки
Както и самите .hyper и .race, тези наречия
молят за определено разделяне, а не го гарантират.
Компилаторът е свободен да ги зачете, да ги коригира или изцяло да ги
пренебрегне — така че гледайте на :batch и
:degree като на копчета, които да завъртите при
настройване, а не като на обещания за това как точно ще върви
работата.
Практика
Направете 1 тест върху съдържанието на тази тема.
Навигация в курса
← Неподреден паралелизъм с race | Тест — batch и degree →
💪 Или преминете направо към упражненията в този
раздел.