標題: Re: [心得] Compute Pi Using A Monte Carlo
時間: Wed Jun 29 13:45:24 2011
※ 引述《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取代
--
養花種魚數月亮賞星星
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.166.217
沒有留言:
張貼留言