【问题标题】:Execute 3 functions in parallel on 3 workers在 3 个 worker 上并行执行 3 个函数
【发布时间】:2016-06-11 19:12:09
【问题描述】:

我有三个函数(qrcalczcalcpcalc),我想并行运行三个独特的输入集。这是我的尝试,但它不起作用:

function [outall]=parallelfunc(in1,in2,in3)
if parpool('size') == 0 % checking to see if  pool is already open
    A=feature('numCores');
    parpool('local',A);
else
    parpool close
    A=feature('numCores');
    parpool('local',A);
end

spmd
    if labindex==2
        out1=qrcalc(in1);
    elseif labindex==3
        out2=zcalc(in2);
    elseif labindex==4
        out3=pcalc(in3);
    end

    outall=[out1;out2;out3];
end

错误:使用并行尝试时出错>(spmd 正文)(第 20 行)错误 在工人 3 上检测到。UndefinedFunction 错误被抛出 'out1' 的工人。这可能是因为包含“out1”的文件是 工人无法访问。为此指定所需的文件 并行池使用命令:addAttachedFiles(pool, ...)。见 parpool 的文档以获取更多详细信息。

parallelattempt 中的错误>(spmd)(第 11 行)spmd

parallelattempt 中的错误(第 11 行)spmd

对于如何做到这一点有什么建议吗?


这是不需要自定义函数的代码版本。因此我将它们替换为zerosmagicones

function [outall]=parallelattempt(in1,in2,in3)

poolobj = gcp;
addAttachedFiles(poolobj,{'zeros.m','ones.m','magic.m'})

spmd
    if labindex==2
        out1=zeros(in1);
    elseif labindex==3
        out2=magic(in2);
    elseif labindex==4
        out3=ones(in3);
    end

    outall=[out1;out2;out3];
end

【问题讨论】:

  • 究竟是什么不起作用?我在这里看到了几件可能有问题的事情。包含错误消息和/或解释什么不起作用是有益的。
  • 嗨@Matt,我将错误添加到主要问题中,并使用了零、魔法和一的修改函数。并且还更早地启动了并行池。

标签: matlab parallel-processing


【解决方案1】:

如果你使用spmd-statement,里面的代码会发送给所有的worker。通过使用labindex,您只能在一个特定的工作人员上创建变量outX。问题是,outall=[out1;out2;out3]; 现在应该在没有声明两个 outX-variables 的工作人员上执行。此错误的直接修复方法是在spmd-statement (out1=[]; out2=[]; out3=[];) 之前声明变量。但这不是最好的解决方案。

您可以在spmd-语句中使用单个变量而不是多个变量 (outX),让我们将此变量称为 out。现在代码在每个worker上执行并将其结果存储在out,这是一个Composite-object。连接不是必需的,因为它是自动完成的。此外,您可以在块的开头使用 spmd (3) 指定只应使用 3 个工作人员。 Composite-objects 可以像元胞数组一样被索引,其中索引等于工人/实验室的数量。因此我们可以在块之后将它连接起来。

这是该部分的具体代码:

spmd (3)
    if labindex==1
        out = qrcalc(in1);
    elseif labindex==2
        out = zcalc(in2);
    elseif labindex==3
        out = pcalc(in3);
    end
end

outall = [out{1};out{2};out{3}];

请注意,如果池不存在,则会自动创建池。您可能需要在声明之前附加您的函数文件。


我认为更好的方法是在此处使用 parfeval。这正是您首先想要实现的目标 - 它解决了您的 initial 问题。 outX 变量是并行计算的(非阻塞)。使用函数fetchOutputs,您可以阻止执行,直到计算出结果。在所有outX-变量上使用它并将其连接在同一行中。

下面是代码:

out1 = parfeval(@qrcalc,1,in1);
out2 = parfeval(@zcalc,1,in2);
out3 = parfeval(@pcalc,1,in3);

outall = [fetchOutputs(out1);fetchOutputs(out2);fetchOutputs(out3)];

【讨论】:

  • 非常感谢马特。但是我有一个问题,所有 3 个函数是否会彼此并行运行,或者存在“if”语句这一事实是否意味着它们将彼此相继运行?
  • @Trippy 是的,它们将并行运行。 if 语句只是改变在每个 worker 上执行的代码部分。顺便说一句:我添加了另一个解决方案,它可能更适合您并行计算函数的初始问题。
  • 太棒了!非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2019-11-16
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多