我正在尝试优化一个代码,该代码依赖于两个阵列之间的内存带宽密集型传播步骤。一种可能的优化方法是使用指向实际数组的指针并交换它们,而不是交换数组本身。 在此过程中,我不确定自己是否做对了。
这是我所做的精简版:
PROGRAM pointer_swap_minexample
implicit none
INTEGER, PARAMETER :: I4B = SELECTED_INT_KIND(9)
INTEGER, PARAMETER :: DP = KIND(1.0d0)
REAL(DP), DIMENSION(:), ALLOCATABLE, TARGET :: a, b
REAL(DP), DIMENSION(:), POINTER :: pa, pb
INTEGER(I4B), PARAMETER :: nmax = 1000
INTEGER(I4B), PARAMETER :: tmax = 1000
INTEGER(I4B) :: n, t
allocate(a(nmax), b(nmax))
a(:) = 0.0_dp
b(:) = 0.0_dp
pa => a
pb => b
do t=1, tmax
!=========================!
! heavy lifting goes here !
!=========================!
if(mod(t,2) .EQ. 1) then
pa => b
pb => a
else
pa => a
pb => b
end if
end do
END PROGRAM pointer_swap_minexample
实际代码可以编译并运行,没有错误。与阵列交换相比,输出似乎是正确的,加速比更高。 我的实现总体上正确吗?我需要注意一些警告吗?我应该做些不同的事情吗?