這段**不是我寫的,謝謝實驗室的的師妹,接下來要把樹形通訊應用到求pi上去。
-module(my).
-export([main/1,temp/2,integer_to_atom/1,judge/3,ceil/1]).
main(corenum) -> sumdie=temp(corenum,1),
time=erlang:now(),
createp(1,corenum,sumdie,time),
io:format("").
temp(num,snum) when num =< snum-> snum;
temp(num,snum) -> temp(num,snum*2).
createp(n,corenum,sumdie,time) when n =:= corenum->
register(integer_to_atom(n),spawn(fun() -> loopin(n,2,sumdie,corenum,20000,time) end));
createp
(n,corenum,sumdie,time) ->
register(integer_to_atom(n),spawn(fun() -> loopin(n,2,sumdie,corenum,5000000,time) end)),
createp
(n+1,corenum,sumdie,time).
integer_to_atom
(int) -> t=integer_to_binary(int),
binary_to_atom(t,utf8).
loopin(number,die,sumdie,corenum,nn,time) -> t1=erlang:now(),
xunhuan(nn),
t2=erlang:now(),
io:format("the ~p core cycle time : ~pms~n",[number,timer:now_diff(t2,t1)/1000]),
loop(number,die,sumdie,corenum,time).
xunhuan(0) ->ok;
xunhuan(nn)->xunhuan(nn-1).
%每個core 收發資訊
loop
(number,die,sumdie,corenum,time) ->
if die =:= sumdie*2
->
io:format("~p need time : ~pms~n",[number,timer:now_diff(erlang:now(),time)/1000]);
%io:format("over");
true
-> [h|l]=judge(corenum,number,die),
ifh =:= 1
-> [h2|_]=l,
=h2,
(integer_to_atom(to))!,
io:format("~p need time : ~pms~n",[number,timer:now_diff(erlang:now(),time)/1000]);
true
-> [h2|_]=l,
=h2,
receive
->
io:format("~p get info from ~p~n",[number,from]),
loop(number,die*2,sumdie,corenum,time)
endend
end.
%判斷每核的收發
judge(sumcore,number,die) -> r=lslast(sumcore,number,die),
ifr =:= 1
->
if number rem die =:= 1
-> =find(number,die),
[1,];
true
-> [1,]
end;
true
->
if number rem die =:= 1
-> [0,];
true
-> [1,]
endend.
%判斷最後一核資訊傳送給**
find(number,die) -> current_order=ceil(number*2/die),
ifcurrent_order rem 2 =:= 0
-> ;
true
-> find(number,die*2)
end.
%計算live的核在本輪迭代中的序號,若為最後乙個標記為1.
lslast(sumcores,number,die) -> current_order=ceil(number*2/die),
sum_order=ceil(sumcores*2/die),
%io:format("~p ~p ~p ~p ~p~n",[sumcores,number,die,current_order,sum_order]),
ifcurrent_order =:= sum_order->
1; true
->
0 end.
%對小數取上界,比如ceil(15.1)=16
ceil(n) -> t=trunc(n),
temp = n-t,
case temp =:= 0.000
oftrue
-> t;
false
-> t+1
end.
erlang 無法ping通node的幾種情況
使用上面方法訪問乙個node的時候,會返回 pong pang 如果是pong則兩個node可以直接進行!交流,否則返回pang則不行。排除問題三步走 1 如果是不同的版本erlang則版本問題可能性最大。2 如果是在乙個電腦也無法訪問,檢查啟動的引數 setcookie是否一致,name裡的 bb...
Erlang 高併發高可靠的計算語言新星
erlang是愛立信開發交換機軟體的成果。據說能達到99.9999999 的可靠性,讓人嘆服。這是一門有很多創新的語言,是面向併發程式設計cop的開創者。在這個多核處理器的時代注定要大行其道。今天瀏覽了joe博士的 面對軟體錯誤構建可靠的分布式系統 初步的有了個印象。其中的基於非同步訊息的併發,容錯...
併發高階 多核程式設計中的條件同步模式
在多執行緒程式設計中,當對共享資源進行操作時,需要使用同步 通常是鎖或原子操作 來進行保護,以避免資料競爭問題。不幸的是,同步操作的開銷非常大,比如對乙個整數變數進行加法操作,那麼同步操作的開銷是加法操作的上百倍以上。有沒有辦法可以減少這種同步操作的開銷呢?如果能設計出更快的鎖或更快的原子操作來,那...