使用对齐内存进行Fortran FFT(FFTW)而不会出现内存泄漏

问题描述 投票:1回答:1

我想使用FFTW的现代Fortran接口,但是允许简单的函数调用,如ifftshift(fft_c2c(vec)* exp(vec))等等。这是我对如何做到这一点的理解(我也明白,每次通话都做一个新计划并不是最有效的事情)。目前此代码功能正常(返回正确的结果);但是,存在内存泄漏,因此重复呼叫会导致丢失。我不太确定在哪里!我原本希望返回变量`fft'与唯一不同的内存的关联会导致没有泄漏,但这显然不是真的。我错过了什么,我怎样才能更好地构建我想用适当的现代堡垒做什么?谢谢!

function fft_c2c(x) result(fft)                                               
integer :: N                                                                
type(C_PTR) :: plan                                                         
complex(C_DOUBLE_COMPLEX), pointer :: fft(:)                                
complex(C_DOUBLE_COMPLEX), dimension(:), intent(in) :: x                    

! Use an auxiliary array that is allocated with fftw_alloc_complex          
! to ensure memory alignment for performance, see FFTW docs                 
complex(C_DOUBLE_COMPLEX), pointer :: x_align(:)                            
type(C_PTR) :: p                                                            

N = size(x)                                                                 
p = fftw_alloc_complex(int(N, C_SIZE_T))                                    
call c_f_pointer(p, fft, [N]);                                              
p = fftw_alloc_complex(int(N, C_SIZE_T))                                    
call c_f_pointer(p, x_align, [N]);                                          

plan = fftw_plan_dft_1d(N, x_align, fft, FFTW_FORWARD, FFTW_MEASURE);       
! FFTW overwrites x_align and fft during planning process, so assign        
! data here                                                                 
x_align = x                                                                 
call fftw_execute_dft(plan, x_align, fft);                                  
call fftw_free(p);                                                          
end function fft_c2c                                                          
memory-leaks fortran return-type fftw
1个回答
1
投票

你不能轻易做到这一点。你强迫你在Fortran上使用“现代”=“一切都是功能”,这里它不适合(或根本不适合)。

对于meory泄漏,规则很简单 - 释放所有指针。将它们用于结果变量是内存泄漏的保证。如果需要本地分配的对齐内存,则需要在本地分配它,在那里复制数据,复制数据并解除分配。

Fortran中的每个指针都需要显式释放,没有引用计数或垃圾回收来为您解除分配。

你考虑只使用带有适当标志的非对齐内存并测量差异,你似乎并不关心顶级性能。

最后,在每次变换之前doFFTW_MEASURE不仅仅是“不是最有效的东西”,它绝对是一场性能灾难。你应该至少使用FFTW_ESTIMATE来减轻它。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.