我可以让 `cabal install` 使用多个内核吗?
Posted
技术标签:
【中文标题】我可以让 `cabal install` 使用多个内核吗?【英文标题】:Can I get `cabal install` to use multiple cores? 【发布时间】:2011-11-06 11:29:18 【问题描述】:有谁知道如何让cabal install
来利用并行性?我正在使用 GHC 进行编译,虽然我不知道 GHC 本身是否可以进行并行构建,但 cabal install
肯定可以并行运行多个编译,不是吗?至少对于不同的独立软件包?
有谁知道这是否可行以及怎么做?
【问题讨论】:
这样做的动机是什么?网络传输的主要瓶颈不是 cabal 吗?另外,如果存在共享依赖项,构建错误是否会相互碰撞? @amindfv:对我来说,瓶颈是编译几十个 haskell 源文件。关于依赖关系,例如并行生成,并行cabal install
必须尊重它们。但仍有可用的并行性。
还有一个开放的stack issue...(如果您使用的是堆栈而不是 cabal-install)
【参考方案1】:
完成 Mikhail Glushenkov 的回答以记录一下用法:
从 cabal 1.16.0 开始,您现在可以使用
cabal install -j [pkgs…]
这默认为每个核心一个作业。它还提供了更清洁的输出。
您可以使用以下命令将并行安装设为默认:
echo "jobs: $(getconf _NPROCESSORS_ONLN)" >> ~/.cabal/config
或者(cabal-install 1.18+):
echo 'jobs: $ncpus' >> ~/.cabal/config
通过以下方式获取最新的 cabal-install:
cabal update
cabal install cabal-install --bindir ~/bin --upgrade-dependencies
【讨论】:
从Cabal 1.18 开始,您可以将jobs
设置为$ncpus
或运行多个作业。【参考方案2】:
我是参与这个 Summer of Code 项目的人。补丁已经发送给邓肯,但他还没有审查它们。请注意,我的代码以包粒度工作,因此在构建单个包时不会获得任何加速。我目前正在开发一个parallel wrapper around ghc --make
,它将解决这个问题(我希望最终将它合并到主线cabal-install
)。
更新(2012 年 2 月):Duncan 审查了我的补丁,我需要采纳他的反馈并重新提交。我希望在本月底之前完成这项工作。
更新(2012 年 4 月):我已 updated my patches 回应 Duncan 的 cmets。新代码有点慢,但对 Cabal 库的更改要少得多。
更新(2012 年 6 月):Duncan Coutts just merged the parallel branch into Cabal HEAD。下一个cabal-install
版本将提供并行安装。
更新(2012 年 10 月):cabal-install
1.16.0 has just been released。这是第一个包含我的并行补丁的正式版本。
【讨论】:
太棒了!你能给我们一个关于最终补丁可以做什么的简短总结吗?正常/分析编译是否并行?单个包现在使用多个内核吗?谢谢。 那么ghc-parmake
的状态是什么?
@nh2 也许我应该写一篇关于并行安装当前状态的博文。现在,您可以关注here 的讨论。简短回答:在您的~/.cabal/config
中添加一行 'jobs: n'(其中 n 是一个正整数);这使得cabal install
使用 n 个线程。这只是包级别的并行性;模块和组件不是并行构建的。
@nh2 关于ghc-parmake
,它在某些情况下可以工作,但存在已知的错误(无法构建用于分析的库,无法构建大型项目,例如 uhc 等)。我正在从事另一个与阴谋集团相关的项目(沙盒),所以我现在没有时间花在ghc-parmake
或并行cabal build
上。也许在这个 GSoC 结束之后。
@nh2 下一个 Haskell 平台 (2012.4.0.0) 将使用 cabal-install 0.14 和 GHC 7.4.2。我预计 2013.2.0.0 版本将附带 cabal-install 1.16 和更新的 GHC。【参考方案3】:
有一个Google Summer of Code project this summer 可以并行化cabal-install
。虽然它尚未合并到主线中,但链接的文章提供了获取源代码并自行构建的说明。
【讨论】:
@donatello:请参阅下面米哈伊尔回答中的更新。我看看能不能修复链接。以上是关于我可以让 `cabal install` 使用多个内核吗?的主要内容,如果未能解决你的问题,请参考以下文章