2012-04-13 11 views
11

Sto utilizzando GHC 7.4.1 per provare a compilare un programma che utilizza Repa. Ma a parte la compilazione, sto esaurendo la memoria. Con ghc -v, posso vedere che si blocca nella fase SpecConstr.Come posso aiutare SpecConstr in GHC?

SpecConstr è una delle trasformazioni Core-to-Core di GHC. Simon Peyton Jones ha una bella descrizione here, e c'è del codice here, ma è piuttosto lento per me dal momento che non ho molta familiarità con il funzionamento interno di GHC.

Mi piacerebbe essere in grado di aiutare il compilatore in qualche modo - c'è un modo per dire dove si blocca? In alternativa, c'è un modo per limitare l'utilizzo della memoria in questa fase fino a quando non posso ricompilare su una macchina più grande?

Grazie, Chad

+0

Per un capriccio, ho rimosso un 'computeUnboxedS', e ora compila bene. Ancora nessuna idea del perché, però. –

+0

se pubblichi il tuo codice, potremmo essere in grado di dirti perché. Vista invisibile, ho intenzione di indovinare che hai bogato la matrice teutonica, e le valvole jeffries erano iper-ventilate. – rampion

+0

Grazie, purtroppo non riesco a postare il tutto, e non è chiaro come distillare in un caso minimale. Speravo che potesse esserci una procedura generale per tenere traccia di quale parte di SpecConstr sta causando l'esplosione. Forse l'HQ di profilazione heap, o qualcosa del genere. –

risposta

6

Si può provare a compilare con le bandiere -fspec-constr-threshold=n e -fspec-constr-count=n. Ulteriori dettagli sono disponibili nello GHC docs. Con 7.4.1, i valori predefiniti sono n = 200 per la soglia e n = 3 per il conteggio.

Senza vedere il codice, tuttavia, è possibile che si stia eseguendo this bug. In tal caso potrebbe essere necessario disabilitare completamente il pass specconstr se le opzioni sopra indicate non sono sufficienti.

+0

Bello, grazie! Non vedo alcun riferimento alle bandiere che hai menzionato, ma in qualche modo ho provato '-fno-specialise' ma ho trascurato' -fspec-constr' interamente. –

4

Oltre alla risposta di John L', assicurati di compilare con la bandiera -fno-liberate-case. La trasformazione del caso liberale tende a causare un aumento di codice, il che rende il lavoro di SpecConstr più difficile.