Правильна ли моя реализация подстановки указателей в Фортране? - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь оптимизировать код, основанный на шаге интенсивного распространения памяти между двумя массивами. Одной из возможных оптимизаций является использование указателей на фактические массивы и их замена вместо замены самих массивов. Во время процесса я немного сомневался, правильно ли я это делаю.

Вот урезанная версия того, что я сделал:

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

Фактический код компилируется и запускается без ошибок. Выходные данные кажутся правильными, и ускорение по сравнению с заменой массива есть. Правильна ли моя реализация в целом? Есть ли какие-то предостережения, о которых я должен знать? Что я должен делать по-другому?

...