1

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

我有一个带有超线程的 2 核处理器,结果确实快得多。

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

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

谢谢

4

2 回答 2

2

clojure.core.reducers在您自己构建之前检查一下。

为个人发展考虑这一点是一个重要的项目,因为它建立了对这个问题的真正难度的理解和欣赏。好的解决方案包括诸如“工作窃取”之类的概念,例如空闲处理器可以从繁忙的处理器中获取工作。

在现实生活中,最好直接使用 clojure 内置的reducers。如果您使用不可变向量作为输入,它们会看似简单,并且它将自动管理 Java 的fork/join框架以处理批量大小和工作分配。这篇博文也提供了很多背景知识。

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

于 2016-02-04T19:50:42.603 回答
0

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

于 2016-02-04T21:17:16.303 回答