网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月04日
漏签
0
天
人工智能吧
关注:
113,255
贴子:
503,822
看贴
图片
吧主推荐
视频
游戏
6
回复贴,共
1
页
<<返回人工智能吧
>0< 加载中...
Matlab并行计算随记
取消只看楼主
收藏
回复
k4487759
铁皮人
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
度
k4487759
铁皮人
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
正在摸索多GPU并行计算,随记一些无逻辑的笔记,后期再总结整理。
k4487759
铁皮人
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
1、代码生成器转化为gpu arraryfun的案例
>> M = [
1 0.5
0.5 1];
>> syms a b
>> f = matlabFunction([a, b] * M * [a; b])
f =
@(a,b)a.*(a+b.*(1.0./2.0))+b.*(a.*(1.0./2.0)+b)
%%定义符号和常数矩阵,通过matlabFunction进行代码生成。
tic
x1 = gpuArray.linspace(-1, 1, 1024)';
x2 = gpuArray.linspace(-1, 1, 1024);
P = bsxfun(f, x1, x2);
toc
%%给a b变量(x1,x2)送入显存,代入代码生成器生成的运算,完成GPU加速计算。
k4487759
铁皮人
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
楼上摘自GPU Powered Matlab(五)——委婉的表达方式
(2013-04-15 13:00:52)
k4487759
铁皮人
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3楼的评述:利用符号函数和代码生成器生成运算代码,把函数输入变量送到显存,使用GPU支持的bsxfun arraryfun 之类数组函数完成,非常方便。
思考:多GPU形式。
k4487759
铁皮人
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
2、利用多个lib分别调用多个gpu完成并行计算。
matlabpool 2
spmd
gpuDevice
end
spmd
if labindex ==1
gpuDevice(1);
输入需要的gpu计算代码
else
gpuDevice(2);
输入需要的gpu计算代码
end
end
spmd
gpuDevice
end
原理:每个lib执行一个进程,每个进程均调用一个gpu。
k4487759
铁皮人
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
坑既然开了 继续补充点东西。一个有意思的案例,按照6楼的初始化方法:
使用多GPU加速时,开启两个cpu线程的pool,每个pool控制一个GPU核心
matlabpool 2
spmd
gpuDevice;
end
然后进行并行计算加速,执行的是很简单的排序算法,对rechen中的每一列进行排序
parfor ii=1:l
Grechen=gpuArray(rechen(:,ii));
[Ga,~]=sort(Grechen);
% A=gather(Ga)
end
程序能顺利执行,然而程序的输出Ga不见鸟。所说的不见鸟是彻底不见鸟,不仅工作组变量没有,利用注释中的那一行指令来gather也提示没有变量,何解????
答案:
如果单独考虑并行计算,不使用[Ga,~]=sort(Grechen);这个指令生成了并行池中的全局变量,可以用gather传递成普通变量。然而Grechen放入了显存,又GPU完成运算,Ga就变成了并行池中的GPU临时变量。要想把它取回内存,首先需要把传递回GPU全局变量,注意这个GPU全局变量也是被参与并行池,然后才能用gather传递给内存。
直观的,内存的a和Ga之间的关系是 a存入显存变为GPU变量Ga,显存中的Ga参与并行计算,被cpu分配到多个cpu核心和gpu的显存中,形成并行变量。Ga这个变量和内存变量之间存在两层转换关系,所以需要借助一个全局GPU变量传递才行。这个全局GPU变量与Ga的对应关系相当于“内存变量与之对应的并行变量”之间的关系。
因此,在其中一个GPU中定义A=gpuArray.ones(size(rechen)); A是GPU全局变量,Ga即可赋值给A,相当于并行变量传递数据给全局变量。然后gather(A)即可将A传递给内存。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示