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