Loading [MathJax]/extensions/TeX/AMSsymbols.js
LAL 7.7.0.1-5e288d3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
VectorMath.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015 Reinhard Prix, Karl Wette
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with with program; see the file COPYING. If not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
17 * MA 02110-1301 USA
18 *
19 */
20
21#ifndef _VECTORMATH_H
22#define _VECTORMATH_H
23
24#include <lal/LALStdlib.h>
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/**
31 * \defgroup VectorMath_h Header VectorMath.h
32 * \ingroup lal_vectorops
33 * \author Reinhard Prix, Karl Wette
34 *
35 * \brief Functions for performing fast math on vectors of numbers, using SIMD (SSE, AVX, ...) instructions if available.
36 *
37 * ### Synopsis ###
38 *
39 * \code
40 * #include <lal/VectorMath.h>
41 * \endcode
42 *
43 * ### Alignment ###
44 *
45 * Neither input nor output vectors are \b required to have any particular memory alignment. Nevertheless, performance
46 * \e may be improved if vectors are 16-byte aligned for SSE, and 32-byte aligned for AVX.
47 */
48/** @{ */
49
50/** \name Failsafe Aligned Memory Handling */
51/** @{ */
52
53/** A special \c UINT4Vector with n-byte aligned memory \c data array */
54typedef struct tagUINT4VectorAligned {
55 UINT4 length; /**< number of 'usable' array entries (fully aligned) */
56 UINT4 *data; /**< start of aligned memory block */
57 UINT4 *data0; /**< actual physical start of memory block, possibly not aligned */
59
60/** Create a new \c UINT4VectorAligned struct with length \c length and alignment \c align */
62
63/** Resize an existing \c UINT4VectorAligned struct to length \c length and alignment \c align */
65
66/** Free a \c UINT4VectorAligned struct */
68
69/** A special \c REAL4Vector with n-byte aligned memory \c data array */
70typedef struct tagREAL4VectorAligned {
71 UINT4 length; /**< number of 'usable' array entries (fully aligned) */
72 REAL4 *data; /**< start of aligned memory block */
73 REAL4 *data0; /**< actual physical start of memory block, possibly not aligned */
75
76/** Create a new \c REAL4VectorAligned struct with length \c length and alignment \c align */
78
79/** Resize an existing \c REAL4VectorAligned struct to length \c length and alignment \c align */
81
82/** Free a \c REAL4VectorAligned struct */
84
85/** A special \c REAL8Vector with n-byte aligned memory \c data array */
86typedef struct tagREAL8VectorAligned {
87 UINT4 length; /**< number of 'usable' array entries (fully aligned) */
88 REAL8 *data; /**< start of aligned memory block */
89 REAL8 *data0; /**< actual physical start of memory block, possibly not aligned */
91
92/** Create a new \c REAL8VectorAligned struct with length \c length and alignment \c align */
94
95/** Resize an existing \c REAL8VectorAligned struct to length \c length and alignment \c align */
97
98/** Free a \c REAL8VectorAligned struct */
100
101/** A special \c COMPLEX8Vector with n-byte aligned memory \c data array */
102typedef struct tagCOMPLEX8VectorAligned {
103 UINT4 length; /**< number of 'usable' array entries (fully aligned) */
104 COMPLEX8 *data; /**< start of aligned memory block */
105 COMPLEX8 *data0; /**< actual physical start of memory block, possibly not aligned */
107
108/** Create a new \c COMPLEX8VectorAligned struct with length \c length and alignment \c align */
110
111/** Resize an existing \c COMPLEX8VectorAligned struct to length \c length and alignment \c align */
113
114/** Free a \c COMPLEX8VectorAligned struct */
116
117/** A special \c COMPLEX16Vector with n-byte aligned memory \c data array */
118typedef struct tagCOMPLEX16VectorAligned {
119 UINT4 length; /**< number of 'usable' array entries (fully aligned) */
120 COMPLEX16 *data; /**< start of aligned memory block */
121 COMPLEX16 *data0; /**< actual physical start of memory block, possibly not aligned */
123
124/** Create a new \c COMPLEX16VectorAligned struct with length \c length and alignment \c align */
126
127/** Resize an existing \c COMPLEX16VectorAligned struct to length \c length and alignment \c align */
129
130/** Free a \c COMPLEX16VectorAligned struct */
132
133/** @} */
134
135/** \name Vector Math Functions */
136/** @{ */
137
138/** Cast (i.e. truncate) REAL4 vector \c in to INT4 vector \c out, with \c len elements. */
139int XLALVectorINT4FromREAL4 ( INT4 *out, const REAL4 *in, const UINT4 len );
140
141/** Compute \f$\text{out} = \max(\text{in}_0, \text{in}_1, \cdots)\f$ over REAL4 vector \c in with \c len elements */
142int XLALVectorScalarMaxREAL4 ( REAL4 *out, const REAL4 *in, const UINT4 len );
143
144/** Compute \f$\text{out} = \max(\text{in}_0, \text{in}_1, \cdots)\f$ over REAL8 vector \c in with \c len elements */
145int XLALVectorScalarMaxREAL8 ( REAL8 *out, const REAL8 *in, const UINT4 len );
146
147/** Compute \f$\text{out} = \sin(\text{in})\f$ over REAL4 vectors \c out, \c in with \c len elements */
148int XLALVectorSinREAL4 ( REAL4 *out, const REAL4 *in, const UINT4 len );
149
150/** Compute \f$\text{out} = \cos(\text{in})\f$ over REAL4 vectors \c out, \c in with \c len elements */
151int XLALVectorCosREAL4 ( REAL4 *out, const REAL4 *in, const UINT4 len );
152
153/** Compute \f$\text{out} = \exp(\text{in})\f$ over REAL4 vectors \c out, \c in with \c len elements */
154int XLALVectorExpREAL4 ( REAL4 *out, const REAL4 *in, const UINT4 len );
155
156/** Compute \f$\text{out} = \log(\text{in})\f$ over REAL4 vectors \c out, \c in with \c len elements */
157int XLALVectorLogREAL4 ( REAL4 *out, const REAL4 *in, const UINT4 len );
158
159/** Compute \f$\text{out} = round ( \text{in} )\f$ over REAL4 vectors \c out, \c in with \c len elements */
160int XLALVectorRoundREAL4 ( REAL4 *out, const REAL4 *in, const UINT4 len);
161
162/** Compute \f$\text{out} = round ( \text{in} )\f$ over REAL8 vectors \c out, \c in with \c len elements */
163int XLALVectorRoundREAL8 ( REAL8 *out, const REAL8 *in, const UINT4 len);
164
165/** Compute \f$\text{out1} = \sin(\text{in}), \text{out2} = \cos(\text{in})\f$ over REAL4 vectors \c out1, \c out2, \c in with \c len elements */
166int XLALVectorSinCosREAL4 ( REAL4 *out1, REAL4 *out2, const REAL4 *in, const UINT4 len );
167
168/** Compute \f$\text{out1} = \sin(2\pi \text{in}), \text{out2} = \cos(2\pi \text{in})\f$ over REAL4 vectors \c out1, \c out2, \c in with \c len elements */
169int XLALVectorSinCos2PiREAL4 ( REAL4 *out1, REAL4 *out2, const REAL4 *in, const UINT4 len );
170
171/** @} */
172
173/** \name Vector by Vector Operations */
174/** @{ */
175
176/** Compute \f$\text{out} = \text{in1} + \text{in2}\f$ over REAL4 vectors \c in1 and \c in2 with \c len elements */
177int XLALVectorAddREAL4 ( REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len);
178
179/** Compute \f$\text{out} = \text{in1} - \text{in2}\f$ over REAL4 vectors \c in1 and \c in2 with \c len elements */
180int XLALVectorSubREAL4 ( REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len);
181
182/** Compute \f$\text{out} = \text{in1} \times \text{in2}\f$ over REAL4 vectors \c in1 and \c in2 with \c len elements */
183int XLALVectorMultiplyREAL4 ( REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len);
184
185/** Compute \f$\text{out} = max ( \text{in1}, \text{in2} )\f$ over REAL4 vectors \c in1 and \c in2 with \c len elements */
186int XLALVectorMaxREAL4 ( REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len);
187
188/** Compute \f$\text{out} = \text{in1} + \text{in2}\f$ over REAL8 vectors \c in1 and \c in2 with \c len elements */
189int XLALVectorAddREAL8 ( REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len);
190
191/** Compute \f$\text{out} = \text{in1} - \text{in2}\f$ over REAL8 vectors \c in1 and \c in2 with \c len elements */
192int XLALVectorSubREAL8 ( REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len);
193
194/** Compute \f$\text{out} = \text{in1} \times \text{in2}\f$ over REAL8 vectors \c in1 and \c in2 with \c len elements */
195int XLALVectorMultiplyREAL8 ( REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len);
196
197/** Compute \f$\text{out} = max ( \text{in1}, \text{in2} )\f$ over REAL8 vectors \c in1 and \c in2 with \c len elements */
198int XLALVectorMaxREAL8 ( REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len);
199
200/** Compute \f$\text{out} = \text{in1} \times \text{in2}\f$ over COMPLEX8 vectors \c in1 and \c in2 with \c len elements */
201int XLALVectorMultiplyCOMPLEX8 ( COMPLEX8 *out, const COMPLEX8 *in1, const COMPLEX8 *in2, const UINT4 len );
202
203/** Compute \f$\text{out} = \text{in1} + \text{in2}\f$ over COMPLEX8 vectors \c in1 and \c in2 with \c len elements */
204int XLALVectorAddCOMPLEX8 ( COMPLEX8 *out, const COMPLEX8 *in1, const COMPLEX8 *in2, const UINT4 len);
205
206/** @} */
207
208/** \name Vector by Scalar Operations */
209/** @{ */
210
211/** Compute \f$\text{out} = \text{scalar} + \text{in}\f$ over REAL4 vector \c in with \c len elements */
212int XLALVectorShiftREAL4 ( REAL4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len);
213
214/** Compute \f$\text{out} = \text{scalar} \times \text{in}\f$ over REAL4 vector \c in with \c len elements */
215int XLALVectorScaleREAL4 ( REAL4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len);
216
217/** Compute \f$\text{out} = \text{scalar} \times \text{in1} + \text{in2}\f$ over REAL4 vectors \c in1 and \c in2 with \c len elements */
218int XLALVectorScaleAddREAL4 ( REAL4 *out, REAL4 scalar, const REAL4 *in1, const REAL4 *in2, const UINT4 len);
219
220/** Compute \f$\text{out} = \text{scalar} + \text{in}\f$ over REAL8 vector \c in with \c len elements */
221int XLALVectorShiftREAL8 ( REAL8 *out, REAL8 scalar, const REAL8 *in, const UINT4 len);
222
223/** Compute \f$\text{out} = \text{scalar} \times \text{in}\f$ over REAL8 vector \c in with \c len elements */
224int XLALVectorScaleREAL8 ( REAL8 *out, REAL8 scalar, const REAL8 *in, const UINT4 len);
225
226/** Compute \f$\text{out} = \text{scalar} \times \text{in1} + \text{in2}\f$ over REAL8 vectors \c in1 and \c in2 with \c len elements */
227int XLALVectorScaleAddREAL8 ( REAL8 *out, REAL8 scalar, const REAL8 *in1, const REAL8 *in2, const UINT4 len);
228
229/** Compute \f$\text{out} = \text{scalar} + \text{in}\f$ over COMPLEX8 vector \c in with \c len elements */
230int XLALVectorShiftCOMPLEX8 ( COMPLEX8 *out, COMPLEX8 scalar, const COMPLEX8 *in, const UINT4 len);
231
232/** Compute \f$\text{out} = \text{scalar} \times \text{in}\f$ over COMPLEX8 vector \c in with \c len elements */
233int XLALVectorScaleCOMPLEX8 ( COMPLEX8 *out, COMPLEX8 scalar, const COMPLEX8 *in, const UINT4 len);
234
235/** Compute \f$\text{out} = \text{scalar} \times \text{in1} + \text{in2}\f$ over COMPLEX8 vectors \c in1 and \c in2 with \c len elements */
236int XLALVectorScaleAddCOMPLEX8 ( COMPLEX8 *out, REAL4 scalar, const COMPLEX8 *in1, const COMPLEX8 *in2, const UINT4 len);
237
238/** @} */
239
240/** \name Vector Element Finding Operations */
241/** @{ */
242
243/** Count and return indexes (in \c count and \c out respectively) of vector elements where \f$\text{in1} \le \text{in2}\f$ */
244int XLALVectorFindVectorLessEqualREAL4( UINT4* count, UINT4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len );
245
246/** Count and return indexes (in \c count and \c out respectively) of vector elements where \f$\text{scalar} \le \text{in2}\f$ */
247int XLALVectorFindScalarLessEqualREAL4( UINT4* count, UINT4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len );
248
249/** @} */
250
251/** @} */
252
253#ifdef __cplusplus
254}
255#endif
256
257#endif /* _VECTORMATH_H */
double complex COMPLEX16
Double-precision floating-point complex number (16 bytes total)
double REAL8
Double precision real floating-point number (8 bytes).
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).
int XLALVectorScaleAddREAL8(REAL8 *out, REAL8 scalar, const REAL8 *in1, const REAL8 *in2, const UINT4 len)
Compute over REAL8 vectors in1 and in2 with len elements.
int XLALVectorScaleAddREAL4(REAL4 *out, REAL4 scalar, const REAL4 *in1, const REAL4 *in2, const UINT4 len)
Compute over REAL4 vectors in1 and in2 with len elements.
int XLALVectorSinCosREAL4(REAL4 *out1, REAL4 *out2, const REAL4 *in, const UINT4 len)
Compute over REAL4 vectors out1, out2, in with len elements.
int XLALVectorScaleREAL4(REAL4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len)
Compute over REAL4 vector in with len elements.
int XLALVectorLogREAL4(REAL4 *out, const REAL4 *in, const UINT4 len)
Compute over REAL4 vectors out, in with len elements.
COMPLEX16VectorAligned * XLALResizeCOMPLEX16VectorAligned(COMPLEX16VectorAligned *in, const UINT4 length, const UINT4 align)
Resize an existing COMPLEX16VectorAligned struct to length length and alignment align.
void XLALDestroyREAL4VectorAligned(REAL4VectorAligned *in)
Free a REAL4VectorAligned struct.
int XLALVectorRoundREAL4(REAL4 *out, const REAL4 *in, const UINT4 len)
Compute over REAL4 vectors out, in with len elements.
int XLALVectorSubREAL4(REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len)
Compute over REAL4 vectors in1 and in2 with len elements.
int XLALVectorSubREAL8(REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len)
Compute over REAL8 vectors in1 and in2 with len elements.
REAL8VectorAligned * XLALCreateREAL8VectorAligned(const UINT4 length, const UINT4 align)
Create a new REAL8VectorAligned struct with length length and alignment align.
int XLALVectorScalarMaxREAL8(REAL8 *out, const REAL8 *in, const UINT4 len)
Compute over REAL8 vector in with len elements.
int XLALVectorScalarMaxREAL4(REAL4 *out, const REAL4 *in, const UINT4 len)
Compute over REAL4 vector in with len elements.
int XLALVectorMultiplyCOMPLEX8(COMPLEX8 *out, const COMPLEX8 *in1, const COMPLEX8 *in2, const UINT4 len)
Compute over COMPLEX8 vectors in1 and in2 with len elements.
int XLALVectorAddCOMPLEX8(COMPLEX8 *out, const COMPLEX8 *in1, const COMPLEX8 *in2, const UINT4 len)
Compute over COMPLEX8 vectors in1 and in2 with len elements.
int XLALVectorShiftCOMPLEX8(COMPLEX8 *out, COMPLEX8 scalar, const COMPLEX8 *in, const UINT4 len)
Compute over COMPLEX8 vector in with len elements.
void XLALDestroyREAL8VectorAligned(REAL8VectorAligned *in)
Free a REAL8VectorAligned struct.
REAL8VectorAligned * XLALResizeREAL8VectorAligned(REAL8VectorAligned *in, const UINT4 length, const UINT4 align)
Resize an existing REAL8VectorAligned struct to length length and alignment align.
int XLALVectorMaxREAL8(REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len)
Compute over REAL8 vectors in1 and in2 with len elements.
void XLALDestroyCOMPLEX16VectorAligned(COMPLEX16VectorAligned *in)
Free a COMPLEX16VectorAligned struct.
int XLALVectorScaleAddCOMPLEX8(COMPLEX8 *out, REAL4 scalar, const COMPLEX8 *in1, const COMPLEX8 *in2, const UINT4 len)
Compute over COMPLEX8 vectors in1 and in2 with len elements.
UINT4VectorAligned * XLALResizeUINT4VectorAligned(UINT4VectorAligned *in, const UINT4 length, const UINT4 align)
Resize an existing UINT4VectorAligned struct to length length and alignment align.
int XLALVectorMultiplyREAL8(REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len)
Compute over REAL8 vectors in1 and in2 with len elements.
int XLALVectorFindVectorLessEqualREAL4(UINT4 *count, UINT4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len)
Count and return indexes (in count and out respectively) of vector elements where .
COMPLEX8VectorAligned * XLALResizeCOMPLEX8VectorAligned(COMPLEX8VectorAligned *in, const UINT4 length, const UINT4 align)
Resize an existing COMPLEX8VectorAligned struct to length length and alignment align.
REAL4VectorAligned * XLALCreateREAL4VectorAligned(const UINT4 length, const UINT4 align)
Create a new REAL4VectorAligned struct with length length and alignment align.
int XLALVectorINT4FromREAL4(INT4 *out, const REAL4 *in, const UINT4 len)
Cast (i.e.
int XLALVectorSinCos2PiREAL4(REAL4 *out1, REAL4 *out2, const REAL4 *in, const UINT4 len)
Compute over REAL4 vectors out1, out2, in with len elements.
COMPLEX8VectorAligned * XLALCreateCOMPLEX8VectorAligned(const UINT4 length, const UINT4 align)
Create a new COMPLEX8VectorAligned struct with length length and alignment align.
void XLALDestroyUINT4VectorAligned(UINT4VectorAligned *in)
Free a UINT4VectorAligned struct.
int XLALVectorShiftREAL8(REAL8 *out, REAL8 scalar, const REAL8 *in, const UINT4 len)
Compute over REAL8 vector in with len elements.
int XLALVectorMaxREAL4(REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len)
Compute over REAL4 vectors in1 and in2 with len elements.
int XLALVectorScaleREAL8(REAL8 *out, REAL8 scalar, const REAL8 *in, const UINT4 len)
Compute over REAL8 vector in with len elements.
int XLALVectorRoundREAL8(REAL8 *out, const REAL8 *in, const UINT4 len)
Compute over REAL8 vectors out, in with len elements.
int XLALVectorAddREAL4(REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len)
Compute over REAL4 vectors in1 and in2 with len elements.
int XLALVectorAddREAL8(REAL8 *out, const REAL8 *in1, const REAL8 *in2, const UINT4 len)
Compute over REAL8 vectors in1 and in2 with len elements.
UINT4VectorAligned * XLALCreateUINT4VectorAligned(const UINT4 length, const UINT4 align)
Create a new UINT4VectorAligned struct with length length and alignment align.
COMPLEX16VectorAligned * XLALCreateCOMPLEX16VectorAligned(const UINT4 length, const UINT4 align)
Create a new COMPLEX16VectorAligned struct with length length and alignment align.
int XLALVectorExpREAL4(REAL4 *out, const REAL4 *in, const UINT4 len)
Compute over REAL4 vectors out, in with len elements.
REAL4VectorAligned * XLALResizeREAL4VectorAligned(REAL4VectorAligned *in, const UINT4 length, const UINT4 align)
Resize an existing REAL4VectorAligned struct to length length and alignment align.
void XLALDestroyCOMPLEX8VectorAligned(COMPLEX8VectorAligned *in)
Free a COMPLEX8VectorAligned struct.
int XLALVectorMultiplyREAL4(REAL4 *out, const REAL4 *in1, const REAL4 *in2, const UINT4 len)
Compute over REAL4 vectors in1 and in2 with len elements.
int XLALVectorCosREAL4(REAL4 *out, const REAL4 *in, const UINT4 len)
Compute over REAL4 vectors out, in with len elements.
int XLALVectorShiftREAL4(REAL4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len)
Compute over REAL4 vector in with len elements.
int XLALVectorFindScalarLessEqualREAL4(UINT4 *count, UINT4 *out, REAL4 scalar, const REAL4 *in, const UINT4 len)
Count and return indexes (in count and out respectively) of vector elements where .
int XLALVectorSinREAL4(REAL4 *out, const REAL4 *in, const UINT4 len)
Compute over REAL4 vectors out, in with len elements.
int XLALVectorScaleCOMPLEX8(COMPLEX8 *out, COMPLEX8 scalar, const COMPLEX8 *in, const UINT4 len)
Compute over COMPLEX8 vector in with len elements.
A special COMPLEX16Vector with n-byte aligned memory data array.
Definition: VectorMath.h:118
COMPLEX16 * data
start of aligned memory block
Definition: VectorMath.h:120
UINT4 length
number of 'usable' array entries (fully aligned)
Definition: VectorMath.h:119
COMPLEX16 * data0
actual physical start of memory block, possibly not aligned
Definition: VectorMath.h:121
A special COMPLEX8Vector with n-byte aligned memory data array.
Definition: VectorMath.h:102
COMPLEX8 * data
start of aligned memory block
Definition: VectorMath.h:104
COMPLEX8 * data0
actual physical start of memory block, possibly not aligned
Definition: VectorMath.h:105
UINT4 length
number of 'usable' array entries (fully aligned)
Definition: VectorMath.h:103
A special REAL4Vector with n-byte aligned memory data array.
Definition: VectorMath.h:70
REAL4 * data0
actual physical start of memory block, possibly not aligned
Definition: VectorMath.h:73
UINT4 length
number of 'usable' array entries (fully aligned)
Definition: VectorMath.h:71
REAL4 * data
start of aligned memory block
Definition: VectorMath.h:72
A special REAL8Vector with n-byte aligned memory data array.
Definition: VectorMath.h:86
REAL8 * data
start of aligned memory block
Definition: VectorMath.h:88
REAL8 * data0
actual physical start of memory block, possibly not aligned
Definition: VectorMath.h:89
UINT4 length
number of 'usable' array entries (fully aligned)
Definition: VectorMath.h:87
A special UINT4Vector with n-byte aligned memory data array.
Definition: VectorMath.h:54
UINT4 * data0
actual physical start of memory block, possibly not aligned
Definition: VectorMath.h:57
UINT4 length
number of 'usable' array entries (fully aligned)
Definition: VectorMath.h:55
UINT4 * data
start of aligned memory block
Definition: VectorMath.h:56