【问题标题】:MATLAB Parfor is running much slower on a 18-core PC than a 10-core PCMATLAB Parfor 在 18 核 PC 上的运行速度比 10 核 PC 慢得多
【发布时间】:2021-08-27 23:53:14
【问题描述】:

我目前正在运行计算密集型金融交易测试;该测试有 503 个独立循环。我的办公室有两台电脑,一台配备 10 核 Intel i9-10900k @ 3.7GHz 和 128GB DDR4;另一个具有 18 核 Intel i9-7980XE @ 3.4GHz 和 128GB DDR4。

为了加快整个处理速度,第一台10核PC在parfor中运行loop 1-to-189;第二台 18 核 PC 在 parfor 中运行循环 190 到 503。

运行一天后,我发现 10 核 PC 完成了 25 个循环,而 18 核 PC 只完成了 4 个循环。我很好奇,有没有人知道这个问题的原因?

附:运行 MATLAB 2020b 的 10 核 PC,带有 MOSEK 9.2.35 的最新更新 运行 MATLAB 2021a 的 18 核 PC,带有 MOSEK 9.2.36 的最新更新

我也查看了taskmgr.exe,和10核PC不同,我发现在18核PC中,10个matlab任务是一组的,另外10个任务是分开的......

【问题讨论】:

  • 在不了解代码的情况下,除了猜测之外,我们无法提供任何信息。这些 PC 具有不同的规格并运行不同的 MATLAB 版本,10 核 PC 看起来具有更快的处理器,这些差异的影响可能并非微不足道。也许你的并行循环是用一些广播变量实现的,然后根据节点之间的通信来限制处理——我们实际上无法知道
  • 除了@Wolfie 注释,添加 parfor 不会神奇地减少执行时间,您的代码必须是可并行化的。如果实施不当,由于开销,parfor 甚至可能比 for 循环慢。所以确实我们需要更多信息,目前这个问题无法回答。
  • 既然你提到了 MOSEK:我不知道你在这方面使用了多少 MOSEK,但你可能应该用 MSK_IPAR_NUM_THREADS 指定每个实例应该只使用几个线程,甚至可能是 1 个线程。否则,他们每个人都会尝试同时使用所有内核,并且浪费在切换上的时间比节省的时间更多。
  • 非常感谢米哈尔!你是绝对正确的,当我关闭 MOSEK 中的多线程时,parfor-loop 现在大约是。比 for 循环快 17 倍!
  • 请注意,matlab 工作人员非常重量级,需要大量内存(大约每个工作人员至少 1gb)。可能是您的 18 名工人用完了 ram。如果是这样的话,你可以尝试使用新的轻量级 parpool,但不是每个 matlab 代码都可以在其中执行。

标签: matlab parfor


【解决方案1】:

非常感谢 Michal Adamaszek,当在 parfor 循环中使用 MOSEK(内点或整数编程)时,最好关闭 MOSEK 中的多线程,否则,默认情况下,MOSEK 将使用所有内核。

param.MSK_IPAR_NUM_THREADS = 1;
param.MSK_IPAR_INTPNT_MULTI_THREAD = 'MSK_OFF';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2017-03-20
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多