Re: [Speex-dev] Problem with Blackfin assembly optimizations -- bug in fixed_bfin.h / resampler saturation???
Frank Lorenz
Frank_wtal at web.de
Tue Feb 12 05:55:44 PST 2008
Hi,
when I compile with FIXED_DEBUG enabled, I get an error -- both when make tries to build testenc.o and when I try to link my app against the speex lib:
lorenz at panelmaker:~/Blackfin/tests/speex_loopthrough$ make
bfin-uclinux-gcc -c -g -I/home/lorenz/include -o main.o main.c
bfin-uclinux-gcc -gl -elf2flt -L/home/lorenz/lib -o speex_through main.o -lspeex_debug -lspeexdsp -lm
/home/lorenz/lib/libspeex_debug.a(bits.o): In function `speex_bits_set_bit_buffer':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/bits.c:72: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(modes.o): In function `speex_mode_query':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/modes.c:359: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(modes_wb.o): In function `speex_lib_get_mode':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/modes_wb.c:293: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(nb_celp.o): In function `_ADD32':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/fixed_debug.h:207: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(quant_lsp.o): In function `compute_quant_weights':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/quant_lsp.c:72: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(sb_celp.o): In function `_DIV32':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/fixed_debug.h:466: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(speex_callbacks.o): In function `speex_default_user_handler':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex_callbacks.c:140: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(window.o):(.bss+0x0): multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(cb_search.o): In function `compute_weighted_codebook':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/cb_search_bfin.h:38: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(filters.o): In function `normalize16':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/filters_bfin.h:37: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(lsp.o): In function `lsp_enforce_margin':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/lsp.c:594: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(ltp.o): In function `inner_prod':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/ltp_bfin.h:38: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(vbr.o): In function `vbr_destroy':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/vbr.c:272: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(vq.o): In function `vq_nbest':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/vq_bfin.h:38: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
/home/lorenz/lib/libspeex_debug.a(lpc.o): In function `_spx_lpc':
/home/lorenz/Blackfin/speex-1.2beta3/libspeex/lpc.c:78: multiple definition of `_spx_mips'
/home/lorenz/lib/libspeex_debug.a(speex.o):/home/lorenz/Blackfin/speex-1.2beta3/libspeex/speex.c:52: first defined here
collect2: ld gab 1 als Ende-Status zurÃŒck
make: *** [speex_through] Fehler 1
again: any ideas how to proceed?
best regards,
Frank
-----Ursprüngliche Nachricht-----
Von: "Jean-Marc Valin" <jean-marc.valin at usherbrooke.ca>
Gesendet: 08.02.08 21:50:56
An: Frank Lorenz <Frank_wtal at web.de>
CC: speex-dev at xiph.org
Betreff: Re: [Speex-dev] Problem with Blackfin assembly optimizations -- bug in fixed_bfin.h / resampler saturation???
Frank Lorenz a écrit :
> Yes, this is another point: I wrote that the resampler breaks, but
> this is not the case. Instead, the speex encoder corrupts its input
> buffer when the "DIV32_16 bug" described above happens. Do you have
> any idea how to proceed?
Can you try enabling --enable-fixed-point-debug (FIXED_DEBUG) and see if
any error gets printed. I suspect there might be a place where the
assumptions of DIV32_16 are violated, i.e. either the right hand side
doesn't fit in 16 bits or the result doesn't fit in 16 bits. Can you check?
Jean-Marc
> best regards, Frank
>
>
> -----Ursprüngliche Nachricht----- Von: "Jean-Marc Valin"
> <jean-marc.valin at usherbrooke.ca> Gesendet: 06.02.08 11:07:46 An:
> Frank Lorenz <Frank_wtal at web.de> CC: speex-dev at xiph.org Betreff: Re:
> [Speex-dev] Problem with Blackfin assembly optimizations -- bug in
> fixed_bfin.h / resampler saturation???
>
>
> Frank Lorenz a écrit :
>> I just started to examine the DIV32_16 function (Blackfin ASM
>> version), and wondered why the return value of the function inside
>> 'fixed_bfin.h' is of type 'spx_word16_t', but the local variable
>> 'res' which is returned by this function is of type 'spx_word32_t'.
>> Is this a trick of optimization or a bug? (Same question for
>> PDIV32_16 and MAX16, too!)
>
> Neither (AFAIK). The idea is that sometimes gcc does
> silly/counter-intuitive things when I specify a 16-bit variable as a
> constraint. That way, I force the top 16 bits to be zero.
>
> Jean-Marc
>
>> best regards, Frank
>>
>>
>> -----Ursprüngliche Nachricht----- Von: "Jean-Marc Valin"
>> <jean-marc.valin at usherbrooke.ca> Gesendet: 02.02.08 06:26:08 An:
>> speex-dev <speex-dev at xiph.org> Betreff: Re: FW: Re: [Speex-dev]
>> Problem with Blackfin assembly optimizations -- bug in fixed_bfin.h
>> / resampler saturation???
>>
>>
>> Frank Lorenz a écrit :
>>> And yes, the same "overflow" happens even when I disable Blackfin
>>> ASM optimizations.
>> Indeed, that shouldn't happen. Just to make sure I understand, so
>> far there's two problems: 1) DIV32_16() in Blackfin assembly causes
>> problems 2) The resampler overflows
>>
>> When you fix/workaround those two, is the encoder/decoder working
>> correctly or are there other issues?
>>
>> About the DIV32_16() issue, could you try and replace it with a
>> function that compares the Blackfin-asm result with the real
>> division and dumps the args and output when they don't match. I'd
>> like to understand for what inputs that functions fails. That would
>> help in fixing the problem.
>>
>> Thanks,
>>
>> Jean-Marc
>>
>>> best regards, Frank
>>>
>>> -----Ursprüngliche Nachricht----- Von: "Jean-Marc Valin"
>>> <jean-marc.valin at usherbrooke.ca> Gesendet: 01.02.08 12:11:39 An:
>>> Frank Lorenz <Frank_wtal at web.de> CC: speex-dev at xiph.org Betreff:
>>> Re: FW: Re: [Speex-dev] Problem with Blackfin assembly
>>> optimizations -- bug in fixed_bfin.h / resampler saturation???
>>>
>>>
>>> Frank Lorenz a écrit :
>>>> didn't get a reply to my last post (see below) -- do you have
>>>> no idea what happens here?
>>> Sorry, been quite busy lately. Still have a backlog of things to
>>> respond to (sorry to others as well), some of it quite old.
>>>
>>>> After some more tests, I disabled the DIV32_16 Blackfin
>>>> optimizations and now get good quality on the Blackfin.
>>> OK, I'll need to investigate that one. It's mostly taken from the
>>> ADI manual, so I don't see what could have happened.
>>>
>>>> But when I have overdrive on the input, things become very bad
>>> Does that happen without any assembly. Some amount of badness is
>>> expected from the fixed-point because of saturation issues. It
>>> shouldn't overflow though (can you check?)
>>>
>>>> -- I'm not sure if this is really a filter stability issue like
>>>> I wrote some weeks ago.
>>> I don't think it has to do with filters.
>>>
>>>> I use the speex resampler to downsample from 48 to 16 kHz. When
>>>> I look to the downsampled signal before passing it to the
>>>> encoder, there seems to be a bug in saturation. On overdrive,
>>>> instead of holding a too big signal value at maximum (e.g.
>>>> 32767) for some samples, the sample values I get from the
>>>> resampler are [-32768,32767,-32768,...], i.e. the output of the
>>>> resampler alters between the biggest possible negative value
>>>> and the biggest possible positive value.
>>> This is definitely bad. Can you send me an example file. Also,
>>> can you reproduce that problem without the Blackfin assembly?
>>>
>>>> Does the resampler use the hardware saturation available on
>>>> Blackfin, or does it saturate by software? Can you point me to
>>>> the place I have to look at inside the resampler function for
>>>> saturation?
>>> Saturation is entirely done in software. The resampler does the
>>> conversion using the WORD2INT macro.
>>>
>>> Jean-Marc
>>>
>>>
>>>
>>> _______________________________________________________________________
>>> Jetzt neu! Schützen Sie Ihren PC mit McAfee und WEB.DE. 30 Tage
>>> kostenlos testen.
>>> http://www.pc-sicherheit.web.de/startseite/?mc=022220
>>>
>>>
>>>
>>
>>
>> _________________________________________________________________________
>> In 5 Schritten zur eigenen Homepage. Jetzt Domain sichern und
>> gestalten! Nur 3,99 EUR/Monat!
>> http://www.maildomain.web.de/?mc=021114
>>
>>
>>
>
>
>
> _______________________________________________________________________
> Jetzt neu! Schützen Sie Ihren PC mit McAfee und WEB.DE. 30 Tage
> kostenlos testen.
> http://www.pc-sicherheit.web.de/startseite/?mc=022220
>
>
>
_________________________________________________________________________
In 5 Schritten zur eigenen Homepage. Jetzt Domain sichern und gestalten!
Nur 3,99 EUR/Monat! http://www.maildomain.web.de/?mc=021114
More information about the Speex-dev
mailing list