On Wed, 03 Jan 2007 17:09:03 +0100
Sebastian Schäfer <[EMAIL PROTECTED]> wrote:

> I could locate the exact position where the plugin segfaults.
> 
> This is the code surrounding it (the segfaulting command is underlined):
> 
> ------------
>       // Run the real->complex transform
> #ifdef FFTW3
>       // PERL_BEGIN
>       fprintf(stderr, "*(real_L + input_buffer_pos)=%G\n",
> (LADSPA_Data)(*(real_L + input_buffer_pos)));
> 
>       fftwf_execute(plan_rc_L);
> ===============================
>       fprintf(stderr, "*(real_R + input_buffer_pos)=%G\n",
> (LADSPA_Data)(*(real_R + input_buffer_pos)));
> 
>       fftwf_execute(plan_rc_R);
>       fprintf(stderr, "*(real_C + input_buffer_pos)=%G\n",
> (LADSPA_Data)(*(real_C + input_buffer_pos)));
> 
>       fftwf_execute(plan_rc_C);
>       fprintf(stderr, "*(real_LFE + input_buffer_pos)=%G\n",
> (LADSPA_Data)(*(real_LFE + input_buffer_pos)));
> 
>       fftwf_execute(plan_rc_LFE);
>       fprintf(stderr, "*(real_LS + input_buffer_pos)=%G\n",
> (LADSPA_Data)(*(real_LS + input_buffer_pos)));
> 
>       fftwf_execute(plan_rc_LS);
>       fprintf(stderr, "*(real_RS + input_buffer_pos)=%G\n",
> (LADSPA_Data)(*(real_RS + input_buffer_pos)));
> 
>       fftwf_execute(plan_rc_RS);
>       // PERL_END
> #else
> ----------
> 
> It's located on line 1000 in mbeq_119700.c.before_PerlPreProcessor.
> I hope this helps to find the error.
> 
> Best regards,
> Sebastian
> 

Sebastian, I am not sure we are "on the same page".

Your Email apparently emphasizes the "fftwf_execute(plan_rc_L);"
statement/line, you put '=' under it:

      fftwf_execute(plan_rc_L);
===============================

- I guess that's what you meant using the "underlined" word.

And you're saying it's line #1000 in mbeq_119700.c.before_PerlPreProcessor,
but in the latest version I've sent here is the context:

    962       // Run the real->complex transform
    963 #ifdef FFTW3
    964       // PERL_BEGIN
    965       foreach my $suffix(@{$MBEQ::__config_hash{channel_suffixes}})
    966         {
    967         print <<EOD
    968       //fprintf(stderr, "*(real$suffix + input_buffer_pos)=%G\\n", 
(LADSPA_Data)(*(real$suffix + input_buffer_pos)));
    969
    970       fftwf_execute(plan_rc$suffix);
    971 EOD
    972         ;
    973         }
    974       // PERL_END
    975 #else
    976       // PERL_BEGIN
    977       foreach my $suffix(@{$MBEQ::__config_hash{channel_suffixes}})
    978         {
    979         print <<EOD
    980       rfftw_one(plan_rc, real$suffix, comp$suffix);
    981 EOD
    982         ;
    983         }
    984       // PERL_END
    985 #endif

, so I see the "fftwf_execute(plan_rc_L);" as

    970       fftwf_execute(plan_rc$suffix);

line, i.e. as line #970.

Are we talking about

   970       fftwf_execute(plan_rc$suffix);

line ?

Line #1000 is this:

   1000       fftw_real *comp_rp_ptr$suffix = comp$suffix + 1;

- it's just pointer arithmetic with no pointer dereferencing, so
IMO line #1000 cannot segfault be definition.

OK, assuming we are talking about

    970       fftwf_execute(plan_rc$suffix);

- this is the moment of direct FFT.

At this time I can think of two things going wrong:

1) 'plan_rc$suffix' loses its value;
2) there is misalignment in FFT buffers.

