如何在Matlab中最多地利用多线程CPU?

时间:2013-09-19 07:48:02

标签: multithreading parallel-processing matlab

我刚买了Matlab Parallel Computing工具箱。

命令matlabpool open打开并行工作程序,其中包含CPU中的核心数。

但我的每个CPU内核都有两个线程。根据Windows任务管理器,每个工作者只能使用一个CPU核心的一半性能,这似乎可以解释为一个工人=一个线程=“半核心”。

因此,在所有工人打开之后,仍然可以利用CPU总功率的一半。

还有其他命令可以帮助吗?

2 个答案:

答案 0 :(得分:1)

默认情况下,local matlabpool群集类型在选择要启动的默认工作人员数时仅考虑“真实”核心。这是因为对于MATLAB工作负载,超线程通常不会带来太多好处。但是,此值仅为默认值 - 您可以编辑群集类型并运行最多12个本地工作人员。

答案 1 :(得分:1)

您需要了解HyperThreading才能回答这个问题。

Matlab为每个CPU启动一个工作线程。假设您现在使用类似parfor的指令在多个线程上分配计算。现在每个线程都会愉快地处理数字。

假设你正在做一个大数字向量的总和。实际发生的是以下内容:

  • sum = sum + a[0]
    • 数组a不在我的CPU缓存中
    • 我将从主内存中取一小部分a并将其放入CPU缓存中
  • sum = sum + a[1]
  • sum = sum + a[2]
  • ...

在获取a期间,CPU 停止,等待系统内存。这称为pipeline bubble,对性能不利。有时,数组a的一部分被换出到硬盘驱动器。操作系统需要访问驱动器以将该部分放入主存储器,之后它将被传输到CPU缓存。发生这种情况时,操作系统不会让CPU等待+200 ms。它将使用该时间来执行另一个任务(例如在系统上运行的备份,或刷新屏幕,或......)。

在CPU上切换任务会导致性能下降。要切换到其他任务,操作系统必须将CPU寄存器保存在主存储器中,然后将其他任务的CPU寄存器首先加载回CPU。这需要时间。

使用HyperThreading,每个CPU的寄存器数量翻倍。这意味着两个过程可以占据' CPU。只能执行一个,但在停顿期间,操作系统可以切换到第二个进程而不会有任何性能损失。

忘记Microsoft Windows如何报告CPU使用情况。这是错的。 CPU使用情况要比简单的47%复杂得多。真正的问题是:matlab应该为每个核心注册两个线程,还是只注册一个?

参数pro:

  • 在停顿期间,CPU可以快速切换到另一个线程并继续执行。

争论反对:

  • 还有更多线程,问题分成更小的部分。这实际上可能会降低性能,因为您需要将更多部分放在一起以获得最终结果。
  • 上下文切换仍然会“毒害”。 L1和L2缓存,加载到CPU上的其他线程没有用的内存块中。
  • 如果没有摊位,你会有更多的开销。
  • 在桌面上,操作系统也需要运行:重绘屏幕,移动鼠标等。当所有逻辑CPU都在使用时,操作系统需要做一个实际的(昂贵的)上下文切换。
  • 只有在计算出问题的所有部分后,您的问题才会完成。使用所有核心/线程会增加一个线程花费更多时间的风险。

我的猜测是,Matlab开发人员认为参数反对比参数pro更重要。我自己的性能测试肯定表明HyperThreading对cpu密集型计算的性能提升很小。