On 08/02/2012 02:06 PM, Harry van Haaren wrote:
Hi all,
I've working on a LV2 instrument plugin, and it consumes about 1-2% CPU on
idle. When I leave it for about 20 seconds, the CPU usage jumps to 38 / 40
% of a core, and JACK xruns. The code contains IIR's for a reverb effect,
so I'm going to blame this CPU burning on denormal values.
I'm using waf as the build system, and appending "-O3" and
"-ffast-math" to
the CFLAGS and CXXFLAGS. Building with ./waf -v shows the runner thread to
have the "-O3" and "-ffast-math" in the command.
Yet when I run it it still hogs CPU after about 10-20 seconds.
Reading on gcc's pages (
http://www.acsu.buffalo.edu/~charngda/cc.html) tells
me that if DenomalsAreZero and FlushToZero are set, it should be linked
with crtfastmath.o. I don't know how to check if this is happening?
Hi Harry,
IIRC those CPU/Compiler FlushToZero workarounds only work with SSE. try
adding `-msse -mfpmath=sse` to the CFLAGS.
I'm not sure where to look next to fix the
problem. Help appreciated!
-Harry
Simply add a small value to the every input sample (before it enters the
IR or filter stage). -- Small being around (1e-20).
Alternatively you could use some "if" clauses
#define DENORMALTOZERO(x) \
if (((*(unsigned int *) &(x)) & 0x7f800000) == 0) x = 0;
#define SMALLVALUETOZERO(x) \
if (x < 1e-30) x = 0;
More info is at
http://carlh.net/plugins/denormals.php
HTH,
robin