Утечка памяти в задании с использованием компилятора Intel Fortran

Рассмотрим следующий минимальный рабочий пример:

      module lib
    type FG_t
        real,allocatable::g(:)
    contains
        procedure,private::FG_Assign
        generic::assignment(=)=>FG_Assign
    end type
    interface operator(-)
        procedure FG_Sub
    end interface
contains
    elemental subroutine FG_Assign(this,that)
        class(FG_t),intent(inout)::this
        class(FG_t),intent(in)::that
        this%g=that%g
    end
    elemental type(FG_t) function FG_Sub(this,that)
        class(FG_t),intent(in)::this
        real,intent(in)::that
        FG_Sub=FG_t(this%g-that)
    end
end

program prog
    use lib
    type(FG_t)::arr(1000),arr_(SIZE(arr))
    do i=1,SIZE(arr)
        allocate(arr(i)%g(10))
    end do
    do i=1,100000
        arr_=arr-1.
    end do
end

При запуске исполняемого файла, созданного из кода с помощью ifx (2022.2.1), ifort (2021.7.1), nvfortran (22.9) или nagfor (7.1), память быстро заполняется (что может привести к сбою вашего ПК в случае большее количество итераций). Память против времени:

Использование gfortran (11.1.0) или замена ранееFG_assignсpureисправляет проблему для моей версии компилятора Intel (но не для компиляторов Nvidia и NAG). Однакоelementalключевое слово используется для присваивания в аналогичном контексте в коде Fortran stdlib.

Intel VTune Profiler показывает, что большая часть памяти выделена в строкеthis%g=that%gпослеFG_Subвызывается в строкеarr_=arr-1..

В чем причина этой проблемы, зависящей от компилятора, и есть ли способ ее избежать?

0 ответов

Другие вопросы по тегам