mkcolg
Joined: 30 Jun 2004 Posts: 4996 Location: The Portland Group Inc.
|
Posted: Mon Apr 29, 2013 1:28 pm Post subject: |
|
|
Hi Karl,
I'm not sure. Using the sample code in the link you reference, if I move the create and destroy plan calls outside the OpenMP region, the code runs correctly. I did make the mistake of forgetting to move the "plan_r2c" out of the private clause which caused a segv, but was find once made shared. Could this be your issue as well?
- Mat
| Code: | % cat main.F
program main
implicit none
#include "fftw3.inc"
integer nx,ny
parameter(nx=128,ny=8)
double precision val(nx,ny)
double precision tp(nx), tf(nx)
integer i,j,k
real*8 deltax,rlenx
real*8 pi,amp
integer*8 plan_r2c
integer tid,OMP_GET_THREAD_NUM
pi=4.d0*atan(1.d0)
rlenx=2.d0*pi
deltax=rlenx/dble(nx)
! write(*,*)'rlenx:',rlenx
amp=2.d0
do j=1,ny
do i=1,nx
val(i,j)=amp*dsin(2.d0*pi*2.d0*deltax*dble(i-1)/rlenx)
enddo
enddo
call dfftw_plan_dft_r2c_1d(plan_r2c,nx,tp,tf,FFTW_MEASURE)
!CALL OMP_SET_NUM_THREADS(4)
!omp parallel do private(tid,k,plan_r2c,tp,tf)
!$omp parallel do private(tid,k,tp,tf)
!omp parallel do default(private)
do k =1,ny
tid = OMP_GET_THREAD_NUM()
write(*,*) 'Thread ID = ', tid, ' Loop # = ', k
do i=1,nx
tp(i)=val(i,k)
tf(i)=dble(0.0)
enddo
!call dfftw_plan_dft_r2c_1d(plan_r2c,nx,tp,tf,FFTW_MEASURE)
call dfftw_execute(plan_r2c)
!call dfftw_destroy_plan(plan_r2c)
write(*,*) 'plan_r2c = ', plan_r2c
enddo
call dfftw_destroy_plan(plan_r2c)
end
% pgf90 main.F -Mfree -L/local/home/colgrove/fftw/lib -lfftw3 -g -mp
% setenv OMP_NUM_THREADS 4
% a.out
Thread ID = 0 Loop # = 1
Thread ID = 2 Loop # = 5
plan_r2c = 8760496
Thread ID = 0 Loop # = 2
plan_r2c = 8760496
Thread ID = 2 Loop # = 6
Thread ID = 3 Loop # = 7
plan_r2c = 8760496
plan_r2c = 8760496
plan_r2c = 8760496
Thread ID = 3 Loop # = 8
plan_r2c = 8760496
Thread ID = 1 Loop # = 3
plan_r2c = 8760496
Thread ID = 1 Loop # = 4
plan_r2c = 8760496
|
|
|