性能声明期间的数组索引排序

时间:2016-02-22 22:54:20

标签: fortran fortran90 gfortran intel-fortran

我需要一个尺寸为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 用于报告生成。

1 个答案:

答案 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个值。