【发布时间】:2017-05-14 11:39:56
【问题描述】:
我有 MATLAB 2016a 在 Win 10 机器上运行,配备库存 i5 2500K 和 2 GTX 970。我是 GPU 计算的新手,我正在探索如何使用我的 GPU 加快计算速度。
所以我运行以下简单代码:
clear;
A = randn(1000,1);
B = randn(100,1);
n = 10000;
gA = gpuArray(A);
gB = gpuArray(B);
myfunc = @(a,b)(a.*b);
tic;
for i = 1:n
C = bsxfun(myfunc,A,B');
end
disp(toc);
tic;
for i = 1:n
C = gather(bsxfun(myfunc,gA,gB'));
end
disp(toc);
我分别得到 8.2(秒)和 321.3864(秒)。
clear;
A = randn(1000,1);
B = randn(100,1);
n = 10000;
gA = gpuArray(A);
gB = gpuArray(B);
myfunc = @(a,b)(a.*b);
tic;
parfor i = 1:n
C = bsxfun(myfunc,A,B');
end
disp(toc);
tic;
parfor i = 1:n
C = gather(bsxfun(myfunc,gA,gB'));
end
disp(toc);
(区别:for --> parfor)。我得到了 2.7(秒)和 6.3(秒)。
为什么 GPU 方法在这两种情况下都比较慢? 在我的工作中,myfunc 要复杂得多。我已经定义了它,以便它可以很好地与非 GPU bsxfun 一起工作,但是当我像上面所做的那样进行 GPU 化时,我遇到了错误 Use of functional workspace is not supported.(在我的工作中,myfunc 是在内部和parfor 循环的开始。)你能否解释一下这个错误是什么意思?
【问题讨论】:
-
首先,这个问题应该发到Code Review。其次,您正在做一些次优的事情。最重要的是:
C = gather(bsxfun(myfunc,gA,gB'));主要是计算从 GPU 内存到 RAM 的数据传输时间。计算仍然在 GPU 上完成。我会尝试写一个更长的答案。 -
@Dev-iL 感谢 Dev,特别是下面的答案。我也没有意识到存在 Code Review SE。 :)
-
这与代码审查无关。您在代码审查需要真正处理的地方呈现高度简化的代码。您也对优化不感兴趣,但更关心为什么某些东西比其他东西更快。那是代码解释,众所周知,我们不愿意接受的另一件事。最重要的是,您会遇到错误,这会使此代码被视为已损坏。请在Code Review on-topic help centre 发帖之前查看更多信息。
-
@Mast 感谢您的澄清。今后我会更加谨慎地处理我的建议。
标签: matlab performance gpgpu parfor bsxfun