Re: [心得] Compute Pi Using A Monte Carlo

看板Mathematica作者 (養花種魚數月亮賞星星)時間13年前 (2011/06/29 13:45), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《kichigop (超痛恨不求甚解...XXX)》之銘言: : 恕刪^^ : 老師那請問到底該怎麼判斷何時比較適合用parallel computing呢? : 我剛試了一下 : ParallelTable[n, {n, 1, 10000000}] : SessionTime[] : Out[1]= 這結果就省略了^^" : Out[2]= 36.1718750 : Table[n, {n, 1, 10000000}] : SessionTime[] : Out[1]= 這結果就省略了^^" : Out[2]= 29.5156250 : 結果似乎沒有比較好...XD : 所以我不太曉得究竟甚麼樣的狀況比較適合用平行運算... 要能做平行運算條件是每次的計算是獨立的 test[ntemp_Integer]:=Block[{n=ntemp,data,t1,t2}, (* 建立n條具實數解的隨機二元一次方程式*) data=Select[RandomReal[{0,1},{n,3}],#[[2]]^2-4*#[[1]]*#[[3]]>=0&]; (* 不使用平行運算 *) t1=AbsoluteTiming[Map[Quiet@FindRoot[#.{x^2,x,1},{x,0}]&,data]]; (* 使用平行運算 *) t2=AbsoluteTiming[ParallelMap[Quiet@FindRoot[#.{x^2,x,1},{x,0}]&,data]]; {n,t1[[1]],t2[[1]]} ] (* n=100,200,...,10000 個實驗一次*) sim=test[#]&/@Range[100,10000,100] (* 畫出計算時間 *) plot1=ListLinePlot[{sim[[All,{1,2}]],sim[[All,{1,3}]]}] (* 建立圖例 *) Labeled[plot1, Grid[{Graphics[{#[[1]],Thickness[0.1],Line[{{0,0},{1,0}}]}, ImageSize->{24,24},AspectRatio->8/24, ImagePadding->0],#[[2]]}&/@ Transpose@{plot1[[1,1,{3,4},1]], {"不使用平行運算", "使用平行運算"}}], {Right,Top} ] 可以發現當計算次數少的時候,平行運算並沒有太大的好處, 但計算次數大的時候就能有效的節省計算時間 : 還有一個問題 : ParallelDo[Print[n], {n, 1, 8}] : (kernel 4) 1 : (kernel 3) 3 : (kernel 2) 5 : (kernel 1) 7 : (kernel 4) 2 : (kernel 3) 4 : (kernel 2) 6 : (kernel 1) 8 : 這不是我要的結果啊...沒有照順序排... : 這也讓我很好奇...我本來以為Table跟Do基本上是一樣的東西 : 只是Table是產生完用大括號括起來然後秀出來 : 但是ParallelTable看起來順序是對的 list={};Do[list=Append[list,n],{n,1,8}];list 但是用ParallelDo的時候,每次計算指定的kernel並沒有照順序, 所以才會有你說的情形。 事實上Mathematica 是不建議在做迴圈時第一時間就使用Do, For, While 這些函數 應該盡量以Pure function以及Functional programming取代 -- 養花種魚數月亮賞星星 http://chungyuandye.twbbs.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.232.166.217

06/29 13:46, , 1F
推!雖然我看不太懂
06/29 13:46, 1F
文章代碼(AID): #1E2hlz8c (Mathematica)
文章代碼(AID): #1E2hlz8c (Mathematica)