1

我正在尝试在 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

并行池关闭通知屏幕截图:-

并行池关闭通知截图

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

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

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

处理屏幕截图:-进程截图

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

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

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

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

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

4

1 回答 1

0

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

我可以做各种不同的工作来完成这项工作。我选择的方法是根据每个工人的身份为每个工人设置一个时间延迟。为了确保第一批模拟没有冲突,我在每个工人之间延迟了 2 秒。

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

于 2016-07-05T18:53:59.460 回答