2012-01-25 9 views
10

No encontré mucha documentación en el commentery. ¿Hay alguna buena publicación en el blog o similar sobre esto?¿Cómo se implementa el soporte de tiempo de ejecución de ghc para el perfil?

+2

Después de una búsqueda de Google relativamente infructuosa, me temo que GHC HQ está muy ocupado implementando y mejorando para escribir sobre ella. –

+3

Creo que la mayoría sigue siendo más o menos como se describe en el [documento de Sansom & Jones] (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.6277). ¿Hay algo específico que le interese? –

+0

¡Gracias por la referencia! Esa debería ser una respuesta. Creo que rwh menciona que algunas optimizaciones son incompatibles con la creación de perfiles – user239558

Respuesta

7

La mejor fuente de información sobre el marco de perfiles aún podría ser el original paper de Patrick Sansom y Simon Peyton Jones. Se pueden encontrar detalles adicionales en Sansom's PhD thesis y later paper agregando una especificación formal. Simon Marlow también habló sobre algunos cambios recientes en la Actualización de estado de GHC en Haskell Implementors' Workshop 2011.

La idea detrás de centro de costos de perfiles es para anotar el árbol de expresión con nodos "centro de coste", por lo que por ejemplo, con -auto-all el programa tendrá anotaciones gustaría sigue:

fib n = {-# SCC foo #-} (case n of 
          0 -> 0 
          1 -> 1 
          n -> fib (n-1) + fib (n-2)) 

En tiempo de ejecución al entrar fib, el programa miraría la "pila del centro de costo" actual y agregaría "foo" a la cima. Esto se revertiría una vez que la evaluación salga nuevamente del alcance de la anotación SCC. Un poco de magia asegura que si, digamos, n resulta ser un valor diferido y el programa necesita ejecutar su código, el centro de costo apropiado para se restaura el código cuando es necesario.

Esta infraestructura se utiliza entonces para tanto tiempo, así como perfiles de espacio:

  1. Un temporizador se compruebe la pila coste-centro periódicamente. Cada vez que se encuentra una cierta pila de centro de coste, esto cuenta como un "tic". Al final, el RTS calculará la cantidad de tiempo por acumulación de centro de costo a partir del recuento de sus marcas, lo que le brindará un perfil de tiempo.

  2. Cada vez que se asigna un objeto, el programa guarda un puntero a la pila del centro de coste que estaba vigente en ese momento. Esto permite que el recolector de basura proporcione una estadística de cuántos bytes residían, desglosados ​​por sitio de asignación.

como se solicita en el comentario, unas palabras sobre la optimización: Por razones obvias, el marco puede no permitir que las optimizaciones que se mueven los costos no constantes de un centro de coste a la otra, lo que obliga al optimizador a ser bastante pesimista veces. Por ejemplo, en el ejemplo anterior, la versión actual GHC será no podrá desempaquetar el valor de retorno, lo que significa que cada llamada recursiva realizará una asignación de montón innecesaria.

Como regla general, no debe contar con ninguna transformación de código que ocurra en una anotación SCC. En caso de duda, es mejor anotar una función suficientemente alta en la pila de llamadas, por lo que los bits críticos para el rendimiento no se anotan en absoluto.

0

Puede encontrar this paper por Jones, Marlow & Singh útil, dependiendo de lo que quiere lograr. Incluye prácticas para perfilar programas de GHC en un contexto paralelo y contiene algunos estudios de casos que pueden serle útiles.

Cuestiones relacionadas