gpt4 book ai didi

performance - Scala Futures 有很多内核,速度很慢

转载 作者:行者123 更新时间:2023-12-03 22:49:13 62 4
gpt4 key购买 nike

对于一个研究项目,我编写了一个 Scala 应用程序,它使用一堆 future 来进行并行计算。我注意到在我的本地机器(4 核)上,代码运行速度比在我们计算机科学研究所的众核服务器(64 核)上运行得更快。现在我想知道这是为什么。

任务详情

任务是创建随机 bool k-CNF 公式,其中 n 个不同变量随机分布在 m 个子句上,然后查看在哪种 m/n 组合下,对于不同的随机分布,公式可解的概率如何降至 50% 以下。为此,我实现了一个概率 k-SAT 算法、一个子句生成器和一些其他代码。核心是一个函数,它接受 n 和 m es 以及生成器函数,运行 100 个 future 并等待结果。该函数如下所示:

有问题的代码

def avgNonvalidClauses(n: Int, m: Int)(implicit clauseGenerator: ClauseGenerator) = {

val startTime = System.nanoTime

/** how man iteration to build the average **/
val TRIES = 100

// do TRIES iterations in parallel
val tasks = for (i <- 0 until TRIES) yield future[Option[Config]] {
val clause = clauseGenerator(m, n)
val solution = CNFSolver.probKSat(clause)
solution
}

/* wait for all threads to finish and collect the results. we will only wait
* at most TRIES * 100ms (note: flatten filters out all
* None's) */
val results = awaitAll(100 * TRIES, tasks: _*).asInstanceOf[List[Option[Option[Config]]]].flatten

val millis = Duration(System.nanoTime - startTime, NANOSECONDS).toMillis
val avg = (results count (_.isDefined)) / results.length.toFloat

println(s"n=$n, m=$m => $avg ($millis ms)")

avg
}

问题

在我的本地机器上,我得到了这些结果
[info] Running Main 
n=20, m=120 => 0.0 (8885 ms)
n=21, m=121 => 0.0 (9115 ms)
n=22, m=122 => 0.0 (8724 ms)
n=23, m=123 => 0.0 (8433 ms)
n=24, m=124 => 0.0 (8544 ms)
n=25, m=125 => 0.0 (8858 ms)
[success] Total time: 53 s, completed Jan 9, 2013 8:21:30 PM

在 64 核服务器上,我得到:
[info] Running Main 
n=20, m=120 => 0.0 (43200 ms)
n=21, m=121 => 0.0 (38826 ms)
n=22, m=122 => 0.0 (38728 ms)
n=23, m=123 => 0.0 (32737 ms)
n=24, m=124 => 0.0 (41196 ms)
n=25, m=125 => 0.0 (42323 ms)
[success] Total time: 245 s, completed 09.01.2013 20:28:22

但是,我在两台机器上都满负载(服务器平均负载在 60 到 65 之间),所以有足够的线程运行。为什么是这样?我做错了什么吗?

我的本地机器有一个“AMD Phenom(tm) II X4 955 处理器”CPU,服务器使用“AMD Opteron(TM) 处理器 6272”。本地 CPU 有 6800 bogomips,服务器 4200。因此,虽然本地 CPU 快了 1/3,但服务器上的 cors 是 12 倍。

额外的

如果有我的代码的精简示例推送到 github,所以如果你有兴趣,你可以自己尝试: https://github.com/Blattlaus/algodemo (这是一个使用 Scala 2.10 的 sbt 项目)。

更新
  • 我通过用 42 为随机数生成器播种来消除任何随机性。这没有任何改变
  • 我已经更改了测试集。现在结果更加惊人(服务器慢了 5 倍!)注意:由于输入,不可解子句的平均百分比的所有输出都是零。这是正常和预期的。
  • 添加了有关 CPU 的信息
  • 我注意到对 Random.nextInt() 的调用在服务器上慢了 10 倍。我已将所有调用包装在一个帮助器中,该帮助器测量打印到控制台的运行时间(如果它们慢于 10 毫秒)。在我的本地机器上,我得到了一些,通常大约 10-20 毫秒。在服务器上,我接到了很多电话,而且往往超过 100 毫秒。可能是这个问题???
  • 最佳答案

    您已经找到了答案,因为问题是使用 AtomicLong() 的 Random.nextInt()。如果从不同的线程频繁访问它,那么您将遇到缓存抖动,这在您的 64 核计算机上会更糟,因为缓存将(在电气上)分开得更远,因此需要更长的时间才能获得必要的缓存行锁。

    有关更多详细信息,请参阅此 stackoverflow 答案,以及如何避免此问题的解决方案(基本上是使用线程本地随机数生成器):Contention in concurrent use of java.util.Random

    关于performance - Scala Futures 有很多内核,速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14244248/

    62 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com