多核CPU并行问题

在利用多进程并行时,添加了24个进程,但结果很不理想,并行速度只提高了6倍左右。在计算过程中发现CPU的使用率很低,而且添加的24个进程中只有3-8个进程显示对CPU的占用,所以想问一下是我电脑的设置有问题,还是代码中存在问题。下面只是一个简单的示例代码,实际代码比较复杂,所以没有贴上。下图是代码运行时,电脑的CPU使用情况和版本信息:

using Distributed
addprocs(24)
function foo_2(n)
    a = collect(1:n)
    for i = 1:size(a, 1)
        a[i] = a[i]/3
    end
end
foo_2(100000000.0)


image

你这个代码示例完全没有并行啊?除了添加了24个worker以外其他都是串行的。

你好,我的原本代码比较复杂就临时找了一个简单的,没有仔细看,不好意思。我现在运行的代码的完整版是下面这个开源的代码https://github.com/Elliothuo/juSFEM

我分析了一下,为什么CPU利用率不高,可能是因为代码中只有一部分并行,所以代码只在运行到并行的部分时,CPU利用率会比较高

现在遇到了另一个问题,就是在运行 https://github.com/Elliothuo/juSFEM 里面的multi-core代码时发现,对一个70万的悬臂梁进行并行计算,在进程数添加到4时加速比为2.2左右,进程数为8时为3.9左右,进程数为12时为4.5左右,进程数为16时为4.6左右,进程数为24时为5.0左右。
在进程数为8时的并行加速比感觉还比较合理,但继续增加进程数时,发现速度提升不是很明显。所以想问一下可能的原因?不好意思一时回复的有点多,主要是我现在没有找到错误在哪里有点着急。

是不是它用MKL的部分把线程数写死了

你好,我只测了Ksfem部分的时间,没有涉及MKL
image

你好,还想问一下,一般在测多核CPU并行计算的时间消耗时有没有什么注意事项啊?我在想是不是我忽略了什么,而导致结果不对

我简单看了一遍这套代码,涉及并行的部分它一共只用到了几个概念:

  1. addproc:添加进程;
  2. SharedArray:进程间共享的数组;
  3. @sync @distributed:分布计算数组中的元素,结束后同步。

根据我以前测试SharedArray的印象,它比DistributedArray要快一个量级,但是并行效率依旧不能令人满意。具体到你这个scaling的问题,首先需要确认

  1. 理论上能快多少。如同你的设想一样,参见 Amdahl’s law;
  2. SharedArray本身的scaling能有多理想,找个简单的例子测试。

从你提供的数字来看,感觉很像Amdahl’s law的收敛段了。(假如程序中有80%的部分可以并行,20%的部分是串行,那么理论上你能达到的最大并行就是5倍。)

1 个赞

你好,感谢你的回复,我看了一下Amdahl’s law,然后再看了一下我测试的代码,我主要测试的是里面的Ksfem部分,这里面主要是并行部分,没有并行的部分很少,并行加速比基本能达到添加的进程数。这个并行加速比在这个开源代码的作者发表的文章中有提到,里面写的24核的理论并行加速比能够达到24