为什么 Matlab 的 parpool 中的其他工人闲置?

Why do additional workers in a parpool in Matlab sit idle?

我正在尝试在 Matlab 中使用 parpool。

我正在使用以下代码来启动池和 运行 选择的脚本,但过了一会儿我收到一条通知,说明池将关闭。

以下主要检查代码运行正在哪台计算机上运行,​​并适当分配工作人员的数量。

if strcmp( getenv('COMPUTERNAME'),'EEN-PC144')
    parpool(4)
    pctRunOnAll sim_img144
elseif strcmp( getenv('COMPUTERNAME'),'EEN-PC78')
    parpool(16)
    pctRunOnAll sim_img
elseif strcmp( getenv('COMPUTERNAME'),'EEN-PC244')
    %parpool(1)
    %pctRunOnAll sim_img
end

并行池关闭通知截图:-

我正在尝试让多台计算机及其多核进行一组模拟。模拟是逐行完成的,不需要依赖它之前的行。我可以 post 模拟脚本本身,但它有 300 行长,我已经将其中的一些分解成他们自己的脚本,这意味着更多的代码行。

我使用的模拟包 (FieldII) 不喜欢在 parfor 中完成模拟。因此我使用 pctRunOnAll 命令的原因。我被引导相信它应该被其他应该让它工作的人工作。

是否有其他工人不决定工作而闲着的原因?我可以在流程中看到只有一名工人在工作,但我可以看到所有 16 名工人都已初始化。

处理屏幕截图:-

sim_img 和 sim_imm144 是完全相同的严格。我复制了 sim_img 并重命名了它,因为 Matlab 具有自动保存和自动加载最新版本的功能。因此,如果我在一台计算机上对脚本进行实验性修改,它会自动保存并在另一台计算机上加载它。因此,作为确保我不会丢失工作的保险单,我在每台计算机上都有两个相同的脚本 运行ning。

sim_img(144) 脚本加载 FieldII。然后我有一个巨大的 for 循环,它封装了其余代码。 for 循环选择要执行的模拟和保存结果的目录。有一些 if 和 for 语句根据我的要求将初始化数据应用于模拟器。现在一切都已设置,它通过查看是否已为该行写入结果文件来检查是否有一行数据 has/is processed/ing。如果没有,它将通过创建文件 pre-allocate 为该行创建一个文件。然后它会执行一些与当前行相关的最后一些初始化,并开始对该行的模拟。线路模拟完成后,将数据写入pre-allocated文件,然后返回检查是否需要模拟另一条线路。

据我所知,我的代码结构无关紧要,因为我认为我正在将整个脚本的副本加载到每个工作人员和每个工作人员 运行s整个脚本。允许它并行的事实是我检​​查当前行的结果文件是否存在,如果不存在,它是预先分配的。我目前有两台计算机在当前模拟中并行工作——基本上与我试图让 parpool 执行的操作相同。

所以我要问的问题是,是否有其他工人闲置的原因?

我已尝试添加尽可能多的相关信息。

我使用并行工作器进行了各种不同类型的计算,得出的结论是我的问题与 HDD 的读写延迟有关。工人们正在为谁在做什么迭代而互相争斗,因此他们认为所有的迭代都因此完成了。 HDD 是一个网络驱动器,有时表现得有点奇怪。它不应该,但确实如此。

我可以采取各种不同的措施来使它正常工作。我选择的方法是为每个工人设置一个时间延迟,具体取决于它是哪个工人。为了确保第一批模拟没有冲突,我在每个工人之间延迟了 2 秒。

我现在已经完成了几次完整的模拟并且效果很好。我一直在使用 32 个 worker,在所有 worker 开始操作之前等待大约 1 分钟是完全可以接受的,因为并行处理将模拟时间减少了大约 90-95%。它并不完美,也不是最有效的,但它确实有效。