Fork-Join Flashcards
Qué es el método fork-join?
El método fork-join es una metodología de programación concurrente que se basa en dividir la tarea a ejecutar en subtareas independientes, que serán procesadas en paralelo, para luego unir los resultados en el hilo original.
Cuándo conviene usar el método fork-join? Dar las condiciones del método.
La condición necesaria es que las subtareas sean independientes entre sí.
Por otro lado, se recomienda que las tareas a ejecutar impliquen cómputo significativo, para que el overhead de dividir las tareas y luego unirlas no sobrepase el costo de la ejecución en sí.
Pueden darse deadlocks o race conditions en el método fork-join?
No. Las tareas son independientes, no comparten memoria ni recursos de ningún tipo. Pueden ejecutarse en cualquier orden y por cualquiera de los hilos workers. Esto hace que no sea necesario utilizar locks, ni hay riesgos de deadlocks o race-conditions.
Explicar la optimización “work-stealing”
La optimización “work-stealing” se basa en el hecho de que la división de tareas original puede no ser equitativa; con este método, se busca no que todos los hilos ejecuten la misma cantidad de tareas, sino que todos los hilos trabajen (aproximadamente) la misma cantidad de tiempo. Así, si un hilo recibe tareas más livianas a nivel cómputo y las completa antes que los otros hilos, puede “robarle” tareas a los otros hilos, para alivianarles la carga y que todos terminen aproximadamente a la vez.
Esto se logra implementando a cada thread con su propia cola de dos extremos, una deque, que almacena las tareas a ejecutar. El thread dueño de la deque toma elementos del final de la cola, mientras que el thread que roba tareas toma elementos del principio de la cola, para evitar race conditions a la hora de acceder ambos a la cola.
Qué es la vectorización? Cuándo conviene usarlo?
La vectorización es un modelo de concurrencia, usado en casos donde se tienen grandes cómputos vectoriales o matriciales, y donde se aprovecha la capacidad de nuevas CPUs de poder hacer cómputos en bloques.
Ejemplos de uso son cálculos para matrices de redes neuronales y cálculos para tarjetas gráficas, entre otros.
Es conveniente tener una única cola para todos los hilos del método fork-join? Por qué sí o no?
No, lo más conveniente es que cada hilo tenga su propia cola (o deque) con las tareas asignadas a él. Esto es por dos razones:
- Evita cuellos de botella: si todos los hilos consultan a la misma cola, es inevitable que la cola se vuelva un cuello de botella, causando retrasos innecesarios en la ejecución.
- Evita sincronización innecesaria: si se comparten elementos, como la queue en este caso, se debería implementar lógica de sincronización para evitar race conditions.