Curso de Raku / Programación funcional, concurrente, reactiva y web / Programación concurrente / hyper y race 🆕
Ajustar con :batch y :degree
Tanto .hyper como .race aceptan dos
adverbios que controlan cómo se reparte el trabajo entre los
hilos: :degree y :batch. Rara vez los
necesitas, pero son a lo que recurres cuando ajustas para ganar
velocidad.
:degree — cuántos
trabajadores
:degree fija cuántos hilos trabajadores corren al mismo
tiempo:
say (1..5).hyper(:degree(2)).map(*²); # (1 4 9 16 25)Por omisión, el grado se acerca al número de núcleos de CPU que tiene
la máquina: en una máquina de ocho núcleos es 7, dejando un
núcleo para el programa principal. Subirlo muy por encima del número de
núcleos rara vez ayuda, ya que no hay más núcleos donde correr, y la
coordinación extra puede incluso frenar las cosas.
:batch —
cuántos elementos de una vez
:batch fija cuántos elementos toma cada trabajador de
una tacada antes de volver a por más:
say (1..6).hyper(:batch(2)).map(*²); # (1 4 9 16 25 36)El lote por omisión es 64, y el tamaño es un
compromiso:
- Un lote grande significa menos ir y venir entre los trabajadores y el planificador — menos sobrecarga, cosa buena cuando todos los elementos cuestan más o menos lo mismo.
- Un lote pequeño reparte el trabajo de manera más pareja cuando unos elementos son mucho más caros que otros, así que ningún trabajador se queda atascado con todos los lentos, a costa de más coordinación.
Puedes fijar ambos a la vez, en .race igual que en
.hyper:
say (1..6).race(:degree(2), :batch(3)).map(*²).sum; # 91Si sientes curiosidad por saber cuáles son en realidad los valores por omisión, puedes atisbarlos a través de las tripas de Rakudo. Ten en cuenta que esto lee un atributo privado: no es una API estable, y los números dependen de tu máquina.
my $h := (1..10).hyper;
say $h.^attributes.first(*.name.contains('config')).get_value($h).raku;
# HyperConfiguration.new(batch => 64, degree => 7)Aquí batch es el valor fijo por omisión 64,
mientras que degree es 7: uno menos que los
ocho núcleos de esta máquina.
Siguen siendo solo indicaciones
Igual que .hyper y .race en sí, estos
adverbios solicitan un reparto concreto en lugar de
garantizarlo. Un compilador es libre de respetarlos, ajustarlos o
ignorarlos por completo, así que trata :batch y
:degree como mandos que probar al ajustar, no como promesas
sobre cómo se ejecutará exactamente el trabajo.
Práctica
Resuelve 1 cuestionario sobre el contenido de este tema.
Navegación del curso
← Paralelismo sin orden con race | Quiz — batch y degree →
💪 O ve directamente a los ejercicios de esta
sección.