24 #include <lal/LALVCSInfo.h>
25 #include <lal/LALConstants.h>
26 #include <lal/XLALError.h>
27 #include <lal/AVFactories.h>
28 #include <lal/LogPrintf.h>
29 #include <lal/UserInput.h>
31 #include <lal/VectorMath.h>
34 #include <vectorops/VectorMath_internal.h>
37 #define frand() (rand() / (REAL4)RAND_MAX)
38 #define Relerr(dx,x) (fabsf(x)>0 ? fabsf((dx)/(x)) : fabsf(dx) )
39 #define Relerrd(dx,x) (fabs(x)>0 ? fabs((dx)/(x)) : fabs(dx) )
40 #define cRelerr(dx,x) (cabsf(x)>0 ? cabsf((dx)/(x)) : fabsf(dx) )
43 #define TESTBENCH_VECTORMATH_S2I(name,in) \
45 XLAL_CHECK ( XLALVector##name##REAL4_GEN( xOutRefI4->data, in, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
46 tic = XLALGetCPUTime(); \
47 for (UINT4 l=0; l < Nruns; l ++ ) { \
48 XLAL_CHECK ( XLALVector##name##REAL4( xOutI4->data, in, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
50 toc = XLALGetCPUTime(); \
51 for ( UINT4 i = 0; i < Ntrials; i ++ ) \
53 XLAL_CHECK ( xOutI4->data[i] == xOutRefI4->data[i], XLAL_ETOL, "%s: found element #%u (%i) differs from reference (%i)", #name, i, xOutI4->data[i], xOutRefI4->data[i] ); \
55 XLALPrintInfo ( "%-32s: %4.0f Mops/sec\n", XLALVector##name##REAL4_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6 ); \
59 #define TESTBENCH_VECTORMATH_S2S(name,in) \
61 XLAL_CHECK ( XLALVector##name##REAL4_GEN( xOutRef, in, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
62 tic = XLALGetCPUTime(); \
63 for (UINT4 l=0; l < Nruns; l ++ ) { \
64 XLAL_CHECK ( XLALVector##name##REAL4( xOut, in, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
66 toc = XLALGetCPUTime(); \
67 maxErr = maxRelerr = 0; \
68 for ( UINT4 i = 0; i < Ntrials; i ++ ) \
70 REAL4 err = fabsf ( xOut[i] - xOutRef[i] ); \
71 REAL4 relerr = Relerr ( err, xOutRef[i] ); \
72 maxErr = fmaxf ( err, maxErr ); \
73 maxRelerr = fmaxf ( relerr, maxRelerr ); \
75 XLALPrintInfo ( "%-32s: %4.0f Mops/sec [maxErr = %7.2g (tol=%7.2g), maxRelerr = %7.2g (tol=%7.2g)]\n", \
76 XLALVector##name##REAL4_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6, maxErr, (abstol), maxRelerr, (reltol) ); \
77 XLAL_CHECK ( (maxErr <= (abstol)), XLAL_ETOL, "%s: absolute error (%g) exceeds tolerance (%g)\n", #name "REAL4", maxErr, abstol ); \
78 XLAL_CHECK ( (maxRelerr <= (reltol)), XLAL_ETOL, "%s: relative error (%g) exceeds tolerance (%g)\n", #name "REAL4", maxRelerr, reltol ); \
81 #define TESTBENCH_VECTORMATH_S2SS(name,in) \
83 XLAL_CHECK ( XLALVector##name##REAL4_GEN( xOutRef, xOutRef2, xIn, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
84 tic = XLALGetCPUTime(); \
85 for (UINT4 l=0; l < Nruns; l ++ ) { \
86 XLAL_CHECK ( XLALVector##name##REAL4( xOut, xOut2, xIn, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
88 toc = XLALGetCPUTime(); \
89 maxErr = maxRelerr = 0; \
90 for ( UINT4 i = 0; i < Ntrials; i ++ ) { \
91 REAL4 err1 = fabsf ( xOut[i] - xOutRef[i] ); \
92 REAL4 err2 = fabsf ( xOut2[i] - xOutRef2[i] ); \
93 REAL4 relerr1 = Relerr ( err1, xOutRef[i] ); \
94 REAL4 relerr2 = Relerr ( err2, xOutRef2[i] ); \
95 maxErr = fmaxf ( err1, maxErr ); \
96 maxErr = fmaxf ( err2, maxErr ); \
97 maxRelerr = fmaxf ( relerr1, maxRelerr ); \
98 maxRelerr = fmaxf ( relerr2, maxRelerr ); \
100 XLALPrintInfo ( "%-32s: %4.0f Mops/sec [maxErr = %7.2g (tol=%7.2g), maxRelerr = %7.2g (tol=%7.2g)]\n", \
101 XLALVector##name##REAL4_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6, maxErr, (abstol), maxRelerr, reltol ); \
102 XLAL_CHECK ( (maxErr <= (abstol)), XLAL_ETOL, "%s: absolute error (%g) exceeds tolerance (%g)\n", #name "REAL4", maxErr, abstol ); \
103 XLAL_CHECK ( (maxRelerr <= (reltol)), XLAL_ETOL, "%s: relative error (%g) exceeds tolerance (%g)\n", #name "REAL4", maxRelerr, reltol ); \
107 #define TESTBENCH_VECTORMATH_SS2S(name,in1,in2) \
109 XLAL_CHECK ( XLALVector##name##REAL4_GEN( xOutRef, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
110 tic = XLALGetCPUTime(); \
111 for (UINT4 l=0; l < Nruns; l ++ ) { \
112 XLAL_CHECK ( XLALVector##name##REAL4( xOut, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
114 toc = XLALGetCPUTime(); \
115 maxErr = maxRelerr = 0; \
116 for ( UINT4 i = 0; i < Ntrials; i ++ ) \
118 REAL4 err = fabsf ( xOut[i] - xOutRef[i] ); \
119 REAL4 relerr = Relerr ( err, xOutRef[i] ); \
120 maxErr = fmaxf ( err, maxErr ); \
121 maxRelerr = fmaxf ( relerr, maxRelerr ); \
123 XLALPrintInfo ( "%-32s: %4.0f Mops/sec [maxErr = %7.2g (tol=%7.2g), maxRelerr = %7.2g (tol=%7.2g)]\n", \
124 XLALVector##name##REAL4_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6, maxErr, (abstol), maxRelerr, (reltol) ); \
125 XLAL_CHECK ( (maxErr <= (abstol)), XLAL_ETOL, "%s: absolute error (%g) exceeds tolerance (%g)\n", #name "REAL4", maxErr, abstol ); \
126 XLAL_CHECK ( (maxRelerr <= (reltol)), XLAL_ETOL, "%s: relative error (%g) exceeds tolerance (%g)\n", #name "REAL4", maxRelerr, reltol ); \
130 #define TESTBENCH_VECTORMATH_SS2uU(name,in1,in2) \
132 UINT4 xCount = 0, xCountRef = 0; \
133 XLAL_CHECK ( XLALVector##name##REAL4_GEN( &xCountRef, xOutRefU4->data, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
134 tic = XLALGetCPUTime(); \
135 for (UINT4 l=0; l < Nruns; l ++ ) { \
136 XLAL_CHECK ( XLALVector##name##REAL4( &xCount, xOutU4->data, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
137 XLAL_CHECK ( xCount == xCountRef, XLAL_ETOL, "%s: count of found elements (%u) differs from reference (%u)", #name, xCount, xCountRef ); \
139 toc = XLALGetCPUTime(); \
140 for ( UINT4 i = 0; i < xCount; i ++ ) \
142 XLAL_CHECK ( xOutU4->data[i] == xOutRefU4->data[i], XLAL_ETOL, "%s: found element #%u (%u) differs from reference (%u)", #name, i, xOutU4->data[i], xOutRefU4->data[i] ); \
144 XLALPrintInfo ( "%-32s: %4.0f Mops/sec\n", XLALVector##name##REAL4_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6 ); \
147 #define TESTBENCH_VECTORMATH_DD2D(name,in1,in2) \
149 XLAL_CHECK ( XLALVector##name##REAL8_GEN( xOutRefD, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
150 tic = XLALGetCPUTime(); \
151 for (UINT4 l=0; l < Nruns; l ++ ) { \
152 XLAL_CHECK ( XLALVector##name##REAL8( xOutD, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
154 toc = XLALGetCPUTime(); \
155 maxErr = maxRelerr = 0; \
156 for ( UINT4 i = 0; i < Ntrials; i ++ ) \
158 REAL8 err = fabs ( xOutD[i] - xOutRefD[i] ); \
159 REAL8 relerr = Relerrd ( err, xOutRefD[i] ); \
160 maxErr = fmax ( err, maxErr ); \
161 maxRelerr = fmax ( relerr, maxRelerr ); \
163 XLALPrintInfo ( "%-32s: %4.0f Mops/sec [maxErr = %7.2g (tol=%7.2g), maxRelerr = %7.2g (tol=%7.2g)]\n", \
164 XLALVector##name##REAL8_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6, maxErr, (abstol), maxRelerr, (reltol) ); \
165 XLAL_CHECK ( (maxErr <= (abstol)), XLAL_ETOL, "%s: absolute error (%g) exceeds tolerance (%g)\n", #name "REAL8", maxErr, abstol ); \
166 XLAL_CHECK ( (maxRelerr <= (reltol)), XLAL_ETOL, "%s: relative error (%g) exceeds tolerance (%g)\n", #name "REAL8", maxRelerr, reltol ); \
169 #define TESTBENCH_VECTORMATH_CC2C(name,in1,in2) \
171 XLAL_CHECK ( XLALVector##name##COMPLEX8_GEN( xOutRefC, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
172 tic = XLALGetCPUTime(); \
173 for (UINT4 l=0; l < Nruns; l ++ ) { \
174 XLAL_CHECK ( XLALVector##name##COMPLEX8( xOutC, in1, in2, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
176 toc = XLALGetCPUTime(); \
177 maxErr = maxRelerr = 0; \
178 for ( UINT4 i = 0; i < Ntrials; i ++ ) \
180 REAL4 err = cabsf ( xOutC[i] - xOutRefC[i] ); \
181 REAL4 relerr = cRelerr ( err, xOutRefC[i] ); \
182 maxErr = fmaxf ( err, maxErr ); \
183 maxRelerr = fmaxf ( relerr, maxRelerr ); \
185 XLALPrintInfo ( "%-32s: %4.0f Mops/sec [maxErr = %7.2g (tol=%7.2g), maxRelerr = %7.2g (tol=%7.2g)]\n", \
186 XLALVector##name##COMPLEX8_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6, maxErr, (abstol), maxRelerr, (reltol) ); \
187 XLAL_CHECK ( (maxErr <= (abstol)), XLAL_ETOL, "%s: absolute error (%g) exceeds tolerance (%g)\n", #name "COMPLEX8", maxErr, abstol ); \
188 XLAL_CHECK ( (maxRelerr <= (reltol)), XLAL_ETOL, "%s: relative error (%g) exceeds tolerance (%g)\n", #name "COMPLEX8", maxRelerr, reltol ); \
192 #define TESTBENCH_VECTORMATH_D2D(name,in) \
194 XLAL_CHECK ( XLALVector##name##REAL8_GEN( xOutRefD, in, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
195 tic = XLALGetCPUTime(); \
196 for (UINT4 l=0; l < Nruns; l ++ ) { \
197 XLAL_CHECK ( XLALVector##name##REAL8( xOutD, in, Ntrials ) == XLAL_SUCCESS, XLAL_EFUNC ); \
199 toc = XLALGetCPUTime(); \
200 maxErr = maxRelerr = 0; \
201 for ( UINT4 i = 0; i < Ntrials; i ++ ) \
203 REAL8 err = fabs ( xOut[i] - xOutRef[i] ); \
204 REAL8 relerr = Relerrd ( err, xOutRef[i] ); \
205 maxErr = fmax ( err, maxErr ); \
206 maxRelerr = fmax ( relerr, maxRelerr ); \
208 XLALPrintInfo ( "%-32s: %4.0f Mops/sec [maxErr = %7.2g (tol=%7.2g), maxRelerr = %7.2g (tol=%7.2g)]\n", \
209 XLALVector##name##REAL8_name, (REAL8)Ntrials * Nruns / (toc - tic)/1e6, maxErr, (abstol), maxRelerr, (reltol) ); \
210 XLAL_CHECK ( (maxErr <= (abstol)), XLAL_ETOL, "%s: absolute error (%g) exceeds tolerance (%g)\n", #name "REAL8", maxErr, abstol ); \
211 XLAL_CHECK ( (maxRelerr <= (reltol)), XLAL_ETOL, "%s: relative error (%g) exceeds tolerance (%g)\n", #name "REAL8", maxRelerr, reltol ); \
226 main (
int argc,
char *argv[] )
236 XLALRegisterUvarMember( Nruns,
INT4,
'r', OPTIONAL,
"Number of repeated timing 'runs' to average over (=improves variance)" );
237 XLALRegisterUvarMember( inAlign,
INT4,
'a', OPTIONAL,
"Alignment of input vectors; default is sizeof(void*), i.e. no particular alignment" );
238 XLALRegisterUvarMember( outAlign,
INT4,
'b', OPTIONAL,
"Alignment of output vectors; default is sizeof(void*), i.e. no particular alignment" );
250 UINT4 Ntrials = 1000000 + 7;
304 REAL4 maxErr = 0, maxRelerr = 0;
305 REAL4 abstol, reltol;
307 for (
UINT4 i = 0; i < Ntrials; i ++ ) {
308 xIn[i] = 2000 * (
frand() - 0.5 );
310 abstol = 2e-7, reltol = 1e-5;
317 XLALPrintInfo (
"Testing sin(x), cos(x) for x in [-1000, 1000]\n");
332 for (
UINT4 i = 0; i < Ntrials; i ++ ) {
333 xIn[i] = 20 * (
frand() - 0.5 );
336 abstol = 4e-3, reltol = 3e-7;
341 for (
UINT4 i = 0; i < Ntrials; i ++ ) {
342 xIn[i] = 10000.0f *
frand() + 1e-6;
344 abstol = 2e-6, reltol = 4e-7;
349 for (
UINT4 i = 0; i < Ntrials; i ++ ) {
350 xIn[i] = -10000.0f + 20000.0f *
frand() + 1e-6;
351 xIn2[i] = -10000.0f + 20000.0f *
frand() + 1e-6;
352 xInD[i] = -100000.0 + 200000.0 *
frand() + 1e-6;
353 xIn2D[i]= -100000.0 + 200000.0 *
frand() + 1e-6;
354 xInC[i] = -10000.0f + 20000.0f *
frand() + 1e-6 + ( -10000.0f + 20000.0f *
frand() + 1e-6 ) * _Complex_I;
355 xIn2C[i]= -10000.0f + 20000.0f *
frand() + 1e-6 + ( -10000.0f + 20000.0f *
frand() + 1e-6 ) * _Complex_I;
357 abstol = 2e-7, reltol = 2e-7;
359 XLALPrintInfo (
"\nTesting round(x) for x in (-10000, 10000]\n");
363 XLALPrintInfo (
"\nTesting add,multiply,shift,scale(x,y) for x,y in (-10000, 10000]\n");
387 for (
UINT4 i = 0; i < Ntrials; i ++ ) {
388 xIn[i] = -10000.0f + 20000.0f *
frand() + 1e-6;
389 xIn2[i] = -10000.0f + 20000.0f *
frand() + 1e-6;
392 XLALPrintInfo (
"\nTesting find for x,y in (-10000, 10000]\n");
void LALCheckMemoryLeaks(void)
const LALVCSInfoList lalVCSInfoList
NULL-terminated list of VCS and build information for LAL and its dependencies
int main(int argc, char *argv[])
#define TESTBENCH_VECTORMATH_D2D(name, in)
#define TESTBENCH_VECTORMATH_SS2uU(name, in1, in2)
#define TESTBENCH_VECTORMATH_S2S(name, in)
#define TESTBENCH_VECTORMATH_S2I(name, in)
#define TESTBENCH_VECTORMATH_DD2D(name, in1, in2)
#define TESTBENCH_VECTORMATH_S2SS(name, in)
#define TESTBENCH_VECTORMATH_SS2S(name, in1, in2)
#define TESTBENCH_VECTORMATH_CC2C(name, in1, in2)
int XLALPrintInfo(const char *fmt,...)
unsigned char BOOLEAN
Boolean logical type, see Headers LAL(Atomic)Datatypes.h for more details.
double REAL8
Double precision real floating-point number (8 bytes).
#define XLAL_INIT_DECL(var,...)
C99 MACRO to declare and zero-initialize a variable, use as "type XLAL_INIT_DECL(var);".
uint32_t UINT4
Four-byte unsigned integer.
float complex COMPLEX8
Single-precision floating-point complex number (8 bytes total)
int32_t INT4
Four-byte signed integer.
float REAL4
Single precision real floating-point number (4 bytes).
INT4Vector * XLALCreateINT4Vector(UINT4 length)
void XLALDestroyUINT4Vector(UINT4Vector *vector)
UINT4Vector * XLALCreateUINT4Vector(UINT4 length)
void XLALDestroyINT4Vector(INT4Vector *vector)
void XLALDestroyREAL4VectorAligned(REAL4VectorAligned *in)
Free a REAL4VectorAligned struct.
COMPLEX8VectorAligned * XLALCreateCOMPLEX8VectorAligned(const UINT4 length, const UINT4 align)
Create a new COMPLEX8VectorAligned struct with length length and alignment align.
void XLALDestroyREAL8VectorAligned(REAL8VectorAligned *in)
Free a REAL8VectorAligned struct.
REAL8VectorAligned * XLALCreateREAL8VectorAligned(const UINT4 length, const UINT4 align)
Create a new REAL8VectorAligned struct with length length and alignment align.
REAL4VectorAligned * XLALCreateREAL4VectorAligned(const UINT4 length, const UINT4 align)
Create a new REAL4VectorAligned struct with length length and alignment align.
void XLALDestroyCOMPLEX8VectorAligned(COMPLEX8VectorAligned *in)
Free a COMPLEX8VectorAligned struct.
#define XLAL_CHECK(assertion,...)
Macro to test an assertion and invoke a failure if it is not true in a function that returns an integ...
@ XLAL_SUCCESS
Success return value (not an error number)
@ XLAL_EFUNC
Internal function call failed bit: "or" this with existing error number.
@ XLAL_EDOM
Input domain error.
A special COMPLEX8Vector with n-byte aligned memory data array.
COMPLEX8 * data
start of aligned memory block
Vector of type INT4, see DATATYPE-Vector types for more details.
A special REAL4Vector with n-byte aligned memory data array.
REAL4 * data
start of aligned memory block
A special REAL8Vector with n-byte aligned memory data array.
REAL8 * data
start of aligned memory block
Vector of type UINT4, see DATATYPE-Vector types for more details.