Недопустимая ошибка памяти при использовании openmp с gfortran - PullRequest
0 голосов
/ 18 октября 2019

У меня проблемы с некоторым кодом OpenMP:

------------------------------------------
kgalg.f90
------------------------------------------
program kgalg
    use potential
    use omp_lib
    implicit none

    ...

  call iteratekg(1.0D0 , 0.0D0)
    ...

    contains

    subroutine iteratekg(alpha , beta)
    ...
        !$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,iikkkmag,iixxx,iiphiphiphi,ind,newvalue,updatedind,interp,kk,weight,&
        !$OMP interyyy,interval,mult)
        !$OMP DO
        do ii = 1 , pot%product_size
            ...
            interp = new_product_interpolate(pot , updatedind) !!! <- line 160
            ...
        end do
        !$OMP END DO
        !$OMP BARRIER
        !$OMP END PARALLEL
    end subroutine iteratekg

end program kgalg

------------------------------------------
potential.f90
------------------------------------------
module potential
   use vecFunTools
   implicit none
    ...
contains
    ...
end module potential 

------------------------------------------
vecFunTools.f90
------------------------------------------
module vecFunTools
    implicit none

    type domain_type
    ...
    end type domain_type

    type product_type
        ...
        type(domain_type) , allocatable :: domains(:)
        ...
    end type product_type

    type prod_inter_type
        type(product_type) :: my_product
        ...
    end type prod_inter_type
    ... 

    contains

    type(prod_inter_type) function new_product_interpolate(prod , ind)
        type(product_type) :: prod
        integer , dimension(prod%nof_domains) :: ind
        ...
    end function new_product_interpolate
end module vecFunTools

При компиляции кода с помощью gfortran 7.4.0 все работает нормально, но при компиляции с помощью gfortran 4.8.4 я получаю следующую ошибку сегментации:

...
#4  0x4034C0 in iteratekg.1882._omp_fn.0 at kgalg.f90:160 (discriminator 17)
#5  0x401EAB in iteratekg at kgalg.f90:148
#7  0x4034AC in iteratekg.1882._omp_fn.0 at kgalg.f90:160 (discriminator 19)
#6  0x4016B1#8   in 0xkgalg7F4B75E8E349 at 
kgalg.f90:33 (discriminator 1)
...

Я всегда могу перейти на более новую версию gfortran, но было бы неплохо узнать, почему происходит сбой. Кстати, если я удаляю все из тела new_product_interpolate , чтобы эта функция ничего не делала и возвращала неинициализированный тип (prod_inter_type) Я все еще получаю проблемы, связанные с очисткой памяти.

Идеи или комментарии будут с благодарностью.

...