DMRITool  v0.1.1-139-g860d86b4
Diffusion MRI Tool
utlCoreMKL.h
Go to the documentation of this file.
1 
17 #ifndef __utlCoreMKL_h
18 #define __utlCoreMKL_h
19 
20 #include <cmath>
21 
22 #ifdef UTL_USE_MKL
23 #include "utlMKL.h"
24 #endif
25 
28 namespace utl
29 {
30 
31 // interfaces to a few functions from the intel Vector Mathematical Library
33 template <typename T> void vAdd( int n, T* vecIn, T* vecIn2, T* vecOut);
35 template <typename T> void vSub( int n, T* vecIn, T* vecIn2, T* vecOut);
37 template <typename T> void vMul( int n, T* vecIn, T* vecIn2, T* vecOut);
39 template <typename T> void vDiv( int n, T* vecIn, T* vecIn2, T* vecOut);
41 template <typename T> void vSqr( int n, T* vecIn, T* vecOut);
43 template <typename T> void vAbs( int n, T* vecIn, T* vecOut);
45 template <typename T> void vExp( int n, T* vecIn, T* vecOut);
47 template <typename T> void vInv( int n, T* vecIn, T* vecOut);
49 template <typename T> void vSqrt( int n, T* vecIn, T* vecOut);
51 template <typename T> void vInvSqrt( int n, T* vecIn, T* vecOut);
53 template <typename T> void vCos( int n, T* vecIn, T* vecOut);
55 template <typename T> void vSin( int n, T* vecIn, T* vecOut);
56 
57 
58 #ifdef UTL_USE_MKL
59 
61 template <> inline void
62 vSqr<double>( int n, double* vecIn, double* vecOut)
63 {
64  vdSqr(n,vecIn,vecOut);
65 }
67 template <> inline void
68 vSqr<float>( int n, float* vecIn, float* vecOut)
69 {
70  vsSqr(n,vecIn,vecOut);
71 }
72 template <> inline void
73 vSqrt<double>( int n, double* vecIn, double* vecOut)
74 {
75  vdSqrt(n,vecIn,vecOut);
76 }
78 template <> inline void
79 vSqrt<float>( int n, float* vecIn, float* vecOut)
80 {
81  vsSqrt(n,vecIn,vecOut);
82 }
83 template <> inline void
84 vSqrt<std::complex<double> >( int n, std::complex<double>* vecIn, std::complex<double>* vecOut)
85 {
86  vzSqrt(n,vecIn,vecOut);
87 }
89 template <> inline void
90 vSqrt<std::complex<float> >( int n, std::complex<float>* vecIn, std::complex<float>* vecOut)
91 {
92  vcSqrt(n,vecIn,vecOut);
93 }
94 template <> inline void
95 vInvSqrt<double>( int n, double* vecIn, double* vecOut)
96 {
97  vdInvSqrt(n,vecIn,vecOut);
98 }
100 template <> inline void
101 vInvSqrt<float>( int n, float* vecIn, float* vecOut)
102 {
103  vsInvSqrt(n,vecIn,vecOut);
104 }
105 
107 template <> inline void
108 vSub<double>( int n, double* vecIn, double* vecIn2, double* vecOut)
109 {
110  vdSub(n,vecIn,vecIn2,vecOut);
111 }
113 template <> inline void
114 vSub<float>( int n, float* vecIn, float* vecIn2, float* vecOut)
115 {
116  vsSub(n,vecIn,vecIn2,vecOut);
117 }
118 template <> inline void
119 vSub<std::complex<double> >( int n, std::complex<double>* vecIn, std::complex<double>* vecIn2, std::complex<double>* vecOut)
120 {
121  vzSub(n,vecIn,vecIn2,vecOut);
122 }
123 template <> inline void
124 vSub<std::complex<float> >( int n, std::complex<float>* vecIn, std::complex<float>* vecIn2, std::complex<float>* vecOut)
125 {
126  vcSub(n,vecIn,vecIn2,vecOut);
127 }
129 template <> inline void
130 vDiv<double>( int n, double* vecIn, double* vecIn2, double* vecOut)
131 {
132  vdDiv(n,vecIn,vecIn2,vecOut);
133 }
135 template <> inline void
136 vDiv<float>( int n, float* vecIn, float* vecIn2, float* vecOut)
137 {
138  vsDiv(n,vecIn,vecIn2,vecOut);
139 }
140 template <> inline void
141 vDiv<std::complex<double> >( int n, std::complex<double>* vecIn, std::complex<double>* vecIn2, std::complex<double>* vecOut)
142 {
143  vzDiv(n,vecIn,vecIn2,vecOut);
144 }
145 template <> inline void
146 vDiv<std::complex<float> >( int n, std::complex<float>* vecIn, std::complex<float>* vecIn2, std::complex<float>* vecOut)
147 {
148  vcDiv(n,vecIn,vecIn2,vecOut);
149 }
151 template <> inline void
152 vExp<double>( int n, double* vecIn, double* vecOut)
153 {
154  vdExp(n,vecIn,vecOut);
155 }
157 template <> inline void
158 vExp<float>( int n, float* vecIn, float* vecOut)
159 {
160  vsExp(n,vecIn,vecOut);
161 }
163 template <> inline void
164 vCos<double>( int n, double* vecIn, double* vecOut)
165 {
166  vdCos(n,vecIn,vecOut);
167 }
169 template <> inline void
170 vCos<float>( int n, float* vecIn, float* vecOut)
171 {
172  vsCos(n,vecIn,vecOut);
173 }
175 template <> inline void
176 vSin<double>( int n, double* vecIn, double* vecOut)
177 {
178  vdSin(n,vecIn,vecOut);
179 }
181 template <> inline void
182 vSin<float>( int n, float* vecIn, float* vecOut)
183 {
184  vsSin(n,vecIn,vecOut);
185 }
187 template <> inline void
188 vInv<double>( int n, double* vecIn, double* vecOut)
189 {
190  vdInv(n,vecIn,vecOut);
191 }
193 template <> inline void
194 vInv<float>( int n, float* vecIn, float* vecOut)
195 {
196  vsInv(n,vecIn,vecOut);
197 }
199 template <> inline void
200 vAdd<double>( int n, double* vecIn, double* vecIn2, double* vecOut)
201 {
202  vdAdd(n,vecIn,vecIn2,vecOut);
203 }
205 template <> inline void
206 vAdd<float>( int n, float* vecIn, float* vecIn2, float* vecOut)
207 {
208  vsAdd(n,vecIn,vecIn2,vecOut);
209 }
211 template <> inline void
212 vMul<double>( int n, double* vecIn, double* vecIn2, double* vecOut)
213 {
214  vdMul(n,vecIn,vecIn2,vecOut);
215 }
217 template <> inline void
218 vMul<float>( int n, float* vecIn, float* vecIn2, float* vecOut)
219 {
220  vsMul(n,vecIn,vecIn2,vecOut);
221 }
222 template <> inline void
223 vMul<std::complex<double> >( int n, std::complex<double>* vecIn, std::complex<double>* vecIn2, std::complex<double>* vecOut)
224 {
225  vzMul(n,vecIn,vecIn2,vecOut);
226 }
227 template <> inline void
228 vMul<std::complex<float> >( int n, std::complex<float>* vecIn, std::complex<float>* vecIn2, std::complex<float>* vecOut)
229 {
230  vcMul(n,vecIn,vecIn2,vecOut);
231 }
232 
234 template <> inline void
235 vAbs( int n, double* vecIn, double* vecOut)
236 {
237  vdAbs(n,vecIn,vecOut);
238 }
240 template <> inline void
241 vAbs( int n, float* vecIn, float* vecOut)
242 {
243  vsAbs(n,vecIn,vecOut);
244 }
245 inline void
246 vAbs( int n, std::complex<double>* vecIn, double* vecOut)
247 {
248  vzAbs(n,vecIn,vecOut);
249 }
250 inline void
251 vAbs( int n, std::complex<float>* vecIn, float* vecOut)
252 {
253  vcAbs(n,vecIn,vecOut);
254 }
255 
256 #else
257 
258 template <typename T> inline void
259 vSqr( int n, T* vecIn, T* vecOut)
260 {
261  for (int i = 0; i<n; ++i)
262  vecOut[i]=vecIn[i]*vecIn[i];
263 }
264 template <typename T> inline void
265 vSqrt( int n, T* vecIn, T* vecOut)
266 {
267  for (int i = 0; i<n; ++i)
268  vecOut[i]=std::sqrt(vecIn[i]);
269 }
270 template <typename T> inline void
271 vInvSqrt( int n, T* vecIn, T* vecOut)
272 {
273  for (int i = 0; i<n; ++i)
274  vecOut[i]=T(1.0)/std::sqrt(vecIn[i]);
275 }
276 
278 template <typename T> inline void
279 vSub( int n, T* vecIn1, T* vecIn2, T* vecOut)
280 {
281  for (int i = 0; i<n; ++i)
282  vecOut[i]=vecIn1[i]-vecIn2[i];
283 }
285 template <typename T> inline void
286 vInv( int n, T* vecIn, T* vecOut)
287 {
288  for (int i = 0; i<n; ++i)
289  vecOut[i]=1.0/vecIn[i];
290 }
292 template <typename T> inline void
293 vExp( int n, T* vecIn, T* vecOut)
294 {
295  for (int i = 0; i<n; ++i)
296  vecOut[i]=std::exp(vecIn[i]);
297 }
299 template <typename T> inline void
300 vAdd( int n, T* vecIn1, T* vecIn2, T* vecOut)
301 {
302  for (int i = 0; i<n; ++i)
303  vecOut[i]=vecIn1[i]+vecIn2[i];
304 }
306 template <typename T> inline void
307 vMul( int n, T* vecIn1, T* vecIn2, T* vecOut)
308 {
309  for (int i = 0; i<n; ++i)
310  vecOut[i]=vecIn1[i]*vecIn2[i];
311 }
313 template <typename T> inline void
314 vDiv( int n, T* vecIn1, T* vecIn2, T* vecOut)
315 {
316  for (int i = 0; i<n; ++i)
317  vecOut[i]=vecIn1[i]/vecIn2[i];
318 }
320 template <typename T> inline void
321 vAbs( int n, T* vecIn, T* vecOut)
322 {
323  for (int i = 0; i<n; ++i)
324  vecOut[i]=std::abs(vecIn[i]);
325 }
326 
327 #endif
328 
329 }
330 
333 #endif
void vMul(int n, T *vecIn, T *vecIn2, T *vecOut)
interface to v*Mul
Definition: utlCoreMKL.h:307
void vSub(int n, T *vecIn, T *vecIn2, T *vecOut)
interface to v*Sub
Definition: utlCoreMKL.h:279
void vSqr(int n, T *vecIn, T *vecOut)
interface to v*Sqr
Definition: utlCoreMKL.h:259
void vAbs(int n, T *vecIn, T *vecOut)
interface to v*Abs
Definition: utlCoreMKL.h:321
void vAdd(int n, T *vecIn, T *vecIn2, T *vecOut)
interface to v*Add
Definition: utlCoreMKL.h:300
void vSin(int n, T *vecIn, T *vecOut)
interface to v*Sin
T abs(const T x)
template version of the fabs function
Definition: utl.h:90
void vSqrt(int n, T *vecIn, T *vecOut)
interface to v*Sqrt
Definition: utlCoreMKL.h:265
void vInvSqrt(int n, T *vecIn, T *vecOut)
interface to v*InvSqrt
Definition: utlCoreMKL.h:271
void vCos(int n, T *vecIn, T *vecOut)
interface to v*Cos
void vExp(int n, T *vecIn, T *vecOut)
interface to v*Exp
Definition: utlCoreMKL.h:293
void vDiv(int n, T *vecIn, T *vecIn2, T *vecOut)
interface to v*Div
Definition: utlCoreMKL.h:314
void vInv(int n, T *vecIn, T *vecOut)
interface to v*Inv
Definition: utlCoreMKL.h:286