Erlang 多核併發時的樹形通訊

2021-07-01 21:47:46 字數 2868 閱讀 2248

這段**不是我寫的,謝謝實驗室的的師妹,接下來要把樹形通訊應用到求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博士的 面對軟體錯誤構建可靠的分布式系統 初步的有了個印象。其中的基於非同步訊息的併發,容錯...

併發高階 多核程式設計中的條件同步模式

在多執行緒程式設計中,當對共享資源進行操作時,需要使用同步 通常是鎖或原子操作 來進行保護,以避免資料競爭問題。不幸的是,同步操作的開銷非常大,比如對乙個整數變數進行加法操作,那麼同步操作的開銷是加法操作的上百倍以上。有沒有辦法可以減少這種同步操作的開銷呢?如果能設計出更快的鎖或更快的原子操作來,那...