[Beowulf] fftw2, mpi, from 32 bit to 64 and fortran

Lombard, David N dnlombar at ichips.intel.com
Wed Aug 6 14:56:01 PDT 2008


On Tue, Aug 05, 2008 at 02:57:42AM -0700, Ricardo Reis wrote:
> On Mon, 4 Aug 2008, Mark Kosmowski wrote:
> 
> > So, why did the 32-bit test case work?  Shouldn't the same problem
> > crash both systems if it is a code issue?

Not necessarily given the error described below.

> I asked the same question myself... The function interface is:
> 
>    call rfftwnd_f77_mpi(plan_c2r, &
>         1, local_data, work, use_work, FFTW_NORMAL_ORDER)
> 
> where use_work is an integer, value 1 if you use the work temporary
> array, 0 otherwise. This was the variable I wasn't passing.
...
> The wrapper function for this is (from rfftw_f77_mpi.c):
> 
> void F77_FUNC_(rfftwnd_f77_mpi,RFFTWND_F77_MPI)
> (rfftwnd_mpi_plan *p, int *n_fields, fftw_real *local_data,
>   fftw_real *work, int *use_work, int *ioutput_order)

>  .... So it must be a pointer issue revealed by the 64 bit, no? When I
> wasn't doing it "properly" the value of *ioutput_order wasn't set.

The value of the first element of local_data was used for the n_fields scalar.

The work array was being laid down starting at the location of the use_work scalar.

The FFTW_NORMAL_ORDER value was being interpreted as use_work scalar.

Finally, ioutput_order scalar was some random value.

So, a lot was going wrong there.  It's just one of life's little, um,  pleasures
that it looked like it was working for your 32-bit test case.  Don't worry, you'll
likely do this again, as likely *every* one of us on this list has, too.

BTW, Fortran passes by reference; that's why all args are pointers.

-- 
David N. Lombard, Intel, Irvine, CA
I do not speak for Intel Corporation; all comments are strictly my own.



More information about the Beowulf mailing list