【问题标题】:Is it possible to change two function using parfor loop?是否可以使用 parfor 循环更改两个函数?
【发布时间】:2017-08-08 04:53:08
【问题描述】:

假设我有两个用不同脚本编写的函数,比如function1.mfunction2.m 这两个函数中的两个计算是独立的(有些输入可能是相同的,比如function1(x,y)function2(x,z))。但是,按顺序运行,比如ret1 = function1(x,y); ret2 = function2(x,z); 可能会很耗时。我想知道是否可以在parfor循环中运行它:

parfor i = 1:2
ret(i) = run(['function' num2str(i)]); % if i=1,ret(1)=function1 and i=2, ret(2)=function2
end

是否可以写在parfor循环中?

【问题讨论】:

    标签: matlab function parfor


    【解决方案1】:

    你的想法是正确的,但实现是错误的。

    Matlab 不允许您在 parfor 中使用 run,因为它无法确保这是使用 parfor 的有效方式(即迭代之间没有依赖关系)。正确的做法是使用函数(而不是脚本)和if 语句在它们之间进行选择:

    ret = zeros(2,1);
    parfor k = 1:2
        if k==1, ret(k) = f1(x,y);  end
        if k==2, ret(k) = f2(x,z);  end
    end
    

    这里的f1f2 是一些返回标量值的函数(因此它适用于ret(k),并且循环的每个实例调用不同的if 语句。

    你可以在这里阅读更多关于how to convert scripts to functions的信息。

    【讨论】:

      【解决方案2】:

      parfor 循环的经验法则是每次迭代都必须是独立的。更准确地说,

      The body of the parfor-loop must be independent. One loop iteration cannot depend on a previous iteration, because the iterations are executed in a nondeterministic order.

      这意味着每次迭代都必须是可以独立执行并产生正确结果的迭代。

      因此,例如,如果您的代码显示为

      parfor (i = 1:2)
          function1(iterator,someNumber); 
          function2(iterator,someNumber);
      end
      

      应用 parfor 应该没有问题。

      但是,如果您的代码显示,例如,

      persistentValue = 0;
      parfor (i = 1:2)
          persistentValue = persistentValue + function1(iterator,someNumber); 
          function2(iterator,persistentValue);
      end
      

      它将无法使用。

      【讨论】:

        【解决方案3】:

        是的。这是可能的。

        这是一个例子:

        ret = zeros(2,1);
        fHandles = {@min, @max};
        x = 1:10;        
        parfor i=1:2
            ret(i) = fHandles{i}(x);    
        end
        ret   % show the results.
        

        这是否是个好主意,我不知道。设置并行处理可能会或可能不会对您有价值。

        1. 通常,您计算的迭代次数越多,您从设置parfor 循环中获得的价值就越大,因为迭代被分割并不确定地发送到单独的内核进行处理。因此,您现在正在使用 2 个内核,但如果您有很多功能,这可能会有所改善。
        2. 无法保证运行迭代的顺序(可能是为一个内核分配了 i 的一系列值,但我们不知道这些值是按顺序获取还是随机获取),因此您的代码可以'不依赖于循环的其他迭代。

        一般来说,MATLAB 编辑器非常擅长提前标记这些问题。

        编辑

        这里是不同函数的可变数量参数的概念证明

        ret = zeros(2,1);
        fHandles = {@min, @max};
        x = 1:10;         % x is a 1x10 vector
        y = rand(20);     % y is a 20x20 matrix
        z = 1;            % z is a scalar value
        fArgs = {{x};
                 {y,z}};  %wrap your arguments up in a cell
        parfor i=1:2
            ret(i) = fHandles{i}([fArgs{i}{:}]);  %calls the function with its variable sized arguments here
        end
        ret   % show the output
        

        同样,这只是概念验证。 MATLAB 中出现了关于必须在所有内核上广播fArgs 的重大警告。

        【讨论】:

        • 谢谢。如果两个函数的输入不相同怎么办?假设 function1 需要 x 和 y,而 function2 需要 x 和 z(y 和 z 可以不同)。
        • 这些变量是在 parfor 循环中确定的,还是可以在循环之外?更大的问题或问题是如何处理不同功能的可变大小输入?
        • 查看我的编辑以获取有关如何处理多个参数的示例。
        • 变量可以在外面确定。此外,对于不同的输入,变量大小可以不同(至少 y 和 z 可能有不同的大小)
        • 那我更新的例子有意义吗?变量xyz 的大小都不同,并且每种情况下函数的输入数量也不同。如果这不是你的意思,请告诉我。我不确定您是否要求不同的东西,或者从我的代码中不清楚变量大小不同。
        猜你喜欢
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多