问题 我怎样才能帮助GHC中的SpecConstr?


我正在使用GHC 7.4.1来尝试编译使用Repa的程序。但是在编译过程中,我的内存耗尽了。同 ghc -v,我可以看到它陷入了SpecConstr阶段。

SpecConstr是GHC的Core-to-Core转换之一。 Simon Peyton Jones有一个很好的描述 这里,还有一些代码 这里但是对我来说这很慢,因为我不太熟悉GHC的内部工作原理。

我希望能够以某种方式帮助编译器 - 有没有办法告诉它哪里被困?或者,有没有办法在这个阶段限制内存使用,直到我可以在更大的机器上重新编译?

谢谢, 乍得


7342
2018-04-13 18:02


起源

一时兴起,我删除了一个 computeUnboxedS,现在它编译得很好。但是仍然不知道为什么。 - Chad Scherrer
如果您发布代码,我们可能会告诉您原因。看不见,我猜你会把条顿基质弄得乱糟糟,而且珠宝管是通风不良的。 - rampion
谢谢,不幸的是我无法发布整个事情,并且不清楚如何提炼到最小的情况。我曾希望可能有一个通用的程序来跟踪SpecConstr导致爆炸的部分。也许堆栈描述GHC本身,或类似的东西。 - Chad Scherrer


答案:


您可以尝试使用标志进行编译 -fspec-constr-threshold=n 和 -fspec-constr-count=n。更多细节在 GHC文档。对于7.4.1,阈值的默认值为n = 200,计数的n = 3。

但是,如果没有看到代码,你可能会遇到问题 这个bug。在这种情况下,如果上述选项不够,您可能需要完全禁用specconstr pass。


6
2018-04-13 21:54



好的谢谢!我没有看到你提到的旗帜的任何引用,但不知怎的,我曾尝试过 -fno-specialise 但被忽视了 -fspec-constr 完全。 - Chad Scherrer


除了John的答案,请确保使用旗帜进行编译 -fno-liberate-case。解放案例转换往往导致代码爆炸,然后使SpecConstr的工作更难。


4
2018-04-15 12:04