Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB';什么是parfeval函数?_Matlab_Parallel Processing_Parfor - Fatal编程技术网

MATLAB';什么是parfeval函数?

MATLAB';什么是parfeval函数?,matlab,parallel-processing,parfor,Matlab,Parallel Processing,Parfor,在MATLAB文档中,我们有一个parfeval函数的代码示例。我对此有一些问题。代码如下: p = gcp(); %// To request multiple evaluations, use a loop. for idx = 1:10 f(idx) = parfeval(p,@magic,1,idx); % Square size determined by idx end %// Collect the results as they become available. mag

在MATLAB文档中,我们有一个
parfeval
函数的代码示例。我对此有一些问题。代码如下:

p = gcp();
%// To request multiple evaluations, use a loop.
for idx = 1:10
    f(idx) = parfeval(p,@magic,1,idx); % Square size determined by idx
end
%// Collect the results as they become available.
magicResults = cell(1,10);
for idx = 1:10
    %// fetchNext blocks until next results are available.
    [completedIdx,value] = fetchNext(f);
    magicResults{completedIdx} = value;
    fprintf('Got result with index: %d.\n', completedIdx);
end
    • parfeval
      是如何工作的
    • 此函数是否将
      magic
      函数的每个(idx)评估值发送给特定的工作人员
  • 如果我们只有一行代码
    f=parfeval(p,@magic,1,10)

    • 这段代码是如何工作的
    • 它是否只向一个工人发送评估并返回输出
    • parfeval
      parfevalOnAll
      之间有什么区别
    • fetchNext
      fetchOutputs
      之间有什么区别
    • 为什么在第一个
      for
      循环之后需要
      fetchNext
      ,然后需要第二个循环才能得到结果
    • 第一次循环后我们没有所有结果?为什么?
    • 我认为我们正在等待工人完成第二个循环的过程。这是真的吗?我们不能没有任何循环吗
  • 我认为我们可以使用
    magicResults{idx}=fetchOutputs(f(idx))在第二个循环中。我们得到了同样的结果。这两种结构的区别是什么

    • parfeval
      是如何工作的
    • 此函数是否将
      magic
      函数的每个(idx)评估值发送给特定的工作人员
  • 从:
    parfeval
    请求在并行池中的工作线程上异步执行。您可以使用
    cancel
    取消执行。它只是把它发送给任何自由工作者。使用
    parfevalOnAll
    在所有工人身上执行函数。
    parfeval
    所做的是提供通信框架(
    parallel.FevalFuture
    ),以确定功能评估是否完成以及结果如何

  • 如果我们只有一行代码
    f=parfeval(p,@magic,1,10)
    • 这段代码是如何工作的
    • 它是否只向一个工人发送评估并返回输出
    • parfeval
      parfevalOnAll
      之间有什么区别
  • 它将只向一个工作者(我猜是下一个自由工作者)发送评估,您可以通过调用
    fetchOutputs
    (将在之前等待完成)获取输出<但是,code>parfevalOnAll
    在所有worker上执行该函数-可能没有太多有用的用例。对大多数/所有计算作业使用
    parfeval

    • fetchNext
      fetchOutputs
      之间有什么区别
    • 为什么在第一个
      for
      循环之后需要
      fetchNext
      ,然后需要第二个循环才能得到结果
    • 第一次循环后我们没有所有结果?为什么?
    • 我认为我们正在等待工人完成第二个循环的过程。这是真的吗?我们不能没有任何循环吗
  • fetchNext
    等待,直到
    FEvalFutures
    列表中的任何一个函数求值完成并返回索引和结果
    fetchOutputs
    只在单个
    FEvalFuture
    上工作,并等待此操作并仅返回结果。因此,如果您计划了多个并行函数求值,请使用
    fetchNext
    ,如果只有一个并行函数求值,请使用
    fetchOutputs

    为什么是循环?你已经安排了10次评估,所以你应该等待这10次评估的结果。您知道必须调用
    fetchNext
    10次,因此使用循环。为了不等待太久,您可以使用
    fetchNext
    ,它会尽早返回(当至少有一个结果时),但您仍然需要调用它10次。您可以使用while循环,但它将是一个循环。示例中的for循环就足够了

  • 我认为我们可以使用
    magicResults{idx}=fetchOutputs(f(idx))在第二个循环中。我们得到了同样的结果。两者的区别是什么
    这两个结构
  • 是的,您可以使用它,但是您很可能会等待更长的时间,直到第一个结果提供给您。这通常是低效的

    原因是结果是异步到达的(因为它们是异步执行的)。那么,如果第二个已经可用(并且可能会进一步处理),为什么还要等待第一个呢。最好使用
    fetchNext
    等待下一个可用的


    我希望能弄清楚Matlab是如何处理异步性的。它们基本上有一个函数
    fetchNext
    ,它在一系列异步操作中至少有一个操作完成后立即返回。这通常是一种非常有效的设计模式。我强烈建议使用它。

    @embert。感谢您的完美编辑;-)希望你能尽快得到答案。非常感谢你详细的回答。因此,正如您所说,当我们使用
    parfevalOnAll
    时,它将向所有工人发送功能评估。这在上面的代码中是如何工作的?例如,对于
    idx=1
    它将在单独的workers中计算
    magic(1)
    4次(工作人数)?@user2991243是的,确切地说,它将使用相同的参数执行相同的函数4次(4个工作人数)。这通常不是很有用。有关parfevalonall的任何有用的应用,请参见文档中的示例:我在此处添加了一个新的相关问题: