Performance Scala的未来发展缓慢,有很多内核

Performance Scala的未来发展缓慢,有很多内核,performance,scala,future,Performance,Scala,Future,在一个研究项目中,我编写了一个Scala应用程序,它使用一堆未来数据来进行并行计算。我注意到,在我的本地机器(4核)上,代码运行速度比我们计算机科学研究所的多核服务器(64核)快。现在我想知道为什么会这样 详细任务 任务是创建随机布尔k-CNF公式,其中n个不同的变量随机分布在m个子句上,然后查看在哪个m/n组合下,对于不同的随机分布,公式可解的概率如何降至50%以下。为此,我实现了一个概率k-SAT算法、一个子句生成器和一些其他代码。核心是一个函数,它接受n和m es以及生成器函数,运行100

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

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

问题代码 在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个BOGOMIP,服务器4200个。因此,虽然本地CPU快1/3,但服务器上的COR要多12倍

附加的 如果您有兴趣,可以将我的代码的精简示例推送到github,这样您就可以自己尝试:(这是一个使用Scala 2.10的sbt项目)

更新
  • 我通过在随机数生成器中植入42来消除任何随机性。这不会改变什么
  • 我已经更改了测试集。现在的结果更令人惊讶(服务器速度慢了5倍!)注意:不可解子句的平均百分比的所有输出都是zeor,因为输入。这是正常的,也是意料之中的
  • 添加了关于CPU的信息
  • 我注意到,在服务器上对Random.nextInt()的调用要慢10倍。我已经将所有调用包装在一个助手中,该助手可以测量运行时a到控制台的打印速度(如果它们慢于10毫秒)。在我的本地机器上,我得到一些,通常是大约10-20毫秒。在服务器上,我收到很多mure呼叫,它们往往超过100毫秒。这可能是问题所在吗

  • 在x86体系结构上,对非规范化浮点数的操作可能需要更长的数量级。见:


    尚未检查代码,但如果返回
    NaN
    ,则可能是这样。尝试从测试中删除随机性以验证该假设。

    您已经找到了问题的答案,因为问题是随机的。nextInt()使用原子长()。如果经常从不同的线程访问,则会出现缓存抖动,这在64核计算机上会更糟糕,因为缓存之间的距离会更远(电气),因此需要更长的时间才能获得必要的缓存线锁


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

    64核服务器在尝试执行您的任务时执行了多少其他任务?您的第二个集没有返回任何结果(全部
    NaN
    )。也许也可以试着计时,看看实际需要多长时间才能产生结果。另外,与您的本地计算机相比,内核的速度有多快?@RobertHarvey afaik Scala的默认执行器为每个内核创建2个线程,因此应该有128个线程和100个运行线程(每个线程对应一个循环)。我不知道您使用的是哪个Futures库,但最好切换到Akka的未来(Scala 2.10的默认值)如果您正在使用其他库之一。这可能是一个愚蠢的建议,但您确定服务器没有限制您的进程可以使用的内核数量吗?另外,请提供JVM和OS版本。我认为这不是问题所在。唯一的浮点运算是计算平均值。所有其他数字都是Int或Long(以及一些布尔值)。
    [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
    
    [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