2010-06-10 16 views
58

He oído que en Haskell, la creación de una aplicación multi-hilo es tan fácil como tomar una aplicación estándar Haskell y compilarlo con la bandera -threaded. Otros casos, sin embargo, han descrito el uso de un comando par dentro del código fuente real.¿Cuán difícil es el multihilo de Haskell?

¿Cuál es el estado de Haskell múltiples hilos? ¿Qué tan fácil es introducirlo en los programas? ¿Hay un buen tutorial de varios subprocesos que repase estos diferentes comandos y sus usos?

+0

Creo * La programación paralela y concurrente en Haskell * por Simon Marlow se considera generalmente como la mejor introducción a este tema. –

Respuesta

61

¿Cuál es el estado de Haskell múltiples hilos?

maduro. La implementación tiene alrededor de 15 años, con memoria transaccional durante 5 años. GHC es un compilador ampliamente utilizado, con gran soporte de código abierto y respaldo comercial.

¿Qué tan fácil es introducirlo en los programas?

Esto depende del algoritmo. A veces puede ser un uso de una línea de par para obtener el paralelismo. Algunas veces se deben desarrollar nuevos algoritmos. En general, será más fácil introducir el paralelismo y la concurrencia seguros en Haskell, que en los lenguajes típicos, y el rendimiento es bueno.

¿Existe un buen tutorial sobre varios hilos que repase estos diferentes comandos y sus usos?

Hay 3 principales modelos de programación paralelos y concurrentes en Haskell.

  • paralelismo implícito a través de par
  • concurrencia y paralelismo explícito a través de forkIO/MVARs y memoria transaccional
  • paralelismo de datos a través de las bibliotecas DPH

Estas son las cosas principales. En todos los casos, compila con -thread para usar el tiempo de ejecución multinúcleo, pero lo fácil que es paralelizar un problema en particular depende del algoritmo que use y del modelo de programación paralela que adopte de esa lista.

Aquí está an introduction to the main parallel programming models in Haskell, y cómo lograr aceleraciones.

Creo que Chapter 24 of Real World Haskell es un buen tutorial.

16

También hay término concurrencia.

sin ningún cambio en el código del teléfono RTS Haskell tratará de usar por algún proceso interno, pero para utilizar en su aplicación deben darle un indicio de que está hecho por par b (f a b) que obliga a Haskell no ser tan perezoso en Caculation de b incluso si f no lo requerirá para el resultado.

Una de las razones para no hacer eso para cada función que requiera todos sus argumentos (como a+b) es que la sincronización (cálculos de programación y espera de resultados) genera una sobrecarga y es probable que no desee gastar ticks para (2*3)+(3*4) solo porque puede calcular multiplicaciones en paralelo. Y probablemente perderá algunos éxitos de caché o algo así o optimizaciones que se realiza cuando lo hace en un solo procesador (es decir, tendrá que pasar el resultado de un procesador a otro de todos modos).

Por supuesto, el código que se usa par es feo y cuando pliega la lista u otras estructuras de datos con subelementos ligeros, probablemente querrá calcular algunos trozos de esos elementos ligeros para asegurarse de que la sobrecarga/calcificación será realmente pequeño. Para resolverlo, puede mirar parallel.

Hay también datos Haskell paralelo (DPH).

Si su programa es más sobre la mónada IO de lo que sin duda necesitan muchos cambios. Ver forkIO, Software Transactional Memory (STM) y muchos otros de Concurrency category