Bug in volk on armv6

Hi!

I would like to report a bug in volk on armv6.

There is infinite “while” cycle in volk/tmpl/volk_cpu.tmpl.c function
“has_neon” (line 111).

Code “while(!found_neon && auxvec_f) {” will loop infinitely if there
is no neon in platform. found_neon will never be true and file
descriptor auxvec_f will always be true.


Alexey B. [email protected]

On Mon, Jul 1, 2013 at 4:08 AM, Alexey B. [email protected] wrote:


Alexey B. [email protected]

Ok, I see your point. Looks like we should be testing the return value
from fread, instead of auxvec_f. Can you confirm if this patch works?

diff --git a/volk/tmpl/volk_cpu.tmpl.c b/volk/tmpl/volk_cpu.tmpl.c
index 81fc679…b1a0a4a 100644
— a/volk/tmpl/volk_cpu.tmpl.c
+++ b/volk/tmpl/volk_cpu.tmpl.c
@@ -116,10 +116,11 @@ static int has_neon(void){
auxvec_f = fopen(“/proc/self/auxv”, “rb”);
if(!auxvec_f) return 0;

  • size_t r = 1;
    //so auxv is basically 32b of ID and 32b of value
    //so it goes like this
  • while(!found_neon && auxvec_f) {
  •  fread(auxvec, sizeof(unsigned long), 2, auxvec_f);
    
  • while(!found_neon && r) {
  •  r = fread(auxvec, sizeof(unsigned long), 2, auxvec_f);
     if((auxvec[0] == AT_HWCAP) && (auxvec[1] & HWCAP_NEON))
       found_neon = 1;
    
    }

Or might be better to test ‘if(r < 2)’ after the fread line and break
in case an error occurs and we only get 1 character out and not try to
read from it again. Probably not a bit deal since we’re only reading
in two chars at a time.

Tom

Confirming that this fix works.

But now volk test fails in another place.

(gdb) run
Starting program: /root/gnuradio-3.6.5.1/build/volk/lib/test_all
[Thread debugging using libthread_db enabled]
Using host libthread_db library
“/lib/arm-linux-gnueabihf/libthread_db.so.1”. Running 92 test cases…
Using Volk machine: generic_orc
RUN_VOLK_TESTS: volk_16ic_s32f_deinterleave_real_32f_a
no architectures to test
RUN_VOLK_TESTS: volk_16ic_deinterleave_real_8i_a
generic completed in 0s
orc completed in 0.01s
Best arch: generic
RUN_VOLK_TESTS: volk_16ic_deinterleave_16i_x2_a
generic completed in 0s
orc completed in 0s
Best arch: generic
RUN_VOLK_TESTS: volk_16ic_s32f_deinterleave_32f_x2_a
generic completed in 0.01s

Program received signal SIGSEGV, Segmentation fault.
0xb6f96428 in ?? () from /usr/lib/arm-linux-gnueabihf/libvolk.so.0.0.0
(gdb) bt
#0 0xb6f96428 in ?? ()
#from /usr/lib/arm-linux-gnueabihf/libvolk.so.0.0.0
Cannot access memory at address 0x0
#1 0xb6db3da0 in pthread_mutex_unlock ()
#from /lib/arm-linux-gnueabihf/libc.so.6 2 0x00000020 in ?? ()
#3 0x00000020 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt
stack?)

P.S. I’m trying to compile gnuradio on raspbian on Raspberry Pi board.
All other tests passed ok, so some broken volk function shouldn’t be a
problem for me since I only want to use network sink on it.

On Wed, 3 Jul 2013 10:55:06 -0400
Tom R. [email protected] wrote:

descriptor auxvec_f will always be true.
+++ b/volk/tmpl/volk_cpu.tmpl.c

  •  r = fread(auxvec, sizeof(unsigned long), 2, auxvec_f);
     if((auxvec[0] == AT_HWCAP) && (auxvec[1] & HWCAP_NEON))
       found_neon = 1;
    
    }

Or might be better to test ‘if(r < 2)’ after the fread line and break
in case an error occurs and we only get 1 character out and not try to
read from it again. Probably not a bit deal since we’re only reading
in two chars at a time.

Tom


Alexey B. [email protected]

On Thu, Jul 4, 2013 at 4:13 AM, Alexey B. [email protected] wrote:

RUN_VOLK_TESTS: volk_16ic_s32f_deinterleave_real_32f_a
generic completed in 0.01s
Backtrace stopped: previous frame identical to this frame (corrupt
stack?)

P.S. I’m trying to compile gnuradio on raspbian on Raspberry Pi board.
All other tests passed ok, so some broken volk function shouldn’t be a
problem for me since I only want to use network sink on it.

Hi Alexey,

Yeah, you shouldn’t care too much about Volk on the Raspberry Pi since
there’s nothing optimized for that platform. You just need to make
sure all call to Volk work using the ‘generic’ proto-kernels (in other
words, you need Volk because we use functions from the library in GNU
Radio, but you won’t access any of the SIMD-optimized versions of the
code).

To learn more about the QA failure above, it’d be better to build with
debug symbols on (-DCMAKE_BUILD_TYPE=“Debug”) to get more information
out of that back trace.

Tom