Matlab 矢量化代码的GPU优化

Matlab 矢量化代码的GPU优化,matlab,vectorization,gpu,Matlab,Vectorization,Gpu,这段代码实现了oja的规则,运行速度很慢。我无法再将其矢量化了。为了让它运行得更快,我想在GPU上进行计算,因此我改变了 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, ... 'd

这段代码实现了oja的规则,运行速度很慢。我无法再将其矢量化了。为了让它运行得更快,我想在GPU上进行计算,因此我改变了

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
但是代码运行得比较慢。使用的计算似乎与GPU兼容。请让我知道我的错误

配置文件代码输出:

完整详情:
这并不是一个关于如何解决这个问题的完整答案,而是一个解释,解释了为什么GPU没有加速,但实际上大大降低了代码的速度

GPU在加速并行代码方面非常出色,这意味着它们可以同时做很多事情(即,我的GPU可以同时做30070件事情,而现代CPU不能超过16件)。然而,GPU处理器非常慢!如今,一个像样的CPU有2~3Ghz的速度,而现代的GPU有700Mhz的速度。这意味着CPU比GPU快得多,但由于GPU可以在同一时间做很多事情,所以它们可以赢得总体冠军

有一次我看到它被解释为:你更喜欢什么,一辆百万美元的跑车还是一辆小型摩托车?一辆百万美元的汽车还是一千辆小型摩托车?如果你的工作是送比萨饼呢?希望你在最后一个问题上回答了一千辆摩托车(除非你是一个摩托车迷,你回答了所有的摩托车,但这不是重点)

回到你的代码:你的代码是难以置信的顺序。每个内部迭代都依赖于前一个迭代,外部迭代也是如此。您不能并行运行其中的两个,因为您需要一个迭代的结果来运行下一个迭代。这意味着,在你交付最后一份比萨饼之前,你不会收到比萨饼订单,因此你想要的是以尽可能快的速度一个接一个地交付(所以跑车更好!)

事实上,这些单线方程的速度都非常快!如果我在我的计算机上运行50次,我在这条线上得到13.034秒,即每次迭代(7680000次调用)1.69微秒

因此,您的问题不是代码太慢,而是多次调用它。GPU不会加速这一行代码,因为它已经非常快了,我们知道CPU在这方面比GPU快

因此,不幸的是,GPU不适合顺序代码,并且您的代码是非常顺序的,因此您不能使用GPU来加速。HPC也没有帮助,因为每个循环迭代都依赖于前一个循环(no
parfor
:())


所以,据我所知,你需要处理它。

记住早期优化是万恶之源。你能分析你的代码吗?哪部分是最慢的部分?你能发布MATLABs profiler的结果吗?@AnderBiguri Hi,谢谢你的回复!现在请检查有问题的分析代码输出。你是对的。在这里避免使用GPU,因为它会导致go难以置信的慢,我有一个特斯拉k40。你的内部循环中有一个串行依赖项-在每次迭代中,
w
的结果取决于上一次迭代中
w
的值。因此,你没有并行化!Abhishek Bhatia,@PaulR是正确的。你依赖于在cur中使用上一次迭代的计算租用迭代。你不能使你的循环并行。谢谢你的详细回答。我想知道是否可以以某种方式对它进行更多的向量化以减少调用。迭代之间的依赖性限制了我。@AbhishekBhatia正如你所说,依赖性限制了你。我试着想一个向量化的代码,但实际上这个等式已经以非常高的速度计算出来了y高速。老实说,我不认为有任何方法可以加快速度。是的,你是对的。我想减少函数调用。他们可能会加快速度。@AbhishekBhatia然后减少迭代次数。
X=gpuArray(X)