【问题标题】:Reset loop index / restart loop - MATLAB重置循环索引/重新启动循环 - MATLAB
【发布时间】:2014-03-20 13:58:33
【问题描述】:

我需要以 1000 的批次运行 for 循环。但如果 'cc' 在第一次运行期间没有达到 100,我需要重新运行更多批次的 1000 直到 cc 达到 100。

我知道这可以使用 while 循环来完成,但是我需要使用并行工具箱 parfor(也可能是 GPU),而且据我所知它不支持 while 循环。

基本上我需要更改(重置)if 循环内的 for 循环索引。但是,显然 MATLAB 的 for 循环被设计为不能在循环内更改其索引,在本例中为“i”。有没有解决的办法?必须有一种更聪明的方法来做到这一点,而无需使用 while 循环。有什么建议吗?

for i=1:1000

    if (abs(i) <= gamma)
        % etc..
        cc = cc + 1;
    end

    if cc < 100
        i = 1;
    end

end

【问题讨论】:

  • 如果您要并行运行它,那么在它们已经启动后更改您执行的并行线程的数量有什么意义?并行执行的重点是每个线程不应该依赖于其他线程。也许您应该先使用 while 循环来获取 cc &gt;= 100,然后再并行执行其余的操作?
  • @Isaac 这是问题所在,因为'cc'是在for循环中生成的。我可以在 for 循环之外检查 cc 是否
  • 对,就这样做,然后结束循环。然后在不需要检查的地方开始另一个循环。
  • 当你说你想使用并行工具箱时,你的意思是你想把这个for循环变成一个parfor循环,这样它就可以在多个worker上运行?
  • @AndrewJanke 是的,希望稍后将其扩展到 GPU,但只要它与 parfor 一起工作,现在就可以了。

标签: matlab loops parallel-processing parfor


【解决方案1】:

你可以做的是运行一整批,将每个pass的独立cc指标累加到一个数组中,然后将parfor之外的结果结合起来看是否需要继续。这使循环的每一遍都独立于其他遍的结果,因此可以并行完成。

n = 1000;
cc = 0;
isDone = 1;
while ~isDone
    ccs = zeros(1, n);

    parfor i=1:n
        if (abs(i) <= gamma)
            % ...etc..
            ccs(i) = 1;
        end
    end

    cc = cc + sum(ccs);

    isDone = cc >= 100;
end

这会浪费一些工作。您可以调整n 以更改批处理大小并控制浪费工作之间的权衡(由于最后一批中的“碎片化”,cc 将使用较小的批处理使其达到 100)与并行化的开销。

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2016-06-01
    相关资源
    最近更新 更多