如何在MATLAB的spmd语句中用标志变量终止所有并行for循环?
解决MATLAB spmd并行循环全局终止问题
针对你需要在任意worker满足条件时终止所有并行循环的需求,这里提供两种可行方案:
方案一:使用labReduce实现全局逻辑判断(推荐)
labReduce可以对所有worker的本地变量进行聚合运算,这里用逻辑或(@or)来判断是否有任意worker触发终止条件,代码更简洁:
spmd global_flag = false; for i = 1:inf % 每次循环先检查全局终止标志 if global_flag break; end fprintf("x = %d, i = %d\n", labindex, i); % 本地判断是否满足终止条件 local_flag = (labindex == 7 && i == 111); % 全局聚合:只要有一个worker的local_flag为true,所有worker的global_flag都会变为true global_flag = labReduce(@or, local_flag); end end
原理说明
labReduce(@or, local_flag)会将所有worker的local_flag执行逻辑或运算,结果同步返回给每个worker。- 一旦任意worker触发终止条件,
global_flag会在所有worker中变为true,下一次循环就会执行break终止。
方案二:使用labBroadcast结合labFind
如果你一定要用labBroadcast,可以先通过labFind定位触发终止条件的worker,再由该worker广播终止标志:
spmd flag = false; for i = 1:inf if flag break; end fprintf("x = %d, i = %d\n", labindex, i); % 本地触发终止条件 if labindex == 7 && i == 111 flag = true; end % 找到所有触发终止标志的worker trigger_labs = labFind(flag); % 如果存在触发worker,由第一个触发的worker广播标志给所有worker if ~isempty(trigger_labs) flag = labBroadcast(trigger_labs(1), flag); end end end
原理说明
labFind(flag)返回所有flag为true的worker编号,若没有则返回空数组。labBroadcast(sender_lab, data)的第一个参数是发送方的labindex,这里取第一个触发的worker作为发送方,将true的flag广播给所有worker。
内容的提问来源于stack exchange,提问作者Dat
相关产品推荐
相关产品推荐

