Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Конкурентне програмування / hyper і race 🆕

Налаштування з :batch і :degree

І .hyper, і .race приймають два прислівники, що керують тим, як роботу розділено між потоками: :degree та :batch. Вони рідко потрібні, але саме до них ви звертаєтеся, коли налаштовуєте швидкість.

:degree — скільки робітників

:degree задає, скільки робочих потоків працюють одночасно:

say (1..5).hyper(:degree(2)).map(*²); # (1 4 9 16 25)

Типово degree близький до кількості ядер процесора машини — на восьмиядерній машині це 7, лишаючи одне ядро головній програмі. Піднімати його значно вище за кількість ядер рідко допомагає, бо більше ядер для роботи немає, а зайва координація може навіть уповільнити справу.

:batch — скільки елементів за раз

:batch задає, скільки елементів кожен робітник бере за один захід, перш ніж повернутися по нові:

say (1..6).hyper(:batch(2)).map(*²); # (1 4 9 16 25 36)

Типовий batch дорівнює 64, і розмір є компромісом:

  • Великий batch означає менше метушні між робітниками та планувальником — менше накладних витрат, що добре, коли кожен елемент коштує приблизно однаково.
  • Малий batch рівномірніше розподіляє роботу, коли деякі елементи набагато дорожчі за інші, тож жоден робітник не застрягає з усіма повільними — ціною більшої координації.

Обидва можна задати водночас, і на .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, а degree7, тобто на одиницю менше за вісім ядер цієї машини.

Це все ще лише підказки

Як і самі .hyper та .race, ці прислівники просять певного поділу, а не гарантують його. Компілятор вільний зважити на них, скоригувати їх або цілком проігнорувати — тож ставтеся до :batch та :degree як до ручок, які варто покрутити під час налаштування, а не як до обіцянок про те, як саме виконуватиметься робота.

Практика

Виконайте 1 тест за змістом цієї теми.

Навігація курсом

Невпорядкований паралелізм з race   |   Тест — batch і degree


💪 Або перейдіть одразу до вправ цього розділу.