'plan_rc$suffix' is first getting its value here:

    538 #ifdef FFTW3
    539   // PERL_BEGIN
    540   foreach my $suffix(@{$MBEQ::__config_hash{channel_suffixes}})
    541     {
    542     print <<EOD
    543   (*plugin_data).plan_rc$suffix = fftwf_plan_r2r_1d(fft_length, 
(*plugin_data).real$suffix, (*plugin_data).comp$suffix, FFTW_R2HC, 
FFTW_MEASURE);
    544   (*plugin_data).plan_cr$suffix = fftwf_plan_r2r_1d(fft_length, 
(*plugin_data).comp$suffix, (*plugin_data).real$suffix, FFTW_HC2R, 
FFTW_MEASURE);
    545 EOD
    546     ;
    547     }
    548   // PERL_END
    549 #else
    550   (*plugin_data).plan_rc = rfftw_create_plan(fft_length, 
FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
    551   (*plugin_data).plan_cr = rfftw_create_plan(fft_length, 
FFTW_COMPLEX_TO_REAL, FFTW_ESTIMATE);
    552 #endif

, at line #543:

    543   (*plugin_data).plan_rc$suffix = fftwf_plan_r2r_1d(fft_length, 
(*plugin_data).real$suffix, (*plugin_data).comp$suffix, FFTW_R2HC, 
FFTW_MEASURE);
.

So, could you please rewrite the piece more or less top look like this 
(untested):

#ifdef FFTW3
  // PERL_BEGIN
  foreach my $suffix(@{$MBEQ::__config_hash{channel_suffixes}})
    {
    print <<EOD
  (*plugin_data).plan_rc$suffix = fftwf_plan_r2r_1d(fft_length, 
(*plugin_data).real$suffix, (*plugin_data).comp$suffix, FFTW_R2HC, 
FFTW_MEASURE);
  fprintf(stderr, "just after plan calculation: 
(*plugin_data).plan_rc$suffix=%08lx at line number %d\\n", 
(unsigned)(*plugin_data).plan_rc$suffix, __LINE__);
  (*plugin_data).plan_cr$suffix = fftwf_plan_r2r_1d(fft_length, 
(*plugin_data).comp$suffix, (*plugin_data).real$suffix, FFTW_HC2R, 
FFTW_MEASURE);
EOD
    ;
    }
  // PERL_END
#else
  (*plugin_data).plan_rc = rfftw_create_plan(fft_length, FFTW_REAL_TO_COMPLEX, 
FFTW_ESTIMATE);
  (*plugin_data).plan_cr = rfftw_create_plan(fft_length, FFTW_COMPLEX_TO_REAL, 
FFTW_ESTIMATE);
#endif

- please pay attention to the newly added

  fprint(stderr, "just after plan calculation: 
(*plugin_data).plan_rc$suffix=%08lx at line number %d\\n", 
(unsigned)(*plugin_data).plan_rc$suffix, __LINE__);

line which is supposed to print in hex the address pointed to
by'(*plugin_data).plan_rc$suffix' just after FFTW plan generation.



Likewise, could you please modify the vicinity of line #970 to look like this 
(untested):

#ifdef FFTW3
      // PERL_BEGIN
      foreach my $suffix(@{$MBEQ::__config_hash{channel_suffixes}})
        {
        print <<EOD
      //fprintf(stderr, "*(real$suffix + input_buffer_pos)=%G\\n", 
(LADSPA_Data)(*(real$suffix + input_buffer_pos)));
      fprintf(stderr, "just before using the plan: plan_rc$suffix=%08lx at line 
number %d\\n", (unsigned)plan_rc$suffix, __LINE__);
      fftwf_execute(plan_rc$suffix);
EOD
        ;
        }
      // PERL_END
#else
      // PERL_BEGIN
      foreach my $suffix(@{$MBEQ::__config_hash{channel_suffixes}})
        {
        print <<EOD
      rfftw_one(plan_rc, real$suffix, comp$suffix);
EOD
        ;
        }
      // PERL_END
#endif

- please pay attention to the newly added

      fprintf(stderr, "just before using the plan: plan_rc$suffix=%08lx at line 
number %d\\n", (unsigned)plan_rc$suffix, __LINE__);

line - the same intent, the addresses pointed to by 'plan_rc$suffix' and by
earlier mentioned '(*plugin_data).plan_rc$suffix' should be the same.


Let's also check the alignment issue.

The buffer in question is '(*plugin_data).comp$suffix', it is allocated here:

    527   CALLOC_AND_CHECK(fftw_real *, (*plugin_data).comp$suffix, fft_length, 
sizeof(fftw_real), __LINE__)
.
Could you please add just after line #527 this (untested):

  fprintf(stderr, "just after allocation (*plugin_data).comp$suffix=%08lx at 
line number %d\\n", (unsigned)(*plugin_data).comp$suffix, __LINE__);

The intent is to see the address pointed to by '(*plugin_data).comp$suffix'
in hex, and if the last digit is 0, i.e. if the address is a multiple of
16 decimal == 10 hexadecimal, then we are OK.

If not, I'll use a different allocation routine which guarantees proper
alignment.

Interestingly enough, FFTW3 documentation does not insist on this alignment
it just says that for better performance one needs this alignment and without
it there will be no performance gain.

But I've noticed strange things with SSE in case of misaligned data, and
sometimes there were crashes.

...

Anyway, could you please post the output of 'gcc -v' command ?

Regards,
  Sergei.


-- 
Visit my http://appsfromscratch.berlios.de/ open source project.

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Alsa-user mailing list
Alsa-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/alsa-user

Reply via email to