【问题标题】:How can I utilize multithread CPU most in Matlab?如何在 Matlab 中最大限度地利用多线程 CPU?
【发布时间】:2023-03-27 03:50:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我很确定你的 CPU 有超过 4 个线程。即使是一个微控制器(带有基本的 RTOS)也可以处理十几个线程。但是,如果您的计算是 CPU 密集型的,则生成大量线程不会提高处理速度。
  • 这里提到you can specify the amount of workers,虽然我不确定你是否能超过你目前的金额。如果一切都失败了,您可以随时考虑use multiple matlab sessions
  • 澄清一下,我怀疑您所说的是充分利用超线程处理单元。这个问题之前已经出现过,我已经提供了一个答案at this link,所以我将此问题标记为重复并投票结束。请让我知道(在这个评论线程中)如果你真的问的是不同的东西。
  • 确切地说,matlabpool 启动后台进程而不是线程(它们使用 MPI 在每个进程之间进行通信)。 MATLAB 计算引擎(如果你愿意的话是内核)的核心实际上是单线程的,尽管 IDE 和其他各种东西在单独的线程(Java 前端)中运行。然而,许多内置数学函数具有多线程实现,但由于 Intel MKL、FFTW 等库,这些函数在 MATLAB 之外真正实现了并行化。

标签: multithreading parallel-processing matlab


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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 毫秒。它将利用这段时间来执行另一个任务(例如在您的系统上运行的备份,或刷新您的屏幕,或...)。

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

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

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

    论据亲:

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

    论据相反:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多