2012-04-13 9 views
11

Estoy usando GHC 7.4.1 para intentar compilar un programa que usa Repa. Pero a mitad de la compilación, me estoy quedando sin memoria. Con ghc -v, puedo ver que se está estancando en la fase SpecConstr.¿Cómo puedo ayudar a SpecConstr en GHC?

SpecConstr es una de las transformaciones Core-to-Core de GHC. Simon Peyton Jones tiene una bonita descripción here, y hay algún código here, pero es bastante lento para mí, ya que no estoy muy familiarizado con el funcionamiento interno de GHC.

Me gustaría poder ayudar al compilador de algún modo, ¿hay alguna forma de saber dónde se está atascando? Alternativamente, ¿hay alguna manera de limitar el uso de memoria en esta fase hasta que pueda recompilar en una máquina más grande?

Gracias, Chad

+0

Por un capricho, eliminé 'computeUnboxedS', y ahora se compila muy bien. Todavía no tengo idea de por qué, sin embargo. –

+0

si publica su código, es posible que podamos decirle por qué. Vista sin ser vista, voy a adivinar que cuadraste la matriz teutónica, y que los tubos de jeffries estaban hiperventilados. – rampion

+0

Gracias, lamentablemente no puedo publicar todo, y no está claro cómo destilar a un caso mínimo. Tenía la esperanza de que podría haber un procedimiento general para rastrear qué parte de SpecConstr está causando la explosión. Tal vez montón perfilando GHC en sí, o algo así. –

Respuesta

6

Puede tratar de compilar con las banderas -fspec-constr-threshold=n y -fspec-constr-count=n. Más detalles están en el GHC docs. Con 7.4.1, los valores predeterminados son n = 200 para el umbral y n = 3 para el recuento.

Sin embargo, sin ver el código, es posible que se encuentre con this bug. En ese caso, es posible que deba deshabilitar por completo el pase specconstr si las opciones anteriores no son suficientes.

+0

¡Bien, gracias! No veo ninguna referencia a las banderas que mencionas, pero de alguna manera había intentado '-fno-especialise' pero pasé por alto' -fspec-constr' por completo. –

4

Además de la respuesta de John L, asegúrese de compilar con la bandera -fno-liberate-case. La transformación de caso de liberación tiende a causar una explosión de código, lo que hace que el trabajo de SpecConstr sea más difícil.

Cuestiones relacionadas