Otimização de GPU para código vetorizado
function w=oja(X, varargin)
% get the dimensionality
[m n] = size(X);
% random initial weights
w = randn(m,1);
options = struct( ...
'rate', .00005, ...
'niter', 5000, ...
'delta', .0001);
options = getopt(options, varargin);
success = 0;
% run through all input samples
for iter = 1:options.niter
y = w'*X;
for ii = 1:n
% y is a scalar, not a vector
w = w + options.rate*(y(ii)*X(:,ii) - y(ii)^2*w);
end
end
if (any(~isfinite(w)))
warning('Lost convergence; lower learning rate?');
end
end
size(X)= 400 153600
Esse código implementa a regra do oja e fica lento. Não sou mais capaz de vetorizá-lo. Para acelerar, eu queria fazer cálculos na GPU, portanto mudei
X=gpuArray(X)
Mas o código ficou mais lento. O cálculo usado parece ser compatível com a GPU. Por favor, deixe-me saber o meu erro.
Detalhes completos:https://drive.google.com/file/d/0B16PrXUjs69zRjFhSHhOSTI5RzQ/view?usp=sharing