Erlang-多核并发时的树形通信

这段代码不是我写的,谢谢实验室的的师妹,接下来要把树形通信应用到求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),
            if
                H =:= 1 -> [H2|_]=L,
                        {send,To,DieThat}=H2,
                       (integer_to_atom(To))!{Number,DieThat},
                       io:format("~p need time : ~pms~n",[Number,timer:now_diff(erlang:now(),Time)/1000]);
                true -> [H2|_]=L,
                    {get,From,DieThat}=H2,
                    receive
                        {From,DieThat} -> io:format("~p get info from ~p~n",[Number,From]),
                                    loop(Number,Die*2,SumDie,CoreNum,Time)
                    end
            end
     end.

%判断每核的收发
judge(SumCore,Number,Die) -> R=lslast(SumCore,Number,Die),
   if
      R =:= 1 ->
         if
            Number rem Die =:= 1 -> {DieThat,To}=find(Number,Die),
                                    [1,{send,To,DieThat}];
            true -> [1,{send,Number-erlang:trunc(Die/2),Die}]
         end;

      true ->
         if
            Number rem Die =:= 1 -> [0,{get,Number+erlang:trunc(Die/2),Die}];
            true -> [1,{send,Number-erlang:trunc(Die/2),Die}]
         end
   end.

%判断最后一核信息发送给哪里
find(Number,Die) -> Current_order=ceil(Number*2/Die),
   if
      Current_order rem 2 =:= 0 -> {Die,Number-erlang:trunc(Die/2)};
      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]),
      if
         Current_order =:= Sum_order -> 1;
         true -> 0
      end.

%对小数取上界,比如ceil(15.1)=16
ceil(N) -> T=trunc(N),
           Temp = N-T,
   case Temp =:= 0.000 of
      true -> T;
      false -> T+1
   end.
时间: 2024-10-12 22:55:42

Erlang-多核并发时的树形通信的相关文章

多并发时支付如何保持账户余额的一致性?

转载:http://costlend.com/2016/03/14/dispatch-pay-balance-keep-consistence/ 不管是电商,还是O2O业务都会涉及到支付,而且多速情况下流量比较大,尤其是在做活动的时候.一般支付系统主要有充值,扣费,提现,转账等功能,那么在有些业务场景下,尤其是多并发的情况下,我们在做扣费业务操作时该怎样去保持账户余额的一致呢? Java开发人员可能第一个想法就是在调用扣减的DAO的方法上加上一个synchronized关键字,这个解决办法在单节

erlang在windows下和虚拟机节点通信

在Linux下部署erlang项目,开发过程很多都是在Windows完成的,然后再发布到Linux,所以测试过程要在虚拟机下完成.有一天因为想要在虚拟机中使用到erlang图形化工具,比如appmon.tv.observer等等,便突发奇想得利用Windows的erlang连接到虚拟机中使用这些工具,来查看虚拟机的运行状态. 需要准备哪些东西? 我是在VmWare10虚拟Centos6.5系统,所以这里以VmWare10和Centos6.5为例,其他Linux系统及工具只做参考. 注意了,Lin

LNMP高并发时502

之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下 1 2 3 4 5 6 7 8 9 10 11 listen = /tmp/php-cgi.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_children = 300 pm.start_serve

如何面对你—LNMP高并发时502

问题:最近的抢购有点火,到点抢购的时候网站就会出现502错误 顶不住消费者的压力. 伤..... 之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下 listen = /tmp/php-cgi.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_chil

[转]你如何面对—LNMP高并发时502

From : http://www.topthink.com/topic/5683.html 之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下 listen = /tmp/php-cgi.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_childr

qt容器在并发时需要注意的地方

最近用tbb和qt写了一个延时摄影后期控制镜头的工具,主要就是扫描目录下所有图片,按照给定参数截取图片中某区域并另存,模拟镜头摆动. 扫描后的图片路径保存在qlist内,作为只读数据,交由tbb的parellel_for处理.tbb并行对qlist每个元素内的路径对应的图片进行读取,裁剪,另存操作(磁盘是ssd,这个程序在8线程的机器上,可令cpu满负荷).理想是美好的,现实是残酷的. 前提,qlist(不光qlist了,qt很多数据结构都)实现了copy on write,qlist的索引操作

ecshop 秒杀并发时库存会被减到小于0的解决办法

ecshop 秒杀并发时库存会被减到小于0更新库存后,再进行库存检查,如果库存为负数,则执行事务的回滚. begin();//开始一个事物处理开始 $sql = "UPDATE ".$GLOBALS['a']->table('seconds_kill')." SET kill_stock = kill_stock - 1 WHERE sk_id='".$sk_id."' LIMIT 1" ; $GLOBALS['db']->query

FluorineFx 播放FLV 时堆棧溢出解决 FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法

http://25swf.blogbus.com/tag/FluorineFx/ FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法 在FLASH里,假如在一个方法里,同事使用几个不同的NetStream.play 一个相同的标识,会发现只有一个能正常播放. 进行以下修改 RtmpConnection.cs 里的NewPlaylistSubscriberStream 方法if (streamId < StreamId)        return null;改

Loadrunner 并发时&#39;Error -27492 HttpSendRequest failed&#39;解决办法

问题点 Loadrunner11对脚本单独回放时,回放100%正常无报错信息,但是运行场景多个用户并发测试时,运行一段时间后,每次均报错: Error -27492: "HttpSendRequest" failed, Windows error code=12002 百度了一下,答案千篇一律,基本解决办法都是: "在Runtime-setting中的preferences-->options-->http-request connect timeout(sec)