Курс языка программирования 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


💪 Или перейдите сразу к упражнениям этого раздела.