2014-06-10 2 views
0

왜 FFTW를 fortran과 함께 사용하는지에 따라 세분화 된 오류가 발생하며 그 이유를 파악하지 못했습니다. 온라인 검색에서도 운이 없습니다. 내 코드는 다음과 같습니다.FFTW 3 세그멘테이션 오류

integer, parameter :: Nx=128, Ny=Nx, Nz=Nx 
integer, parameter :: NORM=Nx*Ny*Nz,Ntop=MAX(Nx,Ny,Nz)/2, LX1=Nx/2+1 
double precision, parameter :: Etot=0.5 
double complex, dimension(LX1,Ny,Nz) :: fbx, fby, fbz 
double precision, dimension(Nx,Ny,Nz) :: bx, by, bz 
real 
! ... 
! Assign values to fbx, fby, fbz 
! ... 
call dfftw_plan_dft_c2r_3d(plan,Nx,Ny,Nz,fbx,bx,FFTW_ESTIMATE) 
call dfftw_execute_dft_c2r(plan, fbx, bx) 
call dfftw_execute_dft_c2r(plan, fby, by) 
call dfftw_execute_dft_c2r(plan, fbz, bz) 
call dfftw_destroy_plan(plan) 
! et = sum(abs(fbx)**2+abs(fby)**2+abs(fbz)**2) 
! bx=bx*sqrt(Etot/et); by=by*sqrt(Etot/et); bz=bz*sqrt(Etot/et) 

! Write bx, by, bz to files 

코드가 이렇게 잘 실행됩니다. 문제는 내가 계산하는 줄의 주석 처리를 제거하고 bx를 다시 스케일링 할 때 발생합니다. 내가 그 라인의 주석을 풀 때, 나는 "잘못된 메모리 참조"라는 세그먼테이션 오류를 얻는다. 독방 감금 오류가 나는 FFTW 3.2 FFTW 3.4 ifort뿐만 아니라 두 개의 서로 다른 시스템에 gfortran 어떤 성공없이 (이들의 모든 가능한 조합) 모두 해봤()

dfftw_execute_dft_c2r의 첫 번째 실행에서 발생한다.

그것은 나를 미치게합니다! 제발 도와주세요! 왜 이런 식으로 일어나는거야?

감사합니다.

+0

오류 검사를 수행 했습니까? 디버거를 사용해 보셨습니까? –

+0

오류 검사와 함께 컴파일했는데 디버거에서 오류가있는 곳만 알려줍니다 (원래 게시물에서 언급했듯이). – toylas

답변

3

다른 배열에 적용되는 동일한 계획을 사용하고 있습니다. FFTW는 메모리에 정렬되어있는 경우에만 작동합니다. final point here 및 관련 항목을 문서에서 보장 할 수없는 이유에 대해 설명합니다.

내가 다른 곳에서 문서에 보이거나 한 두 가지 제안 중 하나

  1. 이 임시 배열을 생성하는 임시 배열에 대한 계획을 구성하고, 호출 후/전로와 임시직에서 데이터를 복사 to execute_dft. 과거에 이와 유사한 오류를 피하기 위해이 방법을 사용했지만 성능면에서는 좋지 않습니다. 그러나 이것이 문제의 원인인지 쉽게 확인할 수있는 것은 간단합니다.
  2. 여러 계획을 작성하십시오.

또한 legacy Fortran interface을 사용하고있는 것으로 보입니다. 가능하다면 "Modern" interface을 사용하는 것이 더 낫지 만, 과거에 저의 경험에 비추어 볼 때 일부 컴파일러는 그다지 잘 작동하지 않습니다.

+0

나는 당신의 제안을 모두 시도했으나 효과가 없었습니다. 계획을 만든 크기와 정확히 같은 배열에 배열을 사용한다면 계획을 한 번 만들고 다시 사용할 수 있다는 것이 내 이해입니다. 게다가 그것이 계획 이슈라면, 그것은 무엇이든지간에 오류를 줄 것입니다. 미친 짓은 et & bx 줄이 주석 처리되어 있고 그 줄의 주석을 제거하는 즉시 이전 단계 (계획의 첫 번째 실행)에서 작업을 중단하면 제대로 작동한다는 것입니다. – toylas

+0

이상합니다. 과거에이 파일을 사용했던 예제 파일은 [이 파일을 github] (https://github.com/IanHawke/MultiFluid1d/blob/master/compute_fft_mod.F90)이지만 분명하지는 않습니다. 그것은 제안에 있지 않습니다. FFTW가 메모리 전체에서 스톰 핑하면 코드에서 주석 처리 된 행이 실패 할 것으로 예상됩니다. – Ian