2012-05-27 16 views
8

¿Hay alguna forma en Haskell (usando GHC si es importante, para código que necesita ejecutarse en Linux y Windows) para realizar cálculos acotados? Es decir, "calcule el resultado de esta función si es factible hacerlo, pero si el intento ha usado más de X ciclos de CPU, espacio de pila Y o espacio de montón Z, y aún no lo ha hecho, deténgase y devuelva una indicación de que no fue posible completar el cálculo "?Computación acotada en Haskell

+0

¿Está construyendo alguna herramienta de verificación de modelos? –

+0

Entre otras cosas, sí. – rwallace

+0

Esto también puede ser de interés: http://hackage.haskell.org/package/speculation – jberryman

Respuesta

8
+0

¡Gracias! Definitivamente parece la respuesta por tiempo limitado. ¿Mirando a través de esa sección de la documentación, no parece haber una solución similar para la memoria? – rwallace

+2

De hecho. Sin embargo, no puedo imaginar ninguna semántica sensata para la memoria: además de la extrema dificultad de medir el consumo de memoria de manera precisa, ¿qué pasa si hay otro hilo que no tiene memoria limitada? ¿Qué sucede si comparte algunos valores con ese otro hilo? quien "paga"? ¿Cómo resuelves esos problemas lo suficientemente rápido como para obtener mediciones sin paralizar la función que se está ejecutando? –

+0

Sí, estos son problemas difíciles y, sinceramente, no era optimista sobre la probabilidad de que un lenguaje de uso general ofrezca una solución lista para usar, pero pensé que valía la pena intentarlo antes de resignarme a hackear mi propia gestión de memoria, etc. En C++ :-) – rwallace

6

he aquí una solución hacker que podía intento: desovar sus cálculos con forkIO, y dejar que el hilo de los padres (o un hilo de control que tiene acceso a la ThreadId de hilo en forma de horquilla) sondear periódicamente para cualquier cantidad que desee, y lanzar una excepción asíncrona al hilo informático según sea necesario (curiosamente, así es exactamente como funciona timeout.)

La siguiente pregunta sería si el Esta es una forma de averiguar qué tan grande es el montón actualmente dentro de Haskell. El consumo total de memoria y los ciclos pueden descubrirse generando comandos de shell, o consultando el sistema operativo de otra manera (no sabría cómo hacerlo en Windows).

No es una solución perfecta, pero es simple , que puedes implementar y probar en un par de minutos.

+0

Estaba buscando un método de memoria en uso, pero no pude encontrar uno dentro de Haskell. –

+0

En lugar de monitorear el uso del montón de la horquilla, también podría limitar su montón con 'Rts'opts, ¿o no? – leftaroundabout

+0

'forkIO' está dentro del mismo programa Haskell. A menos que estés generando un nuevo proceso, estás trabajando dentro del montón compartido. –

6

En un nivel por proceso, puede usar GHC's RTS options para controlar la pila máxima y los tamaños de pila.

Cuestiones relacionadas