que multihilos multihilo multithreading haskell concurrency multicore lightweight-processes

multithreading - multihilos - multihilo que es



SubtĂ­tulos ligeros Haskell sobrecarga y uso en multinĂșcleos (3)

He estado leyendo el libro "Real World Haskell", el capítulo sobre simultaneidad y paralelismo. Mi pregunta es la siguiente:

  • Dado que los hilos Haskell son en realidad solo múltiples hilos "virtuales" dentro de un hilo del sistema operativo "real", ¿significa esto que crear muchos de ellos (como 1000) no tendrá un impacto drástico en el rendimiento? Es decir, ¿podemos decir que la sobrecarga incurrida por la creación de un hilo Haskell con forkIO es (casi) insignificante? Por favor traiga ejemplos pacticos si es posible.

  • ¿El concepto de hilos ligeros no nos impide utilizar los beneficios de las arquitecturas multinúcleo? Según tengo entendido, no es posible que dos subprocesos Haskell se ejecuten simultáneamente en dos núcleos separados, porque en realidad son un solo hilo desde el punto de vista del sistema operativo. ¿O el tiempo de ejecución de Haskell hace algunos trucos ingeniosos para garantizar que se puedan usar múltiples CPU?


El tiempo de ejecución de GHC proporciona un entorno de ejecución que admite miles de millones de chispas, miles de subprocesos ligeros, que pueden distribuirse en múltiples núcleos de hardware. Compile con -threaded y use las banderas +RTS -N4 para establecer su número deseado de núcleos.

Específicamente:

¿Esto significa que crear muchos de ellos (como 1000) no tendrá un impacto drástico en el rendimiento?

Bueno, crear 1,000,000 de ellos es ciertamente posible. 1000 es tan barato que ni siquiera aparecerá. Puede ver en los puntos de referencia de creación de subprocesos, como "anillo de rosca", que GHC es muy, muy bueno .

¿El concepto de hilos ligeros no nos impide utilizar los beneficios de las arquitecturas multinúcleo?

De ningún modo. GHC se ha estado ejecutando en multinúcleo desde 2004. El estado actual del tiempo de ejecución multinúcleo se rastrea aquí.

¿Cómo lo hace? El mejor lugar para leer sobre esta arquitectura está en el documento, "Soporte en tiempo de ejecución para Multicore Haskell" :

El sistema de tiempo de ejecución de GHC admite millones de subprocesos ligeros al multiplexarlos en un puñado de subprocesos del sistema operativo, aproximadamente uno para cada CPU física. ...

Los subprocesos de Haskell se ejecutan mediante un conjunto de subprocesos del sistema operativo, que llamamos subprocesos de trabajo. Mantenemos aproximadamente un hilo de trabajo por CPU física, pero exactamente qué hilo de trabajo puede variar de momento a momento ...

Dado que el hilo de trabajo puede cambiar, mantenemos exactamente un Contexto de Ejecución Haskell (HEC) para cada CPU. El HEC es una estructura de datos que contiene todos los datos que requiere un subproceso de trabajo del sistema operativo para ejecutar subprocesos Haskell

Puede monitorear sus hilos creados y dónde se están ejecutando, a través de threadscope. . Aquí, por ejemplo, ejecutando el benchmark de árboles binarios:


La creación de 1000 procesos es relativamente ligera; no te preocupes por hacerlo En cuanto al rendimiento, debería simplemente compararlo.

Como se ha señalado anteriormente, los núcleos múltiples funcionan bien. Varios subprocesos de Haskell se pueden ejecutar al mismo tiempo programados en diferentes subprocesos del sistema operativo.


  • El servidor web Warp utiliza estos hilos livianos extensivamente para obtener un rendimiento realmente bueno . Tenga en cuenta que los otros servidores web de Haskell también fuman la competencia: esto es más un "Haskell es bueno" que "Warp es bueno".

  • Haskell proporciona un tiempo de ejecución multiproceso que puede distribuir subprocesos ligeros a través de múltiples subprocesos del sistema. Funciona muy bien para hasta 4 núcleos. Más allá de eso, hay algunos problemas de rendimiento, aunque se están trabajando activamente en ellos.