我需要一个尺寸为100000 x 2的数组。在Fortran 90/95中以下列格式之一声明一个数组是否可以获得性能优势(
案例(i):
real, dimension(100000,2) :: A
或案例(ii):
real, dimension(2,100000) :: B
我认为由于Fortran的列主要存储顺序,情况(ii)会有优势。我运行了一些测试用例,结果与预期一致,但时间差异很小。我希望有人在有和没有ifort的矢量化的情况下确认这一点。 我用于测试用例的编译器标志是 -no-vec 用于禁用矢量化,而 -vec-report3 用于报告生成。
答案 0 :(得分:3)
在您的情况下,数组的排序如下:
A(1, 1) A(2, 1) A(3, 1) ... A(100000, 1) A(1, 2), A(2, 2) ... A(100000, 2)
B(1, 1) B(2, 1) B(1, 2) B(2, 2) ... B(1, 100000), B(2, 100000)
什么更好取决于你想用它做什么:
mean(A(:, 1)) + mean(A(:, 2))
比
快mean(B(1, :)) + mean(B(2, :))
因为在A
中,它可以同时读取很多值,而对于B
,它必须跳过每秒的值,然后返回。
<强>但是强>
do i = 1, 100000
C(i) = A(i, 1) - A(i, 2)
end do
可能比
慢do i = 1, 100000
C(i) = B(1, i) - B(2, i)
end do
因为对于B
,它可以按顺序读取值,而对于A
,它必须每次跳转并返回100000个值。