- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Hello,

I run a fortran multithreaded code that uses ffts. I am now trying to switch to

fttw available thru mkl. When I insert the code below the results more

often than not are nans or infinity even though only the plan call is executed

and no actuall ffts are carried out using fftw. The standard suspect in such cases

would be out-of-bounds operations. I cannot at the moment see any out-of-bounds

problems when creating the plan. But here there is still the problem of the interface.

I wonder if i have set up things correcly. The compile and link calls are

ifort -O3 -r8 -openmp -fpp -parallel -mcmodel=medium -i-dynamic -shared-intel -mkl

This is run on a six core Linux machine.

Has anyone any suggestions as to what may be going on?

Thank you.

--

module FFTW3 use, intrinsic :: iso_c_binding include 'fftw3.f03' type(C_PTR), save :: plan_r2c real*8, allocatable, SAVE :: WWW1( :, : ), WWW2( :, : ) end module .... Use FFTW3 Integer :: Irank, ndim(1), InEmbeded(1), OutEmbeded(1) ... ! Note NX32 > N1_32 + 4 allocate( WWW1( NX32*M2, M3 ), STAT = IERR ) allocate( WWW2( NX32*M2, M3 ), STAT = IERR ) Irank = 1 ndim(1) = N1_32 InEmbeded(1) = NX32 OutEmbeded(1) = NX32 / 2 call dfftw_plan_many_dft_r2c( plan_r2c, Irank, ndim(1), M2*M3, WKX_1, InEmbeded(1), 1, & NX32, WKX_2, OutEmbeded(1), 1, NX32/2, FFTW_MEASURE )

Link Copied

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Ooops CORRECTION.

The plan call is:

call dfftw_plan_many_dft_r2c( plan_r2c, Irank, ndim(1), M2*M3, WWW1, InEmbeded(1), 1, &

NX32, WWW2, OutEmbeded(1), 1, NX32/2, FFTW_MEASURE )

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

After the plan call returns, did you check if plan_r2c is zero? Probably, the plan was not created successfully for some reason. Can you attach your full test code?

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Thank you.

There is a test for the creation of the plan. See code extract below @ line 98.

I use fftw with a c code without any problem.

It is now that I am trying to insert fftw into a fortran code that all

hell broke loose.

I include the relevant subroutine (somewhat pruned) that contains the

relevant call. This is part of a much larger code. The problem is that just

this one call to the plan routine most times will contaminate with garbage other

parts of the code.

Any ideas would be appreciated.

--

!===============================================

