看板 Mathematica 關於我們 聯絡資訊
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清楚多了~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.4.190 ※ 文章網址: https://www.ptt.cc/bbs/Mathematica/M.1477566697.A.C03.html
AmibaGelos: 忘記提...不知道為什麼AbortKernels蠻不穩的,所以這個 10/27 19:14
AmibaGelos: WaitAllBetter碰到abort的時候比WaitAll不穩 10/27 19:15
ginstein: Amiba兄什麼背景?專玩少見,技術性的部分XD 推薦Mathics 10/27 21:28
ginstein: 往 MMA 的 open source alternative 發展,很有貢獻的:) 10/27 21:30
ginstein: 並不是說Mathics功能很強,而是open source值得貢獻. 10/27 22:06
AmibaGelos: 我作理論物理的,最近在弄mcmc需要好的visualization 10/27 22:53
AmibaGelos: 才會搞這些奇怪的功能lol 10/27 22:53
AmibaGelos: 我看了一下Mathics,用Python實作的沒掛Cython或PyPy應 10/27 23:09
AmibaGelos: 該會太慢...而且用Python的話MMA最大的幾個問題都沒有 10/27 23:10
ginstein: 原來如此,visualization的話MMA應該最好吧.計算速度的話 10/28 10:12
ginstein: http://12000.org/my_notes/rankTest/test.htm 矩陣計算 10/28 10:14
ginstein: MMA10表現反而和最新的Matlab,Maple差不多,如果需要矩陣 10/28 10:15
AmibaGelos: 我主要是算regression所以各家速度應該是一樣的 10/28 13:46
AmibaGelos: 而且這部分其實是subdominate,大頭是算NDSolve的部分 10/28 13:47
AmibaGelos: MCMC的output還得要丟到physical model裡跑,所以MMA應 10/28 13:47
AmibaGelos: 該就是最適合我的了 10/28 13:48
今天跑的時候發現原本的code會flatten結構,所以就重寫了code WaitAllBetter = Function[{F}, CheckAbort[Block[{FailedExp}, WaitAll[F] // (If[MemberQ[{$Failed, $Aborted}, #] & /@ Or[#, Quiet@#[[1]]], WaitAll[F]]; # /. {$Failed | $Aborted, FailedExp_} -> FailedExp) & ], AbortKernels[]; Abort[]] , {Listable}]; 新版的code readability比較高, 也適用於list of lists的情況, 不過遇到header不是 List的時候就沒辦法及時跳轉Failed state,而且CheckAbort功能也可能會跟特殊的code 衝到 基本上就是避免先對EvaluationObject list做運算就對了@@ ※ 編輯: AmibaGelos (140.112.4.190), 10/28/2016 13:56:10