Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在Matlab中最大限度地利用多线程CPU?_Multithreading_Parallel Processing_Matlab - Fatal编程技术网

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

Multithreading 如何在Matlab中最大限度地利用多线程CPU?,multithreading,parallel-processing,matlab,Multithreading,Parallel Processing,Matlab,我刚买了Matlab并行计算工具箱 命令matlabpool open打开具有我的CPU中的内核数的并行工作进程 但是我的每个CPU核心都有两个线程。根据Windows任务管理器,每个工人只能使用一个CPU核心的一半性能,这似乎可以解释为一个工人=一个线程=“半核心” 因此,在所有工人打开后,CPU总功率的一半仍然可以使用 是否有其他命令可以对此有所帮助?默认情况下,matlabpool的local集群类型在选择要启动的默认工作线程数时只考虑“真实”内核。这是因为对于MATLAB工作负载,超线程

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

命令
matlabpool open
打开具有我的CPU中的内核数的并行工作进程

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

因此,在所有工人打开后,CPU总功率的一半仍然可以使用


是否有其他命令可以对此有所帮助?

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

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

您需要了解超线程才能回答此问题

Matlab为每个CPU启动一个工作线程。假设您现在使用像
parfor
这样的指令将计算分布到多个线程上。现在,每一条线都将愉快地处理数字

假设你正在做一个大的数字向量的和。实际发生的情况如下:

  • sum=sum+a[0]
    • 数组
      a
      尚未在我的CPU缓存中
    • 我将从主内存中提取一小部分
      a
      ,并将其放入CPU缓存中
  • 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]
    • 数组
      a
      尚未在我的CPU缓存中
    • 我将从主内存中提取一小部分
      a
      ,并将其放入CPU缓存中
  • sum=sum+a[1]
  • sum=sum+a[2]
在提取
a
期间,CPU暂停,等待系统内存。这称为
管道气泡
,对性能不利。有时,阵列
a
的一部分被交换到硬盘驱动器。操作系统需要访问驱动器以将该部分放入主内存,然后将其传输到CPU缓存。发生这种情况时,您的操作系统不会让CPU等待+200毫秒。它将使用这段时间执行另一项任务(如系统上运行的备份,或刷新屏幕,或…)

在CPU上切换任务会导致性能下降。要切换到不同的任务,操作系统必须保存CPU寄存器i