在單機上執行julia並行加速的例子

lt發表於2017-04-15

用sharedarray + @parallel for 與 array + for對比

 cnt = SharedArray(Int,1)
 cnt[1]=0;
 st=time();

 for i in 1:10^7
 cnt[1]=cnt[1]+1;
 end;

 ed=time();
 println(cnt[1])
 println(ed-st);

 cnt = Array(Int,1)
 cnt[1]=0;
 st=time();

 for i in 1:10^7
 cnt[1]=cnt[1]+1;
 end;

 ed=time();
 println(cnt[1])
 println(ed-st);

 cnt = SharedArray(Int,1)
 cnt[1]=0;
 st=time();

 @parallel for i in 1:10^7
 cnt[1]=cnt[1]+1;
 end;

 ed=time();
 println(cnt[1])
 println(ed-st);
 println(cnt)

---輸出
julia> include("d:\\testp.txt")
10000000
 2.1689999103546143
 10000000
 1.6689999103546143
 0
 0.42100000381469727
 [10000000]

序列的程式碼,cnt[1]的輸出是好的,不知道並行程式碼cnt[1]為什麼輸出0,如果把cnt的輸出移到後面,就可以輸出了。
把sharedarray改為array也能算對,也是一樣的速度

 cnt = Array(Int,1)
 cnt[1]=0;
 st=time();

 @parallel for i in 1:10^7+100
 cnt[1]=cnt[1]+1;
 end;

 ed=time();
 println(ed-st);
 println(cnt[1])

 println(cnt)
---輸出
julia> include("d:\\testp.txt")
0.437000036239624
10000100
[10000100]

訪問陣列也是並行快

 a=trues(10^7);

 for i in 1:10^6
 a[i*10]=0;
 end
 cnt = Array(Int,1);
 cnt[1]=0;
 st=time();

 @parallel for i in 1:10^7
 cnt[1]=cnt[1]+a[i];
 end;

 ed=time();
 println(ed-st);
 println(cnt[1])

 println(cnt)
---輸出
julia> include("d:\\testp.txt")
0.42100000381469727
9000000
[9000000]

但是訪問遞迴函式就是並行慢

 function re(n::Int32)
 if n>10 return 1;
 else return re(n+1)+n; end
 end

 cnt = Array(Int,1);
 cnt[1]=0;
 st=time();

 @parallel for i in 1:10^6
 cnt[1]=cnt[1]+re(1);
 end;

 ed=time();
 println(ed-st);
 println(cnt[1])

 println(cnt)

 cnt = Array(Int,1);
 cnt[1]=0;
 st=time();

 for i in 1:10^6
 cnt[1]=cnt[1]+re(1);
 end;

 ed=time();
 println(ed-st);
 println(cnt[1])

 println(cnt)
---輸出

0.437000036239624
56000000
[56000000]
0.28099989891052246
56000000
[56000000]

相關文章