Chris@184: If you are reading this, it means you think you may be interested in using the SIMD extensions in kissfft Chris@184: to do 4 *separate* FFTs at once. Chris@184: Chris@184: Beware! Beyond here there be dragons! Chris@184: Chris@184: This API is not easy to use, is not well documented, and breaks the KISS principle. Chris@184: Chris@184: Chris@184: Still reading? Okay, you may get rewarded for your patience with a considerable speedup Chris@184: (2-3x) on intel x86 machines with SSE if you are willing to jump through some hoops. Chris@184: Chris@184: The basic idea is to use the packed 4 float __m128 data type as a scalar element. Chris@184: This means that the format is pretty convoluted. It performs 4 FFTs per fft call on signals A,B,C,D. Chris@184: Chris@184: For complex data, the data is interlaced as follows: Chris@184: rA0,rB0,rC0,rD0, iA0,iB0,iC0,iD0, rA1,rB1,rC1,rD1, iA1,iB1,iC1,iD1 ... Chris@184: where "rA0" is the real part of the zeroth sample for signal A Chris@184: Chris@184: Real-only data is laid out: Chris@184: rA0,rB0,rC0,rD0, rA1,rB1,rC1,rD1, ... Chris@184: Chris@184: Compile with gcc flags something like Chris@184: -O3 -mpreferred-stack-boundary=4 -DUSE_SIMD=1 -msse Chris@184: Chris@184: Be aware of SIMD alignment. This is the most likely cause of segfaults. Chris@184: The code within kissfft uses scratch variables on the stack. Chris@184: With SIMD, these must have addresses on 16 byte boundaries. Chris@184: Search on "SIMD alignment" for more info. Chris@184: Chris@184: Chris@184: Chris@184: Robin at Divide Concept was kind enough to share his code for formatting to/from the SIMD kissfft. Chris@184: I have not run it -- use it at your own risk. It appears to do 4xN and Nx4 transpositions Chris@184: (out of place). Chris@184: Chris@184: void SSETools::pack128(float* target, float* source, unsigned long size128) Chris@184: { Chris@184: __m128* pDest = (__m128*)target; Chris@184: __m128* pDestEnd = pDest+size128; Chris@184: float* source0=source; Chris@184: float* source1=source0+size128; Chris@184: float* source2=source1+size128; Chris@184: float* source3=source2+size128; Chris@184: Chris@184: while(pDest