与gpuArray迭代解算器

7视图(30天)
法比奥Freschi
法比奥Freschi 2014年9月16日
回答: 神骑士 2015年9月7日
你好,
在某些情况下,使用迭代解决是有用的也有完整的矩阵,这是我的情况。我想使用一个迭代解算器像gmr完整矩阵在矩阵和RHS gpuArrays,但是看起来这不是2013提供了Matlab。
我的数据是
> > n = 1024;
> > Acpu =兰德(n) + 100 *眼(n);
> > bcpu =兰德(n, 1);
> > Agpu = gpuArray (Acpu);bgpu = gpuArray (bcpu);
我试过
> > x = gmr (Agpu bgpu, []);
错误使用iterchk(39)行
论点必须是一个浮点矩阵或一个函数处理。
错误在巨磁电阻(86行)
[atype, afun afcnstr] = iterchk(一个);
> > x = gmr (@ (x) (Agpu * x) bgpu, []);
错误发生后从gpuArray双:
转换从gpuArray翻倍是不可能的
错误在巨磁电阻(297行)
U (: 1) = U;
我发现的唯一途径,使其工作
> > x = gmr (@ (x)收集(Agpu * x), bcpu, []);
巨磁电阻聚集在迭代7与相对剩余2.4 e-07解决方案。
非常丑是因为GPU的矩阵向量乘积不断交换系统内存。任何建议用gmr GPU使用MATLAB内置函数?
提前谢谢法比奥
2的评论
法比奥Freschi
法比奥Freschi 2014年9月16日
没有2013年在Matlab中实现。如果我超过我内存不足很快GPU内存(12 gb在我的例子中,特斯拉K40)

登录置评。

接受的答案

马特·J
马特·J 2014年9月16日
编辑:马特·J 2014年9月16日
大小甚至更大的问题(n = 10240)和一个新的显卡(GTX 580),我看到开销可以忽略不计,CPU和GPU之间的交换,
n = 1024 * 10;
Acpu =兰德(n) + 100 *眼(n);
bcpu =兰德(n, 1);
Agpu = gpuArray (Acpu);
bgpu = gpuArray (bcpu);
gputimeit (@ () Agpu * bgpu)在gpu %所有数据
% 0.0052秒
gputimeit(@()收集(Agpu * bcpu))%要求数据传输
% 0.0054秒
加速在gmr似乎也不错(4)倍
抽搐;
x = gmr (@ (x) Acpu * x, bcpu, []);
toc
%运行时间是0.391786秒。
抽搐;
x = gmr (@ (x)收集(Agpu * x), bcpu, []);
toc
%运行时间是0.097924秒。
5个评论
法比奥Freschi
法比奥Freschi 2014年9月16日
编辑:法比奥Freschi 2014年9月16日
后建议在Mathworks网站:
> > gd = gpuDevice;
> >抽搐;我= 1:10 0,x = Agpu * bgpu;结束;等待(gd);toc
运行时间是0.537721秒。
> >抽搐;我= 1:10 0,x =收集(Agpu * bgpu);结束;等待(gd);toc
运行时间是0.547418秒。
按照你的实验
编辑:我现在看到你的评论与这类似的实现

登录置评。

答案(1)

神骑士
神骑士 2015年9月7日
如果你下载R2015b释放MATLAB(发布于9月3日)你会发现 巨磁电阻 对稀疏gpuA万博1manbetxrrays现在支持,包括支持一个稀疏矩阵预处理。看到 //www.tianjin-qmedu.com/help/distcomp/release-notes.html

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!