【发布时间】:2014-03-28 03:44:34
【问题描述】:
刚刚,我才知道 Matlab & Octave 使用的是来自Wikipedia 的 column-major。
在 Fortran、OpenGL 和 OpenGL ES、MATLAB、 GNU Octave、R、Julia、Rasdaman 和 Scilab。
所以我只是在 Matlab 和 Octave 中检查“for loop”的速度。结果如下:
Matlab
>> x = rand(10000);
>> tic; for i=1:10000 for j=1:10000 k=x(i,j); end; end; toc; % row-major
Elapsed time is 2.320215 seconds.
>> tic; for i=1:10000 for j=1:10000 k=x(j,i); end; end; toc; % column-major
Elapsed time is 0.433013 seconds.
正如预期的那样,列优先顺序比行优先顺序更快。
八度
> x=rand(5000);
> tic; for i=1:5000 for j=1:5000 k=x(i,j); end; end; toc; % row-major
Elapsed time is 77 seconds.
> tic; for i=1:5000 for j=1:5000 k=x(j,i); end; end; toc; % column-major
Elapsed time is 78 seconds.
两种情况的结果相同。
问题: 为什么行优先和列优先循环在 Octave 中执行相似,尽管它使用列优先对齐?
【问题讨论】:
-
这可能解释了一些问题,尤其是 Octave 缺少 JIT:stackoverflow.com/questions/12569351/…
-
我已经看过那个链接了。它解释了为什么 Matlab 循环比 octave 快得多(10000x10000 为 0.5 秒,而 Octave 中 5000x5000 为 78 秒),但我认为没有提及我的问题。
-
使用
feature accel off再次运行您的测试我发现行优先版本或列优先版本之间没有真正的区别(与您的 Octave 结果非常相似)。所以 JIT 编译是时间上的差异,我猜非向量化循环不像 JIT 编译器使用的向量化版本那样依赖于矩阵的访问方式。 -
哦,那太酷了。但同样,为什么 Matlab 和 Octave 没有区别?我的意思是,无论如何,按列循环应该更快,对吧?
标签: performance matlab octave memory-alignment