Курс языка программирования 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 →
💪 Или перейдите сразу к упражнениям этого
раздела.