Multithreading 如何在Matlab中最大限度地利用多线程CPU?
我刚买了Matlab并行计算工具箱 命令Multithreading 如何在Matlab中最大限度地利用多线程CPU?,multithreading,parallel-processing,matlab,Multithreading,Parallel Processing,Matlab,我刚买了Matlab并行计算工具箱 命令matlabpool open打开具有我的CPU中的内核数的并行工作进程 但是我的每个CPU核心都有两个线程。根据Windows任务管理器,每个工人只能使用一个CPU核心的一半性能,这似乎可以解释为一个工人=一个线程=“半核心” 因此,在所有工人打开后,CPU总功率的一半仍然可以使用 是否有其他命令可以对此有所帮助?默认情况下,matlabpool的local集群类型在选择要启动的默认工作线程数时只考虑“真实”内核。这是因为对于MATLAB工作负载,超线程
matlabpool open
打开具有我的CPU中的内核数的并行工作进程
但是我的每个CPU核心都有两个线程。根据Windows任务管理器,每个工人只能使用一个CPU核心的一半性能,这似乎可以解释为一个工人=一个线程=“半核心”
因此,在所有工人打开后,CPU总功率的一半仍然可以使用
是否有其他命令可以对此有所帮助?默认情况下,
matlabpool
的local
集群类型在选择要启动的默认工作线程数时只考虑“真实”内核。这是因为对于MATLAB工作负载,超线程通常不会提供太多好处。但是,此值只是默认值-您可以编辑群集类型并运行最多12个本地工作线程。默认情况下,matlabpool
的local
群集类型在选择要启动的默认工作线程数时只考虑“真实”内核。这是因为对于MATLAB工作负载,超线程通常不会提供太多好处。但是,此值仅为默认值-您可以编辑群集类型并运行最多12个本地工作进程的任何操作。您需要了解超线程才能回答此问题
Matlab为每个CPU启动一个工作线程。假设您现在使用像parfor
这样的指令将计算分布到多个线程上。现在,每一条线都将愉快地处理数字
假设你正在做一个大的数字向量的和。实际发生的情况如下:
sum=sum+a[0]
- 数组
尚未在我的CPU缓存中a
- 我将从主内存中提取一小部分
,并将其放入CPU缓存中a
- 数组
sum=sum+a[1]
sum=sum+a[2]
a
期间,CPU暂停,等待系统内存。这称为管道气泡
,对性能不利。有时,阵列a
的一部分被交换到硬盘驱动器。操作系统需要访问驱动器以将该部分放入主内存,然后将其传输到CPU缓存。发生这种情况时,您的操作系统不会让CPU等待+200毫秒。它将使用这段时间执行另一项任务(如系统上运行的备份,或刷新屏幕,或…)
在CPU上切换任务会导致性能下降。要切换到不同的任务,操作系统必须将CPU寄存器保存在主存中,并首先将另一个任务的CPU寄存器加载回CPU。这需要时间
通过超读,每个CPU的寄存器数量增加了一倍。这意味着两个进程可以“占用”CPU。只能执行一个进程,但在暂停期间,操作系统可以切换到第二个进程,而不会造成任何性能损失
忘记Microsoft Windows如何报告CPU使用情况。这是错误的。CPU的使用比简单的47%
要复杂得多。真正的问题是:matlab应该为每个内核注册两个线程,还是只注册一个线程
Arguments pro:
- 在暂停期间,CPU可以快速切换到另一个线程并继续执行
- 有更多的线程,问题被分成更小的部分。这实际上可能会降低性能,因为您需要将更多的部分放在一起以获得最终结果
- 上下文切换仍然会“毒害”一级和二级缓存,加载对CPU上的另一个线程没有用处的内存块
- 如果没有摊位,你会有更多的开销
- 在桌面上,操作系统还需要运行:重新绘制屏幕、移动鼠标等。当所有逻辑cpu都在使用时,操作系统需要进行实际(昂贵的)上下文切换
- 只有计算了问题的所有部分,您的问题才算完整。使用所有内核/线程会增加一个线程占用更多时间的风险
我的猜测是,Matlab开发人员认为参数contra比参数pro更重要。我自己的性能测试肯定表明,对于cpu密集型计算,超线程的性能增益很小。您需要了解超线程才能回答这个问题 Matlab为每个CPU启动一个工作线程。假设您现在使用像
parfor
这样的指令将计算分布到多个线程上。现在,每一条线都将愉快地处理数字
假设你正在做一个大的数字向量的和。实际发生的情况如下:
sum=sum+a[0]
- 数组
尚未在我的CPU缓存中a
- 我将从主内存中提取一小部分
,并将其放入CPU缓存中a
- 数组
sum=sum+a[1]
sum=sum+a[2]
a
期间,CPU暂停,等待系统内存。这称为管道气泡
,对性能不利。有时,阵列a
的一部分被交换到硬盘驱动器。操作系统需要访问驱动器以将该部分放入主内存,然后将其传输到CPU缓存。发生这种情况时,您的操作系统不会让CPU等待+200毫秒。它将使用这段时间执行另一项任务(如系统上运行的备份,或刷新屏幕,或…)
在CPU上切换任务会导致性能下降。要切换到不同的任务,操作系统必须保存CPU寄存器i