Re: [LAD] A more efficient way to detect INF and/or NAN in a block of samples

From: Robin Gareus <robin@email-addr-hidden>
Date: Sun Oct 06 2013 - 18:01:16 EEST

On 10/06/2013 01:34 PM, Kjetil Matheussen wrote:
> I want to detect INFs and NANs in my DSP graph to avoid having
> them spread and cause various trouble.
>
> Here is the straight forward way:
>
> int i;
> for (i=0;i<num_samples;i++)
> if (!isfinite(samples[i])) break
>
> if(i!=num_samples)
> error();
>
> But is this as efficient as we get it?

Probably. Unless you start to dive into CPU specifics and wander off to
assembly.

> I'm wondering if comparing samples using for instance SIMD
> instructions, for instance, could make it around 4 times faster,
> Something like this:
>
> for(i=0;i<num_samples;i++)
> if(samples[i]!=samples[i]))
> break;
>
> where the samples[i]!=samples[i] test would succeed

You probably already know that, but be careful with this when using
optimizations with this comparison. -ffast-math may void IEEE compat.

> if it was a nan or inf, since INFs and NANs don't behave normally.
>
>
> I don't think this particular example works though (?),
> but perhaps something similar could?
>
> Anyone doing something like this?

In my case it's not only about detecting, but also flushing them to
zero. Depending on what is appropriate for DSP at hand (meters.lv2) I
settled on using math.h's isnan(), !isfinite() or simply adding
something (to minus infinite).

While that's probably not optimal it is portable and architecture
independent, and I don't notice any significant DSP load caused by it.

BTW gcc does not vectorize the isnan/isfinite loop that you've posted:
"control flow in loop" (i386, gcc 4.7.2). No dice when replacing the
break statement in the loop with v |= isfinite(); either. But it
unrolls the loop at least.

Another idea: add the signal (using SSE). If one of the summands is NaN,
the result will be Nan. -- that should effectively take less CPU
(assuming that NaN is non the common case).

brainstormingly yours,
robin
_______________________________________________
Linux-audio-dev mailing list
Linux-audio-dev@email-addr-hidden
http://lists.linuxaudio.org/listinfo/linux-audio-dev
Received on Mon Oct 7 04:15:04 2013

This archive was generated by hypermail 2.1.8 : Mon Oct 07 2013 - 04:15:04 EEST