Как я могу помочь SpecConstr в GHC?
Я использую GHC 7.4.1, чтобы попытаться скомпилировать программу, использующую Repa. Но частично через компиляцию у меня заканчивается память. С ghc -v
я вижу, что он застревает в фазе SpecConstr.
SpecConstr является одним из преобразований ядра с ядрами GHC. Simon Peyton Jones имеет приятное описание здесь, и там есть код здесь, но это довольно медленно для меня, так как я не очень хорошо знаком с внутренней работой GHC.
Я хотел бы как-то помочь компилятору - есть ли способ сказать, где он застревает? Альтернативно, существует ли способ ограничить использование памяти в этой фазе, пока я не смогу перекомпилировать более крупную машину?
Спасибо,
Чад
Ответы
Ответ 1
Вы можете попробовать скомпилировать флаги -fspec-constr-threshold=n
и -fspec-constr-count=n
. Более подробная информация содержится в документах GHC. В 7.4.1 значения по умолчанию: n = 200 для порога и n = 3 для счетчика.
Без просмотра кода, возможно, вы столкнулись с этой ошибкой. В этом случае вам может потребоваться полностью отключить пропуск specconstr, если указанные выше параметры недостаточны.
Ответ 2
В дополнение к ответу John L убедитесь, что вы скомпилируете флаг -fno-liberate-case
. Преобразование случая освобождения имеет тенденцию вызывать кодовое раздутие, что делает работу SpecConstr более сложной.