【发布时间】: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 代码都可以在其中执行。