Я пытаюсь оптимизировать код, основанный на шаге интенсивного распространения памяти между двумя массивами. Одной из возможных оптимизаций является использование указателей на фактические массивы и их замена вместо замены самих массивов.
Во время процесса я немного сомневался, правильно ли я это делаю.
Вот урезанная версия того, что я сделал:
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
Фактический код компилируется и запускается без ошибок. Выходные данные кажутся правильными, и ускорение по сравнению с заменой массива есть.
Правильна ли моя реализация в целом? Есть ли какие-то предостережения, о которых я должен знать? Что я должен делать по-другому?