1

我刚买了 Matlab 并行计算工具箱。

该命令matlabpool open使用我的 CPU 中的内核数打开并行工作程序。

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

因此,在所有worker开启后,仍然可以使用CPU总功率的一半。

有没有其他命令可以帮助解决这个问题?

4

2 回答 2

3

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

于 2013-09-19T10:50:42.780 回答
2

您需要了解超线程才能回答这个问题。

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

假设您正在对大量数字进行求和。实际发生的情况如下:

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

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

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

使用超线程,每个 CPU 的寄存器数量增加了一倍。这意味着两个进程可以“占用”CPU。只能执行一个,但在停顿期间,操作系统可以切换到第二个进程而不会造成任何性能损失。

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

论据亲:

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

论据相反:

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

我的猜测是,Matlab 开发人员认为参数 contra 比参数 pro 更重要。我自己的性能测试肯定表明,超线程对于 CPU 密集型计算几乎没有性能提升。

于 2014-06-05T11:05:08.157 回答