我可以让 `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-install1.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` 使用多个内核吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ghci 查看我从 cabal 安装的软件包?

如何解决 cabal 中损坏的依赖关系?

如何将 dev 分支安装到 Cabal 沙箱中

在 Cabal 测试套件中找到我的可执行文件

我可以复制nix-build与nix-shell和cabal构建的内容吗?

如何编译依赖项以在 cabal 沙箱中进行分析