gpt4 book ai didi

matlab - 在 MATLAB 中使用 parfor 时避免竞争条件

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:09 24 4
gpt4 key购买 nike

我并行循环并在满足条件时更改变量。 super 地道的代码,我敢肯定每个人都写过一百遍:

trials = 100;
greatest_so_far = 0;
best_result = 0;

for trial_i = 1:trials
[amount, result] = do_work();

if amount > greatest_so_far
greatest_so_far = amount;
best_result = result;
end
end

如果我想用 parfor 替换 for,我如何确保在检查是否应该替换 greatest_so_far 时不存在竞争条件>?有没有办法在检查之外锁定这个变量?也许像:

trials = 100;
greatest_so_far = 0;
best_result = 0;

parfor trial_i = 1:trials
[amount, result] = do_work();

somehow_lock(greatest_so_far);
if amount > greatest_so_far
greatest_so_far = amount;
best_result = result;
end
somehow_unlock(greatest_so_far);
end

最佳答案

歪曲的答案。它并不能完全解决您的问题,但可能会帮助您避免它。

如果您有足够的内存来存储您的 do_work() 的输出到一些向量中,那么您可以简单地仅在此函数上运行您的 parfor,存储结果,然后在最后(循环外)进行评分:

amount = zeros( trials , 1 ) ;
result = zeros( trials , 1 ) ;

parfor trial_i = 1:trials
[amount(i), result(i)] = do_work();
end

[ greatest_of_all , greatest_index ] = max(amount) ;
best_result = result(greatest_index) ;

编辑/评论:(想把它放在你问题的评论中,但太长了,抱歉)。
我熟悉 .net 并且完全理解您的锁定/解锁 请求。我自己尝试了很多尝试来为很长的 parfor 循环实现一种进度指示器……但无济于事。

如果我懂 Matlab classification of variable正确地,您分配 greatest_so_far(在 greatest_so_far=amount 中)这一事实使 Matlab 将其视为临时变量,该变量将被清除并在每次循环迭代开始时重新初始化(因此无法用于您的目的)。

因此,一个容易锁定的变量 可能不是我们目前可以简单实现的概念。一些复杂的类事件或文件写入/检查可能会起到作用,但我担心时间安排会受到很大影响。如果每次迭代都需要很长时间来执行,那么开销可能是值得的,但是如果您使用 parfoor 来加速大量的短执行迭代,那么复杂的解决方案只会减慢您的速度而不是帮助...

你可以看看这个堆栈交换问题,你可能会发现一些对你的案例感兴趣的东西:Semaphores and locks in MATLAB

关于matlab - 在 MATLAB 中使用 parfor 时避免竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com