我刚买了 Matlab 并行计算工具箱。
该命令matlabpool open
使用我的 CPU 中的内核数打开并行工作程序。
但是我的每个 CPU 内核都有两个线程。根据Windows任务管理器,每个worker只能使用一个CPU核心的一半性能,这似乎可以解释为一个worker =一个线程=“半核”。
因此,在所有worker开启后,仍然可以使用CPU总功率的一半。
有没有其他命令可以帮助解决这个问题?
我刚买了 Matlab 并行计算工具箱。
该命令matlabpool open
使用我的 CPU 中的内核数打开并行工作程序。
但是我的每个 CPU 内核都有两个线程。根据Windows任务管理器,每个worker只能使用一个CPU核心的一半性能,这似乎可以解释为一个worker =一个线程=“半核”。
因此,在所有worker开启后,仍然可以使用CPU总功率的一半。
有没有其他命令可以帮助解决这个问题?
默认情况下,在选择要启动的默认工作人员数量时,local
集群类型matlabpool
仅考虑“真实”核心。这是因为对于 MATLAB 工作负载,超线程通常不会提供太多好处。但是,这个值只是一个默认值——您可以编辑集群类型并运行最多 12 个本地工作人员。
您需要了解超线程才能回答这个问题。
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 应该为每个内核注册两个线程,还是只注册一个?
论据亲:
论据相反:
我的猜测是,Matlab 开发人员认为参数 contra 比参数 pro 更重要。我自己的性能测试肯定表明,超线程对于 CPU 密集型计算几乎没有性能提升。