行优先机制的编译器,比如C/C++,CUDA,python等,意思为优先保留第1行的所有元素,以此类推。
列优先机制的编译器,比如Fortune, Matlab等,意思为优先保留第1列的所有元素,以此类推。
如何应用?
就是内层循环尽量用连续的数据。
比如行优先的编译器,a(i,j),循环的时候内层为列,外层为行,寻址速度更快,因为数据连续。
而列优先的编译器,内层仍然为列的话,寻址是错开的,会带来额外的时间开销。
另外matlab默认行矩阵。
一个简单的matlab测试案例如下:
function test_for_cycle()
data = ones(1000, 30, 4);
sum =0;
tic;
for i=1:size(data,1)
for j=1:size(data,2)
for k=1:size(data,3)
sum = sum+data(i,j,k);
end
end
end
toc;
sum =0;
tic;
for k=1:size(data,3)
for j=1:size(data,2)
for i=1:size(data,1)
sum=sum+data(i,j,k);
end
end
end
toc;
end
测试结果如下:
由此可得,在Matlab的循环运算里,尽量把A(i,j,k)的i放在内圈,运算效率差10倍;而C语言则相反,把k放在内圈加速运行。