【发布时间】:2014-10-13 15:06:39
【问题描述】:
我正在 Linux 集群中的一个节点上运行 Matlab R2014a,该集群具有 20 个内核并启用了超线程。我知道这之前已经讨论过,但我正在寻找一些澄清。以下是我对 Matlab 中线程与内核问题的理解:
- Matlab 具有固有的多线程功能,并将在多核机器上利用额外的内核。
- Matlab 运行其线程的方式是,将多个 Matlab 线程放在同一个内核上(即超线程)是没有用的。因此,默认情况下,Matlab 将创建的最大线程数是您系统上的内核数。
- 使用 parpool() 时,无论您创建多少个 worker,每个 worker 将只使用一个物理内核,如 this thread 中所述。
但是,我还了解到,使用(已弃用)函数 maxNumCompThreads(),您可以减少或增加 Matlab 或其中一个工作线程将生成的线程数。这在几种情况下很有用:
- 您想利用 Matlab 的隐式多线程功能在集群节点上运行一些代码,而不分配整个节点。如果 maxNumCompThreads 被删除,如果有其他方法可以做到这一点,那就太好了。
- 您想要进行参数扫描,但参数少于机器上的内核数。在这种情况下,您可能希望增加每个工作人员的线程数,以便利用所有内核。这是最近在this thread 中提出的。然而,根据我的经验,虽然个别工作人员似乎很乐意使用 maxNumCompThreads() 来增加他们的线程数,但使用“top”命令检查实际 CPU 使用率表明它没有任何效果,即每个工作人员仍然只有可以使用一个核心。发生的事情可能是 parpool 生成的各个 Matlab 进程使用参数 -singleCompThread 运行。我已经确认,如果父 Matlab 进程使用 -singleCompThread 运行,命令 maxNumCompThreads(n),其中 n > 1 会由于 Matlab 在单线程模式下运行而引发错误。所以结果似乎是(至少在 2014a 年),您无法增加并行池工作者的计算线程数。与此相关的是,即使计算机本身启用了超线程,我似乎也无法让父 matlab 进程启动比内核更多的线程。同样,它将愉快地运行 maxNumCompThreads(n),其中 n > # 个物理内核,但 top 显示 CPU 利用率为 50% 的事实表明并非如此。那么发生了什么,或者我误解了什么?
编辑:更明确地提出我的问题:
- 在 parfor 循环中,为什么当 n > 1 时设置 maxNumCompThreads(n) 似乎有效?如果是因为worker进程是用-singleCompThread启动的,为什么maxNumCompThreads()没有像-singleCompThread启动的父进程一样返回错误?
- 在父进程中,为什么不使用 maxNumCompThreads(n), where n > # physical cores, 做点什么?
注意:我之前在 Matlab 答案上发布了这个,但没有收到任何反馈。
Edit2:看起来 (1) 中的问题是我使用的测试代码的问题。
【问题讨论】:
标签: linux multithreading matlab slurm