Erlang-并行梯度积分法

这个代码写了两天,从没思路到有思路,还好最终搞定了~不过这个进程数必须为2^n个。

先贴一个运行截图:

-module(exe4).
-export([start/5]).

start(F,X1,X2,Num,Cores)
    ->spawn(fun()->parent_proces(F,X1,X2,Num,Cores) end),
    io:format("").

parent_proces(F,X1,X2,Num,Cores)
    ->creat_child_proces(F,X1,X2,(X2-X1)/Num,erlang:trunc(Num/Cores),Cores,Num,Cores,[]).

creat_child_proces(F,X1,X2,Width,Num_Per_Core,Cores,Num,N,L)
      when N =:=1 ->
      Pid = spawn(fun()->child_proces(F,X1,Width,Num-(Cores-1)*Num_Per_Core,0,N) end),
      Father = self(),
      PidR = spawn(fun()->loop_control(Father,0,Cores,2) end),
      sendInfo(L++[Pid]++[PidR],1,Cores,2,Cores);
creat_child_proces(F,X1,X2,Width,Num_Per_Core,Cores,Num,N,L)
      ->Pid=spawn(fun()->child_proces(F,X1,Width,Num_Per_Core,0,N) end),
        creat_child_proces(F,X1+Width*Num_Per_Core,X2,Width,Num_Per_Core,Cores,Num,N-1,L++[Pid]).

%子进程求部分和
child_proces(F,X1,Width,0,Sum,N1) -> io:format("~p ‘s result is ~p~n",[self(),Sum]),
                                     loop_send_get(Sum);
child_proces(F,X1,Width,N,Sum,N1) -> S=(F(X1)+F(X1+Width))*Width/2,
                                    child_proces(F,X1+Width,Width,N-1,Sum+S,N1).
%子进程部分和的发送和接收,由主进程sendInfo方法控制
loop_send_get(Sum) ->
        receive
                {From,Sum1,Father,PidR} ->
                        io:format("~p from ~p to ~p result is ~p ~n",[Sum1,From,self(),Sum1+Sum]),
                        PidR!{"ok"},
                        loop_send_get(Sum+Sum1);
                {Pid,Father,PidR} ->
                        Pid!{self(),Sum,Father,PidR}
        end.
%控制每一轮迭代求和的次数,N为一轮迭代中求和的次数,初始值为0,Divisor为控制变量,初始值为2
loop_control(Father,N,Cores,Divisor) ->%io:format("N:~p Divisor:~p~n",[N,Divisor]),
        if
            Cores =:= N*Divisor ->
                                Father!{self(),"over"},
                                loop_control(Father,0,Cores,Divisor*2);
            true ->
                    receive
                        {"ok"} ->   loop_control(Father,N+1,Cores,Divisor)
                    end

        end.
sendInfo(PidList,N,Cores,Divisor,Dsum) ->%io:format("Pidlist:~p ~nN:~p Cores:~p Divisor:~p Dsum:~p ~n",[PidList,N,Cores,Divisor,Dsum]),
                                        Nt = erlang:trunc(N),
            if
                Divisor =:= 2*Dsum -> io:format("over~n");

                Nt > Cores ->
                        receive
                            {From,"over"} ->sendInfo(PidList,1,Cores-Divisor/2,Divisor*2,Dsum)
                        end;
                Nt rem Divisor =:= 1 ->
                        sendInfo(PidList,N+Divisor/2,Cores,Divisor,Dsum);
                Nt rem Divisor =/= 1 ->
                        Pid_send = lists:nth(Nt,PidList),
                        Pid_get = lists:nth(erlang:trunc(Nt-Divisor/2),PidList),%io:format("send:~p get:~p~n",[Pid_send,Pid_get]),
                        Pid_send!{Pid_get,self(),lists:nth(erlang:trunc(Dsum+1),PidList)},
                        sendInfo(PidList,N+Divisor/2,Cores,Divisor,Dsum)
            end.

时间: 2024-09-29 09:42:07

Erlang-并行梯度积分法的相关文章

Erlang简单并行server

