Clojure :与处理器内核相比,pmap 的块数



我有一个很大的计算工作要完成,基本上是在大约 500 000 个序列上应用逻辑回归。因为工作很重,我把工作分成4块125000系列。

我有一个具有超线程功能的 2 核处理器,结果真的快得多。

但我对此有一个疑问。块的数量应该与内核的数量(或在超线程的情况下的线程)相同吗?我不确定 pmap 是如何工作的,我阅读了 incanter conf 但仍然不确定,因为这家伙有 2 个内核并将工作分成 4 个线程。

无论如何,这是一项相当繁重的工作(使用 pmap 超过 5 小时,没有它的时间要多得多),因此欢迎任何重大优化。

谢谢

在构建自己的之前查看clojure.core.reducers

为了个人发展而思考这个问题是一个重要的项目,因为它建立了对这个问题真正困难的理解和欣赏。好的解决方案包括"工作窃取"等概念,例如,空闲的处理器可以从忙碌的处理器中获取工作。

在现实生活中,最好直接使用clojure的内置减速器。如果您使用不可变的向量作为输入,它们会使此操作变得容易,并且它将自动管理 Java 的 fork/join 框架来处理批量大小和工作分配。此外,这篇博文提供了很多背景。

然后,您可能希望考虑使用换能器来减少生成的中间数据结构的数量。

查看c.c.reducers的提示是一个很好的提示。如果你的作业结果可以不按顺序返回,你可能还需要查看Tesser,它将为您提供一个具有很大灵活性和功能的简洁API,并根据您的需要在多个线程或Hadoop集群上愉快地运行您的作业。

最新更新