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

Posted

技术标签:

【中文标题】如何在 Matlab 中最大限度地利用多线程 CPU?【英文标题】:How can I utilize multithread CPU most in Matlab? 【发布时间】:2013-09-24 04:49:51 【问题描述】:

我刚买了 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 之外真正实现了并行化。 【参考方案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 密集型计算几乎没有性能提升。

【讨论】:

以上是关于如何在 Matlab 中最大限度地利用多线程 CPU?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过多线程 Java 编程最大限度地利用资源(RAM 和 CPU)?

如何使表格布局中的列均匀分布,最大限度地利用可用空间

第一章 Java多线程技能

Java多线程编程Java多线程技能

如何扩展和优化线程池?

1.1进程和多线程的概念