Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory leaks 对Fortran FFT(FFTW)使用对齐内存而不存在内存泄漏_Memory Leaks_Fortran_Return Type_Fftw - Fatal编程技术网

Memory leaks 对Fortran FFT(FFTW)使用对齐内存而不存在内存泄漏

Memory leaks 对Fortran FFT(FFTW)使用对齐内存而不存在内存泄漏,memory-leaks,fortran,return-type,fftw,Memory Leaks,Fortran,Return Type,Fftw,我想使用的现代Fortran接口,但以允许像ifftshift(fft_c2c(vec)*exp(vec))等简单函数调用的方式。这是我对如何做到这一点的理解(我也明白,每次打电话都要做一个新计划并不是最有效的事情)。当前此代码正常(返回正确的结果);但是,存在内存泄漏,因此重复调用会导致丢失。但我不太确定在哪里!我曾希望返回变量“fft”和唯一未混合内存的关联不会导致泄漏,但这显然不是真的。我遗漏了什么,如何更好地利用适当的现代fortran构建我想要做的事情?谢谢 function fft_

我想使用的现代Fortran接口,但以允许像ifftshift(fft_c2c(vec)*exp(vec))等简单函数调用的方式。这是我对如何做到这一点的理解(我也明白,每次打电话都要做一个新计划并不是最有效的事情)。当前此代码正常(返回正确的结果);但是,存在内存泄漏,因此重复调用会导致丢失。但我不太确定在哪里!我曾希望返回变量“fft”和唯一未混合内存的关联不会导致泄漏,但这显然不是真的。我遗漏了什么,如何更好地利用适当的现代fortran构建我想要做的事情?谢谢

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                                                          

你不能轻易做到这一点。您在Fortran上强制输入“现代”=“一切都是函数”,在这里它不太适合(或者根本不适合)

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

Fortran中的每个指针都需要显式的释放,没有引用计数或垃圾收集来为您释放它们

如果您只考虑使用带有适当标志的未对齐内存并测量差异,那么您似乎并不关心最高性能


最后,在每次转换之前进行
FFTW_MEASURE
不仅“不是最有效的事情”,而且是绝对的性能灾难。至少,你应该使用
FFTW\u估计值来缓解它。

你不容易做到这一点。您在Fortran上强制输入“现代”=“一切都是函数”,在这里它不太适合(或者根本不适合)

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

Fortran中的每个指针都需要显式的释放,没有引用计数或垃圾收集来为您释放它们

如果您只考虑使用带有适当标志的未对齐内存并测量差异,那么您似乎并不关心最高性能


最后,在每次转换之前进行
FFTW_MEASURE
不仅“不是最有效的事情”,而且是绝对的性能灾难。您至少应该使用
FFTW\u ESTIMATE
来减轻它。

谢谢,我将不得不进行复制(或者重新调整我的代码,使之稍微难看一点,并符合fortran关于“现代性”的现实)。是的,我知道这将是一场性能灾难,但我想发布一个简单的工作示例来说明内存泄漏问题。@ThomasAnderson传入和传出复制是我在代码中所做的事情。谢谢,我将不得不四处复制(或者重新调整代码,使其稍微难看一点,并符合fortran关于“现代性”的现实)。是的,我知道这将是一场性能灾难,但我想发布一个简单的工作示例来说明内存泄漏问题。@ThomasAnderson在我的代码中就是这样做的