【问题标题】:For loop seems to be faster than a matrix operationFor 循环似乎比矩阵运算更快
【发布时间】:2019-03-22 21:38:57
【问题描述】:

我已经在 logits 上工作了一段时间,我需要使用内置的 exp() 函数。与使用具有较小块相同矩阵的 for 循环相比,对于大型矩阵,这似乎运行得更慢。

在 Matlab 文档和其他几种形式中,始终建议对代码进行矢量化以加快速度。但这里似乎不是这样。

n = 32;
rows = 50000;
cols = 32;

a = rand(n*rows, cols);
b = rand(rows, cols);

% in a loop
tic
for i=1:n 
   d = exp(b);
end
toc

% big matrix
tic
d = exp(a);
toc

我预计第一个 tic-toc 会比第二个慢。但我得到的输出如下:

Elapsed time is 0.335781 seconds.
Elapsed time is 0.390191 seconds.

任何关于为什么会这样的想法都会有所帮助。

编辑 1 假设我像这样编辑我的代码以便每次都使用随机值:

n = 32;
rows = 50000;
cols = 32;

% in a loop
tic
for i=1:n 
   d = exp(rand(rows, cols));
end
toc

% big matrix
tic
e = exp(rand(n*rows, cols));
toc
return

我仍然得到:

Elapsed time is 0.745808 seconds.
Elapsed time is 0.847162 seconds.

【问题讨论】:

    标签: matlab performance exp


    【解决方案1】:

    您没有进行公平的比较:与读取更大内存块并写入更大的内存块。从主内存读取是一个瓶颈,因此能够利用缓存有助于加快“循环”代码。

    这是一个更公平的比较:

    rows = 32*50000;
    cols = 32;
    
    a = rand(rows, cols);
    
    % in a loop
    tic
    d = zeros(size(a));
    for i=1:cols
       d(:,i) = exp(a(:,i));
    end
    toc
    
    % big matrix
    tic
    d = exp(a);
    toc
    

    我明白了(MATLAB R2019a Online):

    Elapsed time is 0.208699 seconds.
    Elapsed time is 0.140489 seconds.
    

    所以循环慢。但这并没有那么慢。在过去 15 年左右的时间里,MATLAB 一直在稳步改进他们的 JIT。在他们引入 JIT 之前,循环代码很容易慢 100 倍左右。

    注意:始终确保至少运行两次计时脚本,放弃第一次计时。第一次运行某些代码时,JIT 需要对其进行编译,从而增加测量的时间。


    关于编辑 1

    在这里,您仍在处理“循环”情况下的较小数组。没有太大变化,只是您将 rand 调用移到了循环内。临时内存被重复使用。

    【讨论】:

    • 我理解你的意思,但我觉得由于较小的矩阵仍然运行 n 次,它应该慢得多。读写操作不会重复多次吗?
    • @ChaitanyaBaweja:我认为那里没有太大变化。查看我的编辑。
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2017-08-06
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多