[心得] 支援显示Abort/Failed的WaitAll

楼主: AmibaGelos (Amiba Gelos)   2016-10-27 19:11:34
MMA有个asynchronous computing的功能叫ParallelSubmit
它不仅可以配合WaitAll/WaitNext做异步运算,还附赠精美status icon来提示工作状态
基本上它的icon有4种state
1. Ready : work item在queue中等待
2. Running : 送到parallel kernel中正在跑...
3. Received/Finished : 跑完了已经回传output到主kernel
4. Failed : 这个work item GG惹 (通常是因为AbortKernels[])
最后的Failed很怪, 如果乖乖在item里送出Abort就只是终止这个item并回传$Aborted
由于这个item还是正常地完成了, status icon会辨识为Received/Finished而非直觉上的
Failed
要跳到Failed state一定得要从MMA的asynchronous queue本身下手才有用
例如用 Parallel`Developer`ResetQueues直接把queue中的ready states清空
或是在WaitNext/WaitAll执行work item的过程中直接在front end abort
也就是说这个Failed state基本上没用OTZ
为了增加它的用途我用doc里提到的"重复跑同一个work item两次会跳到Failed state"的
特性做了一个可以自动在遇到$Failed或$Aborted时跳到Failed state的WaitAll
除此之外它也可以吃{$Failed/$Aborted, failed expression} 来提供CheckAbort的功能
(bag只是个container,不想有shadowing的话可以再包一层)
WaitAllBetter[F : {__EvaluationObject}] :=
CheckAbort[Block[{res = bag[], obj, queue = F, temp, out, Stepper},
Stepper = ({temp, obj, queue} = WaitNext[#];
res = {res, bag[temp]};
If[MemberQ[{$Failed, $Aborted}, #] & /@
Or[temp, [email protected][[1]]], WaitAll[obj]];) &;
Do[Stepper[queue], {Length[F]}];
[email protected] /. bag -> Sequence /. {$Failed | $Aborted, out_} ->
out], AbortKernels[]; Abort[]]
用这个function可以实作TimeConstraint的同时避免掉用Message产生洗版的问题
以ParallelSubmit MMA doc的Neat example为例
(PrintTemporary[#]; #) &@
Table[ParallelSubmit[{i}, If[# === $Aborted, {$Failed, TO[i]}, #] &@
TimeConstrained[Plus @@ FactorInteger[2^i - 1][[All, 2]], 4]],
{i, 220, 170, -1}];
WaitAllBetter[%]
跑起来比Message清楚多了~
楼主: AmibaGelos (Amiba Gelos)   2016-10-27 19:14:00
忘记提...不知道为什么AbortKernels蛮不稳的,所以这个WaitAllBetter碰到abort的时候比WaitAll不稳
作者: ginstein (迈向学术之路)   2016-10-27 21:28:00
Amiba兄什么背景?专玩少见,技术性的部分XD 推荐Mathics往 MMA 的 open source alternative 发展,很有贡献的:)并不是说Mathics功能很强,而是open source值得贡献.
楼主: AmibaGelos (Amiba Gelos)   2016-10-27 22:53:00
我作理论物理的,最近在弄mcmc需要好的visualization才会搞这些奇怪的功能lol我看了一下Mathics,用Python实作的没挂Cython或PyPy应该会太慢...而且用Python的话MMA最大的几个问题都没有
作者: ginstein (迈向学术之路)   2016-10-28 10:12:00
原来如此,visualization的话MMA应该最好吧.计算速度的话http://12000.org/my_notes/rankTest/test.htm 矩阵计算MMA10表现反而和最新的Matlab,Maple差不多,如果需要矩阵
楼主: AmibaGelos (Amiba Gelos)   2016-10-28 13:46:00
我主要是算regression所以各家速度应该是一样的而且这部分其实是subdominate,大头是算NDSolve的部分MCMC的output还得要丢到physical model里跑,所以MMA应该就是最适合我的了

Links booklink

Contact Us: admin [ a t ] ucptt.com