[心得] 支援顯示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, Quiet@temp[[1]]], WaitAll[obj]];) &;
Do[Stepper[queue], {Length[F]}];
Flatten@res /. 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