Курс по 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


💪 Или преминете направо към упражненията в този раздел.