我的 MATLAB R2019b GUI 项目遇到问题。我试图同时显示两组 4DCT(四维计算机断层扫描)图像。每套包含 10 个 CT 卷。在显示第一种情况(两组)时,我想在后台异步加载其他组。我的方法涉及对每个 4DCT 使用
parfeval(@select_data, x, data{idx})
,其中 select_data 是一个利用 parfor
读取 10 个 DICOM 卷的函数。
当我独立运行
select_data
时,它表现良好,有效地利用了所有可用的工人(例如 12 名工人)。然而,当我使用 parfeval
时,仅使用一名额外的工作人员,导致加载时间较慢(每个 4DCT 大约 30-40 秒)。此外,它还会导致主线程出现滞后,尽管我希望在加载过程中雇用多个工作人员,而其余工作人员可用于我的主线程。
以下是我可以访问的服务器规格:
CPU(s): 24
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 2
内存:70GB
我尝试将 parpool 中的工作线程数量限制为 8 个,留出 4 个核心来处理主 GUI 线程,但延迟仍然存在。
问题可能在于
parfor
中使用 parfeval
,这可能无法按预期利用所有可用的工作人员?
我预计嵌套并行结构不会产生任何额外的加速。您可以将许多工作人员分配到外部并行化,这不会留下任何空间来使用当前已经并行的外部级别之外的更多工作人员。无论如何,在嵌套循环的情况下,建议并行化最外层循环,我希望嵌套其他并行化结构也是如此。
如果您的外部结构仅包含两个元素(即您的idx
是
2
),那么通过串行评估该循环并在读取上使用并行化可能会更好,因为您已经验证了确实使用了更多元素工人,从而减少执行时间。在
我的这个答案以及这个中,有一堆关于如何以及何时利用并行化的背景链接。