Mar*_*rau 11 performance scala future
对于一个研究项目,我编写了一个Scala应用程序,它使用一堆期货来进行并行计算.我注意到在我的本地机器(4核)上,代码运行速度比我们计算机科学研究所的多核服务器(64核)要快.现在我想知道为什么会这样.
任务是创建随机布尔k-CNF公式,其中n个不同的变量随机分布在m个子句中,然后看看在不同的随机分布中,在哪个m/n组合中,公式可解的概率下降到50%以下.为此,我实现了概率k-SAT算法,子句生成器和其他一些代码.核心是一个函数,它将n和m作为生成器函数,运行100个期货并等待结果.该函数如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
在我的本地机器上,我得到了这些结果
[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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
然而,我在两台机器上满负荷(服务器平均约在60至65的负载),这样就被运行足够的线程.为什么是这样?我做错了什么吗?
我的本地机器有一个"AMD Phenom(TM)II X4 955处理器"CPU服务器使用"AMD Opteron(TM)处理器6272".本地CPU有6800个bogomips,服务器4200.因此,虽然本地CPU速度提高了1/3,但服务器上的crs数量却增加了12倍.
如果我的代码被推送到github有一个精简的示例,那么你可以尝试十二,如果你是intereste:https://github.com/Blattlaus/algodemo(这是一个使用Scala 2.10的sbt项目).
在 x86 架构上,对非规范化浮点数的操作可能需要更长的数量级。看:
没有检查您的代码,但考虑到您返回了,NaN情况可能就是这样。尝试从测试中消除随机性以验证该假设。