【发布时间】:2014-10-17 14:01:07
【问题描述】:
当我运行下面显示的代码时,函数内的 tic/toc 对显示遍历所有行需要很短的时间(
tic
rnn.v = 11;
rnn.h = 101;
rnn.o = 7;
rnn.h_init = randn(1,rnn.h,'gpuArray');
rnn.W_vh = randn(rnn.v,rnn.h,'gpuArray');
rnn.W_hh = randn(rnn.h,rnn.h,'gpuArray');
rnn.W_ho = randn(rnn.h,rnn.o,'gpuArray');
inData.V = randn(10000,11,100,'gpuArray');
inData.TimeSteps =100;
inData.BatchSize = 10000;
[H,OX] = forward_pass(rnn, inData)
toc
rnn和inData中的所有矩阵都是gpuArray,所以所有的计算都是在GPU中进行的。输出也是 gpuArray。
function [H,OX] = forward_pass(rnn, inData)
tic;
%initial hidden state values
H_init = gpuArray(repmat(rnn.h_init,[inData.BatchSize,1]));
%initialize state H
H = zeros(inData.BatchSize, rnn.h, inData.TimeSteps,'gpuArray');
%initialize OX (which is H * Who)
OX = zeros(inData.BatchSize, rnn.o, inData.TimeSteps,'gpuArray');
for t = 1 : inData.TimeSteps
if t == 1
HX_t = H_init * rnn.W_hh...
+ inData.V(:,:,t) * rnn.W_vh;
else
HX_t = H(:,:,(t-1)) * rnn.W_hh...
+ inData.V(:,:,t) * rnn.W_vh;
end
H(:,:,t) = tanh(HX_t);
OX(:,:,t) = H(:,:,t) * rnn.W_ho;
end
toc;
end
通常,如果您使用gather() 函数,它会很慢。我没有使用gather() 函数将输出传输到工作区,我不知道为什么它仍然这么慢。看起来最后一行“结束”需要超过 2 秒。
有人知道如何加速函数调用吗?
【问题讨论】:
-
inData.V 是一个 10000x11x100 gpuArray。 rnn.W_vh 是 11x101 gpuArray,rnn.W_ho 是 101x7 gpuArray,H 是 10000x101x100 gpuArray,OX 是 10000x7x100 gpuArray。
-
rnn.v = 11; rnn.h = 101; rnn.o = 7; rnn.hid_nonlin = Tanh; rnn.h_init = 1x101 gpuArray; inData.BatchSize = 10000; inData.TimeSteps = 100;谢谢迪瓦卡!
-
对不起,我第一次来这个网站。我已经编辑了我的问题,因此您可以在本地计算机上复制和粘贴并运行代码。再次感谢!
标签: performance matlab function gpu