我正在尝试在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行了,而且我已经将其中的一些内容打破了自己的脚本,这将意味着更多的代码行。
我正在使用的模拟软件包(FieldII)在parfor中完成模拟时不喜欢它。因此,为什么我使用pctRunOnAll命令。我被引导相信它应该被其他人认为应该让它起作用。
有没有理由为什么额外的工人不会决定工作和闲置?我可以在流程中看到,只有一个工人正在工作,但我可以看到所有16名工人都已初始化。
sim_img和sim_imm144完全相同。我复制了sim_img并将其重命名,因为Matlab具有自动保存功能并自动加载最新版本的功能。因此,如果我在一台计算机上对脚本进行实验性差异,它会自动保存并将其加载到另一台计算机上。因此,作为确保我不会丢失工作的保险政策,我在每台计算机上运行两个相同的脚本。
sim_img(144)脚本加载FieldII。然后,我有一个巨大的for循环,封装了其余的代码。 for循环选择要执行的模拟和保存结果的目录。有一些if和for语句根据我的要求将初始化数据应用于模拟器。现在它已全部设置,它通过查看是否已为该行写入结果文件来检查是否已处理/处理了一行数据。如果没有,它将通过创建文件为该行预先分配文件。然后,它执行与当前行相关的最后几位初始化,并开始模拟该行。在模拟线之后,它将数据写入预先分配的文件,然后返回以检查是否需要模拟另一条线。
据我所知,我的代码结构无关紧要,因为我认为我正在为每个worker添加整个脚本的副本,每个worker都运行整个脚本。允许它并行的是我检查当前行的结果文件是否存在以及是否预先分配的事实。我目前在当前的模拟中有两台并行工作的计算机 - 基本上和我试图让parpool一样。
所以我问的问题是,还有其他工人闲置的原因吗?
我试图尽可能多地添加相关信息。
答案 0 :(得分:0)
我使用并行工作程序进行了各种不同类型的计算,并得出结论我的问题是与HDD的读写延迟有关。工人们正在为谁进行哪次迭代而互相争斗,因此他们认为所有迭代都是完整的。硬盘驱动器是网络驱动器,有时会有点奇怪。不应该,但确实如此。
我可以通过各种不同的方式来实现这一目标。我选择的方法是根据每个工人的工人设置时间延迟。为了确保第一批模拟没有冲突,我在每个工人之间延迟了2秒。
我现在已经完成了几次完整的模拟,并且完美无缺。我一直在使用32名工人,并且在所有工人操作之前等待大约1分钟是因为并行处理将模拟时间减少了大约90-95%。它不是完美的,也不是最有效的,但它有效。