Erlang实现的矩阵相乘C=A*B单线程与并行多线程性能对比
来源:互联网 发布:淘宝家装基金是什么 编辑:程序博客网 时间:2024/05/18 02:08
-module(new).
-export([]).
-compile(export_all).
%% ====================================================================
%% Internal functions
%% ====================================================================
%%测试入口
test() ->
A = generateMatrix(50,300),
B = generateMatrix(300,30),
{Time,Value} = timer:tc(new,matrixMultiply,[A,B]),
io:format("Single Thread:~p[ms]~n",[Time/1000]),
{Time1,Value1} = timer:tc(new,multiThread,[A,B]),
io:format("Multi Thread:~p[ms]~n",[Time1/1000]).
%% 随机产生M*N矩阵
generateMatrix(M,N) ->
row(M,N,[]).
row(M,N,Result) ->
case 0 =:= M of
true -> Result;
false -> row(M-1,N,Result++[column(N,[])])
end.
column(N,Result) ->
case 0 =:= N of
true -> Result;
false -> column(N-1,Result++[random:uniform(1000)])
end.
%% 单线程
matrixMultiply(A,B) ->
R = lists:foldl(fun(Element,Acc) -> Acc++[rowMultiplyColumn(Element,B,[],1)] end, [], A),
io:format("~w~n",[R]).
%% 多线程
multiThread(A,B) ->
P = self(),
%% 启动矩阵A的行数个进程,分别发送A的每一行,计算A的每一行与矩阵B的乘积
lists:foldl(fun(Element,Acc) -> spawn(fun() -> P! {self(),Acc,rowMultiplyColumn(Element,B,[],1)} end) end, 1, A),
%% 接收,当前进程如果收到了A行数个消息,表明已经计算完毕
loop(length(A)).
%% 统计当前进程是否已经收到了Count条消息
loop(Count) ->
receive
{Pid,N,Result} ->
%% io:format("Count=~p,Message=~w~n",[Count,{Pid,N,Result}]),
case 1=:= Count of
true -> io:format("Compute end~n");
false -> loop(Count-1)
end
end.
%%@author zcc
%%@date 2014-04-16
%%@param A,B:list;Result:存放结果,初始为[];Count:控制列数,初始为1;Result:存放结果,初始为[]
%%将某一行A与矩阵B相乘,得出一组向量
rowMultiplyColumn(A,B,Result,Count) ->
case Count =:= length(lists:nth(1,B))+1 of
true -> Result;
false ->
rowMultiplyColumn(A,B,Result ++ [multiply(A,getMatrixColumn(B,Count),0)],Count+1)
end.
%% 得到矩阵B的第Num列
getMatrixColumn(B,Num) ->
lists:foldl(fun(A,Acc) -> Acc++[lists:nth(Num, A)] end, [],B).
%% 计算两个向量List的数量积
multiply([H1|T1],[H2|T2],Sum) when length(T1) =:= length(T2) ->
multiply(T1,T2,Sum+H1*H2);
multiply([],[],Sum) -> Sum.
%% 计算两个向量积的另一种方法
%% multiplyAndSum(A,B,Result,Count) when length(A) =:= length(B) ->
%% case 0 =:= Count of
%% true -> Result;
%% false ->
%% Sum = Result ++ lists:nth(Count,A)*lists:nth(Count, B),
%% multiplyAndSum(A,B,Sum,Count-1)
%% end.
%% 总结:(1)erlang多进程的消息交互
%% (2)如何统计erlang进程邮箱中接收到消息的数量,本例中的loop方法
%% (3)erlang递归计数问题词的训练
- Erlang实现的矩阵相乘C=A*B单线程与并行多线程性能对比
- 分享矩阵乘法单线程与多线程的Java实现与效率对比,请教Strassen算法
- Linux下利用多线程实现矩阵相乘的并行计算
- Java多线程与单线程性能对比
- 二维矩阵相乘的串行和并行实现
- Java之矩阵相乘(A=A*B)
- 多线程同步与单线程异步对比
- 多线程同步与单线程异步对比
- 转置矩阵的分块并行乘法(C语言实现),计算矩阵C[rawn][rawn]=A[rawm][rawn]'*B[rawm][rawn],子块大小为S*T,其算法实现原理参加本代码的附件。
- C语言 矩阵的相乘实现
- 矩阵相乘的C代码实现
- 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- java实现矩阵乘法public class MatrixMultiply { //A=A*B 将相乘的结果赋给A public static void Multiply(double[][
- eventlet引发的学习:python:单线程、多线程、多进程在计算方面的性能对比
- eventlet引发的学习-python:单线程、多线程在IO两方面的性能对比
- Linkedlist与ArrayList的各种操作性能对比-单线程对比
- C语言实现矩阵相乘
- C语言实现矩阵相乘
- linux配置选项详解
- poj2446 && poj1469 二分图最大匹配
- Linux下查找文件详解
- mysql笔记
- Linux平台下利用JNI+双向RMI实现远程推送
- Erlang实现的矩阵相乘C=A*B单线程与并行多线程性能对比
- 学习Opencv——图像金字塔
- python中变量的特点
- 常见开源协议名词解释
- uiautomator中的UiDevice学习笔记(1)
- 类的构造函数与析构函数
- JSplitPane详解 (查找了很久,感觉这个写的最好,收藏下来)
- 0416学习
- ultraEdit 给您带来不便,我们深感抱歉 但是,您的激活存在问题!