Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance “时间比较”;至于;Matlab中的环路与倍频程_Performance_Matlab_Octave_Memory Alignment - Fatal编程技术网

Performance “时间比较”;至于;Matlab中的环路与倍频程

Performance “时间比较”;至于;Matlab中的环路与倍频程,performance,matlab,octave,memory-alignment,Performance,Matlab,Octave,Memory Alignment,刚才,我才知道Matlab&Octave使用了column major Fortran、OpenGL和OpenGL ES、MATLAB、, GNU八度音阶,R,Julia,Rasdaman和Scilab 所以我只是在检查Matlab和倍频程中的“for-loop”速度。结果如下: Matlab >> x = rand(10000); >> tic; for i=1:10000 for j=1:10000 k=x(i,j); end; end; toc; % row-maj

刚才,我才知道Matlab&Octave使用了column major

Fortran、OpenGL和OpenGL ES、MATLAB、, GNU八度音阶,R,Julia,Rasdaman和Scilab

所以我只是在检查Matlab和倍频程中的“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.
两种情况下的结果相同。

问题:
为什么行主循环和列主循环在八度音阶中的表现相似,尽管它使用了列主循环?

为了进一步阐述我的评论,我将发布一个答案。但我不是这方面的专家

首先,在Matlab中使用
feature accel off
运行测试以禁用JIT编译,返回的结果与Octave的结果大致相同。因此,Matlab和倍频程之间的速度提高是由于Matlab的JIT编译,它必须对循环进行矢量化

其次,Matlab的JIT编译版本对于列优先比行优先更快的原因是因为Matlab是列优先的,这是有道理的

然后,对于没有JIT编译的Octave和Matlab,列第一次求值只是稍微快一点。由于每个值都是从随机矩阵中单独提取出来的,我可以理解为什么这样做会很慢,但不能理解为什么行和列之间首先会有很大的差异


希望这会有所帮助,也许其他人可以扩展/改进这一点,或者发布一个真正的答案

如果您尝试对整个列或行进行操作,您将看到不同。在MATLAB和Octave中尝试以下代码:

%% Columns
a = rand(n);
b = zeros(n,1);
tic
for ii = 1:n
  b = b + a(:,ii);
end
t1 = toc

%% Rows:
a = rand(n);
b = zeros(1,n);
tic
for ii = 1:n
  b = b + a(ii,:);
end
t2 = toc
在我的计算机上,它提供:

%% MATLAB:
t1 =  0.0287
t2 =  0.3778

%% Octave*:
t1 =  0.089480
t2 =  0.20313
现在,在倍频程上的差异并没有在MATLAB中那么大,但在倍频程上仍然是一个显著的差异(速度是MATLAB的两倍多)

David已经发布了一个关于JIT编译的答案,所以我将跳过这一部分


*我没有可用的八度音阶,所以我必须测试它

这也许可以解释一些事情,特别是Octave缺乏JIT:我已经看到了这个链接。它让我们了解了为什么Matlab循环比倍频程快得多(10000x1000 v/s为0.5秒,倍频程为5000x5000 v/s为78秒),但我想没有提到我的问题。在
功能加速关闭
的情况下再次运行测试,我看不到行或列的第一个版本之间有什么真正的区别(与您的倍频程结果非常相似).所以JIT编译是时间上的差异,我猜非矢量化循环与JIT编译器使用的矢量化版本相比,不依赖于矩阵的访问方式。哦,那很酷。但是,为什么Matlab和倍频程没有差异?我的意思是,无论如何,列式循环应该更快,对吗?+1作为答案.但我仍然不明白为什么没有JIT就没有区别。我认为这只是因为每次循环迭代,Matlab/Octave都必须去检索矩阵的单个元素,用它进行计算,然后检索下一个元素。它不是将矩阵的列加载到缓存中并使用每个元素,而是加载单个e元素,然后移除它们,然后将下一个元素加载到缓存中。