Erlang简单并行服务器 (金庆的专栏) Erlang并行服务器为每一个Tcp连接创建相应的连接进程,处理client数据. 參考 Erlang程序设计(第2版)17.1.3 顺序和并行服务器 并行服务器的诀窍是:每当gen_tcp:accept收到一个新连接时就马上分裂一个新进程. 为每一个新套接字连接创建一个并行进程. -module(gs_svr).-author("jinqing"). -behaviour(gen_server). %% API-export([start_

Erlang语言研究综述

摘 要: 本文前半部分主要是关于Erlang编程语言相关的内容:着重就一般学习编程语言的一般的关注点来阐述了Erlang编程语言的基本语法点,主要包括:Erlang的变量.Erlang的数据类型.Erlang的语句和Erlang编程语言的函数与模块四个方面:本文的后半部分主要就Erlang语言的并行化编程的实践:Erlang的并行化编程与Erlang并行化编程在矩阵乘积的实际应用,通过实践,可以发现,Erlang语言确实在并行化编程方面表现得很优秀. 关键词:并行计算:Erlang:编程语言:矩

tensorflow架构

TensorFlow 又是好久没有写博客了,上班以来,感觉时间过得飞快,每天时间很紧,过得有点累,不知道自己的博客能坚持到何时,且行且珍惜. 本片博文是参考文献[1]的阅读笔记,特此声明 TensorFlow,以下简称TF,是Google去年发布的机器学习平台,发布以后由于其速度快,扩展性好,推广速度还是蛮快的.江湖上流传着Google的大战略,Android占领了移动端,TF占领神经网络提供AI服务,未来的趋势恰好是语音图像以及AI的时代,而Google IO上发布的Gbot似乎正是这一交叉领

学习笔记TF061:分布式TensorFlow,分布式原理、最佳实践

分布式TensorFlow由高性能gRPC库底层技术支持.Martin Abadi.Ashish Agarwal.Paul Barham论文<TensorFlow:Large-Scale Machine Learning on Heterogeneous Distributed Systems>. 分布式原理.分布式集群 由多个服务器进程.客户端进程组成.部署方式,单机多卡.分布式(多机多卡).多机多卡TensorFlow分布式. 单机多卡,单台服务器多块GPU.训练过程:在单机单GPU训练,

10 ways to improve your programming skills

http://rudyn.is-programmer.com/ 1. Learn a newprogramming language学习一门新的编程语言 Learning new programming languages will expose you to new ways ofthinking; especially if the new language uses a paradigm which you aren't yetfamiliar with. Many of the ways

一种并行随机梯度下降法

  本文是读完 Jeffrey Dean, Greg S. Corrado 等人的文章 Large Scale Distributed Deep Networks (2012) 后的一则读书笔记,重点介绍在 Google 的软件框架 DistBelief 下设计的一种用来训练大规模深度神经网络的随机梯度下降法 - Downpour SGD,该方法通过分布式地部署多个模型副本和一个"参数服务器",同时实现了模型并行和数据并行,且对机器失效问题具有很好的容错性.结合 Adagrad 自适应

并行随机梯度下降

  Martin A. Zinkevich 等人(Yahoo.Lab)合作的论文 Parallelized Stochastic Gradient Descent 中给出了一种适合于 MapReduce 的并行随机梯度下降法,并给出了对应的收敛性分析.这里忽略理论部分.依据自己的理解给出文中所提并行随机梯度下降法的描写叙述. 作者: peghoty 出处: http://blog.csdn.net/itplus/article/details/33729199 欢迎转载/分享, 但一定要注明文章

cuda并行编程之求解ConjugateGradient(共轭梯度迭代)丢失dll解决方案

在进行图像处理过程中,我们经常会用到梯度迭代求解大型现在方程组:今天在对奇异矩阵进行求解的时候,出现了缺少dll的情况: 报错如下图: 缺少cusparse32_60.dll 缺失cublas32_60.dll 解决方案: (1)将cusparse32_60.dll和cublas32_60.dll直接拷贝到C:\Windows目录,但这样在一直的时候,还会出现同样错误,为了避免麻烦,最好采用方法(2) (2)将cusparse32_60.dll和cublas32_60.dll拷贝到你所在项目的文

梯度下降法的变形 - 随机梯度下降 -minibatch -并行随机梯度下降

问题的引入: 考虑一个典型的有监督机器学习问题,给定m个训练样本S={x(i),y(i)},通过经验风险最小化来得到一组权值w,则现在对于整个训练集待优化目标函数为: 其中为单个训练样本(x(i),y(i))的损失函数,单个样本的损失表示如下: 引入L2正则,即在损失函数中引入,那么最终的损失为: 注意单个样本引入损失为(并不用除以m): 正则化的解释 这里的正则化项可以防止过拟合,注意是在整体的损失函数中引入正则项,一般的引入正则化的形式如下: 其中L(w)为整体损失,这里其实有: 这里的 C