module FFTW3 use, intrinsic :: iso_c_binding include 'fftw3.f03' type(C_PTR), save :: plan_r2c, plan_c2r real*8, allocatable, SAVE :: WWW1( :, : ), WWW2( :, : ) end module !=============================================== Subroutine Setup Use Tables Use FFTW3 Implicit None Integer :: I, J, K, JEL, KEL, Jump, II, JJ, KK Real*8 :: temp, VS_MAX, T1, T2 Integer :: Irank, ndim(1), InEmbeded(1), OutEmbeded(1) N1P1 = N1 + 1 N1P2 = N1 + 2 N1_32 = N1 + (N1P1/2) M2M1 = M2 - 1 M3M1 = M3 - 1 JLEN = N2*M2M1 - 1 KLEN = N3*M3M1 - 1 JFULL = N2*M2M1 + 1 KFULL = N3*M3M1 + 1 JPLEN = N2*M2M1 + 1 ! Pressure matrix y-size KPLEN = N3*M3M1 + 1 ! .. .. z-size RDT = 1.0D0 / DT RN1_32 = 1.0d0 / DFLOAT(N1_32) ! - Time staping factors EULER_1 = 1 EULER_2 = 2 NORDER = EULER_1 ! - Euler_1 settings. Alpha = RDT Beta = RDT Gamma = 0.0D0 Delta = 1.0D0 Epsilon = 0.0D0 TIME = 0.0D0 NTIME = 0 N_RANDOM = 0 T_RANDOM = 0 FlowRate_1 = 0.0D0 FlowRate_2 = 0.0D0 [ stuff delete ] T1 = pi*DFLOAT(N1)/XLEN Wv( N1+1 ) = T1 Wv_SQ( N1+1 ) = T1*T1 Call FFTFAX( N1, IFAX, TRIGS ) Call FFTFAX( N1_32, IFAX_32, TRIGS_32 ) !=========================================================== ! FFTW write(6,*)' ---- NX32, N1_32 = ', NX32, N1_32 allocate( WWW1( NX32*M2, M3 ), STAT = IERR ) if( Ierr .ne. 0 ) STOP ' ** FAILED WWWW1 ' allocate( WWW2( NX32*M2, M3 ), STAT = IERR ) if( Ierr .ne. 0 ) STOP ' ** FAILED WWWW2 ' Irank = 1 ndim(1) = N1_32 InEmbeded(1) = NX32 OutEmbeded(1) = NX32/2 call dfftw_plan_many_dft_r2c( plan_r2c, Irank, ndim(1), M2*M3, WWW1, InEmbeded(1), 1, & NX32, WWW2, OutEmbeded(1), 1, NX32/2, FFTW_MEASURE ) if( .not. c_associated(plan_r2c) ) STOP " *** FAILED TO CREAT FFTW PLAN" write(6,*) ' --- PLAN ', c_associated(plan_r2c) ! - Y,Z Grid and parameters. Call Grid Call ZWGLJD( YGL, RHY, M2, 0.0D0, 0.0D0 ) Call ZWGLJD( ZGL, RHZ, M3, 0.0D0, 0.0D0 ) Call DGLJD( DYGL, DYGLT, YGL, M2, MY, 0.0D0, 0.0D0 ) Call DGLJD( DZGL, DZGLT, ZGL, M3, MZ, 0.0D0, 0.0D0 ) ! - Set up filter data. Call ZWGLJD( YGL_F, WKP_1, M2_F, 0.0D0, 0.0D0 ) ! Y filter grid. WKP_1 is a dummy. Call ZWGLJD( ZGL_F, WKP_1, M3_F, 0.0D0, 0.0D0 ) ! Z filter grid. WKP_1 is a dummy. ! - Interpolation matrices : M2 -> M2_F and M3 -> M3_F Call IGLLMD( GLY2F, WKP_1, YGL, YGL_F, M2, M2_F, MY, MY, -999 ) Call IGLLMD( GLZ2F, WKP_1, ZGL, ZGL_F, M3, M3_F, MZ, MZ, -999 ) ! - Reverse interpolation : M2_F -> M2 and M3_F -> M3 Call IGLLMD( F2GLY, WKP_1, YGL_F, YGL, M2_F, M2, MY, MY, -999 ) Call IGLLMD( F2GLZ, WKP_1, ZGL_F, ZGL, M3_F, M3, MZ, MZ, -999 ) ! [stuff deleted] End Subroutine Setup

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

FFTW3 has Fortran interface. Why do you use C binding in your Fortran code? Please take a look at the MKL sample code that uses FFTW3 in Fortran code and see if it is helpful. The sample code is found in $MKLROOT/examples/fftw3xf/source/dp_plan_many_dft_r2c.f90

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Thank you for your interest.

I have downloaded a number of test codes . All work ok.

My problem must be code specific.

I copied the module with the bindings from fthe fftw site. The c bindings

are meant to provide fortran types compatible with C which in this case

is the c_ptr. Anyway this is not the problem.

if i inderstood the mkl manual correctly, unlike the original fftw, the mkl

version is not thread safe even when different plans and arrays are used.

A single muntithreading call is ok tho.

This is a showstopper, unless u know different.

--

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

All MKL functions, including FFT, are thread safe. It is clearly stated in the MKL User's Guide: http://software.intel.com/en-us/mkl_11.1_ug_lin

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

I have literally the same problem. Has it been solved since then?

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Hi Alexander,

I don't know what problem you are talking about. If your question is about whether or not mkl functions are thread-safe then, just like Zhang has mentioned back in 2014, all mkl functions are thread-safe.

Best Regards,

Khang

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page