我在Fortran中实现的指针交换是否正确?

时间:2019-06-05 11:20:48

标签: pointers fortran swap

我正在尝试优化一个代码,该代码依赖于两个阵列之间的内存带宽密集型传播步骤。一种可能的优化方法是使用指向实际数组的指针并交换它们,而不是交换数组本身。 在此过程中,我不确定自己是否做对了。

这是我所做的精简版:

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

实际代码可以编译并运行,没有错误。与阵列交换相比,输出似乎是正确的,加速比更高。 我的实现总体上正确吗?我需要注意一些警告吗?我应该做些不同的事情吗?

0 个答案:

没有答案