MAGMA  1.2.0
MatrixAlgebraonGPUandMulticoreArchitectures
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
magma.h
Go to the documentation of this file.
1 /*
2  -- MAGMA (version 1.2.0) --
3  Univ. of Tennessee, Knoxville
4  Univ. of California, Berkeley
5  Univ. of Colorado, Denver
6  May 2012
7 */
8 
9 /*#include <quark.h>*/
10 
11 #ifndef _MAGMA_
12 #define _MAGMA_
13 
14 /* ------------------------------------------------------------
15  * MAGMA Blas Functions
16  * --------------------------------------------------------- */
17 #include "magmablas.h"
18 
19 #include "auxiliary.h"
20 
21 /* ------------------------------------------------------------
22  * MAGMA functions
23  * --------------------------------------------------------- */
24 #include "magma_z.h"
25 #include "magma_c.h"
26 #include "magma_d.h"
27 #include "magma_s.h"
28 #include "magma_zc.h"
29 #include "magma_ds.h"
30 
31 /* ------------------------------------------------------------
32  * MAGMA constants
33  * --------------------------------------------------------- */
34 #define MagmaNoTrans 'N'
35 #define MagmaTrans 'T'
36 #define MagmaConjTrans 'C'
37 
38 #define MagmaUpper 'U'
39 #define MagmaLower 'L'
40 #define MagmaUpperLower 'A'
41 
42 #define MagmaNonUnit 'N'
43 #define MagmaUnit 'U'
44 
45 #define MagmaLeft 'L'
46 #define MagmaRight 'R'
47 
48 #define MagmaForward 'F'
49 #define MagmaBackward 'B'
50 
51 #define MagmaColumnwise 'C'
52 #define MagmaRowwise 'R'
53 
54 #define MagmaNoVectors 'N'
55 #define MagmaVectors 'V'
56 
57 #define MagmaNoTransStr "NonTrans"
58 #define MagmaTransStr "Trans"
59 #define MagmaConjTransStr "Conj"
60 
61 #define MagmaUpperStr "Upper"
62 #define MagmaLowerStr "Lower"
63 #define MagmaUpperLowerStr "All"
64 
65 #define MagmaNonUnitStr "NonUnit"
66 #define MagmaUnitStr "Unit"
67 
68 #define MagmaLeftStr "Left"
69 #define MagmaRightStr "Right"
70 
71 #define MagmaForwardStr "Forward"
72 #define MagmaBackwardStr "Backward"
73 
74 #define MagmaColumnwiseStr "Columnwise"
75 #define MagmaRowwiseStr "Rowwise"
76 
77 #define MagmaNoVectorsStr "NoVectors"
78 #define MagmaVectorsStr "Vectors"
79 
80 #define MagmaMaxGPUs 8
81 
82 /* ------------------------------------------------------------
83  * Return codes
84  * --------------------------------------------------------- */
85 #define MAGMA_SUCCESS 0
86 #define MAGMA_ERR_ILLEGAL_VALUE -100
87 #define MAGMA_ERR_HOST_ALLOC -102
88 #define MAGMA_ERR_DEVICE_ALLOC -103
89 #define MAGMA_ERR_CUDASTREAM -104
90 #define MAGMA_ERR_INVALID_PTR -105
91 
92 /* ------------------------------------------------------------
93  * Define new type that will not be changed by the generator
94  * --------------------------------------------------------- */
95 typedef double real_Double_t;
96 
97 /* ------------------------------------------------------------
98  * Macros to deal with cuda complex
99  * --------------------------------------------------------- */
100 #define MAGMA_Z_SET2REAL(v, t) {(v).x = (t); (v).y = 0.0;}
101 #define MAGMA_Z_EQUAL(u,v) (((u).x == (v).x) && ((u).y == (v).y))
102 #define MAGMA_Z_DSCALE(v, t, s) {(v).x = (t).x/(s); (v).y = (t).y/(s);}
103 #define MAGMA_Z_MAKE(r, i) make_cuDoubleComplex((r), (i))
104 #define MAGMA_Z_REAL(a) cuCreal(a)
105 #define MAGMA_Z_IMAG(a) cuCimag(a)
106 #define MAGMA_Z_ADD(a, b) cuCadd((a), (b))
107 #define MAGMA_Z_SUB(a, b) cuCsub((a), (b))
108 #define MAGMA_Z_MUL(a, b) cuCmul((a), (b))
109 #define MAGMA_Z_DIV(a, b) cuCdiv((a), (b))
110 #define MAGMA_Z_ABS(a) cuCabs((a))
111 #define MAGMA_Z_CNJG(a) cuConj(a)
112 #define MAGMA_Z_NEGATE(a) make_cuDoubleComplex( -(a).x, -(a).y )
113 #define MAGMA_Z_ZERO make_cuDoubleComplex(0.0, 0.0)
114 #define MAGMA_Z_ONE make_cuDoubleComplex(1.0, 0.0)
115 #define MAGMA_Z_HALF make_cuDoubleComplex(0.5, 0.0)
116 #define MAGMA_Z_NEG_ONE make_cuDoubleComplex(-1.0, 0.0)
117 #define MAGMA_Z_NEG_HALF make_cuDoubleComplex(-0.5, 0.0)
118 
119 #define MAGMA_C_SET2REAL(v, t) {(v).x = (t); (v).y = 0.0;}
120 #define MAGMA_C_EQUAL(u,v) (((u).x == (v).x) && ((u).y == (v).y))
121 #define MAGMA_C_DSCALE(v, t, s) {(v).x = (t).x/(s); (v).y = (t).y/(s);}
122 #define MAGMA_C_MAKE(r, i) make_cuFloatComplex((r), (i))
123 #define MAGMA_C_REAL(a) cuCrealf(a)
124 #define MAGMA_C_IMAG(a) cuCimagf(a)
125 #define MAGMA_C_ADD(a, b) cuCaddf((a), (b))
126 #define MAGMA_C_SUB(a, b) cuCsubf((a), (b))
127 #define MAGMA_C_MUL(a, b) cuCmulf((a), (b))
128 #define MAGMA_C_DIV(a, b) cuCdivf((a), (b))
129 #define MAGMA_C_ABS(a) cuCabsf((a))
130 #define MAGMA_C_CNJG(a) cuConjf(a)
131 #define MAGMA_C_NEGATE(a) make_cuFloatComplex( -(a).x, -(a).y )
132 #define MAGMA_C_ZERO make_cuFloatComplex(0.0, 0.0)
133 #define MAGMA_C_ONE make_cuFloatComplex(1.0, 0.0)
134 #define MAGMA_C_HALF make_cuFloatComplex(0.5, 0.0)
135 #define MAGMA_C_NEG_ONE make_cuFloatComplex(-1.0, 0.0)
136 #define MAGMA_C_NEG_HALF make_cuFloatComplex(-0.5, 0.0)
137 
138 #define MAGMA_D_SET2REAL(v, t) (v) = (t)
139 #define MAGMA_D_OP_NEG_ASGN(t, z) (t) = -(z)
140 #define MAGMA_D_EQUAL(u,v) ((u) == (v))
141 #define MAGMA_D_DSCALE(v, t, s) (v) = (t)/(s)
142 #define MAGMA_D_MAKE(r, i) (r)
143 #define MAGMA_D_REAL(a) (a)
144 #define MAGMA_D_IMAG(a) (a)
145 #define MAGMA_D_ADD(a, b) ( (a) + (b) )
146 #define MAGMA_D_SUB(a, b) ( (a) - (b) )
147 #define MAGMA_D_MUL(a, b) ( (a) * (b) )
148 #define MAGMA_D_DIV(a, b) ( (a) / (b) )
149 #define MAGMA_D_ABS(a) ((a)>0?(a):-(a))
150 #define MAGMA_D_CNJG(a) (a)
151 #define MAGMA_D_NEGATE(a) (-(a))
152 #define MAGMA_D_ZERO (0.0)
153 #define MAGMA_D_ONE (1.0)
154 #define MAGMA_D_HALF (0.5)
155 #define MAGMA_D_NEG_ONE (-1.0)
156 #define MAGMA_D_NEG_HALF (-0.5)
157 
158 #define MAGMA_S_SET2REAL(v, t) (v) = (t)
159 #define MAGMA_S_OP_NEG_ASGN(t, z) (t) = -(z)
160 #define MAGMA_S_EQUAL(u,v) ((u) == (v))
161 #define MAGMA_S_DSCALE(v, t, s) (v) = (t)/(s)
162 #define MAGMA_S_MAKE(r, i) (r)
163 #define MAGMA_S_REAL(a) (a)
164 #define MAGMA_S_IMAG(a) (a)
165 #define MAGMA_S_ADD(a, b) ( (a) + (b) )
166 #define MAGMA_S_SUB(a, b) ( (a) - (b) )
167 #define MAGMA_S_MUL(a, b) ( (a) * (b) )
168 #define MAGMA_S_DIV(a, b) ( (a) / (b) )
169 #define MAGMA_S_ABS(a) ((a)>0?(a):-(a))
170 #define MAGMA_S_CNJG(a) (a)
171 #define MAGMA_S_NEGATE(a) (-(a))
172 #define MAGMA_S_ZERO (0.0)
173 #define MAGMA_S_ONE (1.0)
174 #define MAGMA_S_HALF (0.5)
175 #define MAGMA_S_NEG_ONE (-1.0)
176 #define MAGMA_S_NEG_HALF (-0.5)
177 
178 #ifndef CBLAS_SADDR
179 #define CBLAS_SADDR(a) &(a)
180 #endif
181 
182 #ifdef __cplusplus
183 extern "C" {
184 #endif
185 
186 /* ------------------------------------------------------------
187  * -- MAGMA function definitions
188  * --------------------------------------------------------- */
189 
190 // ========================================
191 // initialization
192 void magma_init( void );
193 
194 void magma_finalize( void );
195 
196 
197 // ========================================
198 // memory allocation
199 magma_err_t magma_malloc( magma_devptr *ptrPtr, size_t bytes );
201 
202 magma_err_t magma_malloc_host( void **ptrPtr, size_t bytes );
203 magma_err_t magma_free_host ( void *ptr );
204 
205 // type-safe convenience functions to avoid using (void**) cast and sizeof(...)
206 // here n is the number of elements (floats, doubles, etc.) not the number of bytes.
207 inline magma_err_t magma_smalloc( float **ptrPtr, size_t n ) { return magma_malloc( (void**) ptrPtr, n*sizeof(float) ); }
208 inline magma_err_t magma_dmalloc( double **ptrPtr, size_t n ) { return magma_malloc( (void**) ptrPtr, n*sizeof(double) ); }
209 inline magma_err_t magma_cmalloc( cuFloatComplex **ptrPtr, size_t n ) { return magma_malloc( (void**) ptrPtr, n*sizeof(cuFloatComplex) ); }
210 inline magma_err_t magma_zmalloc( cuDoubleComplex **ptrPtr, size_t n ) { return magma_malloc( (void**) ptrPtr, n*sizeof(cuDoubleComplex) ); }
211 
212 inline magma_err_t magma_smalloc_host( float **ptrPtr, size_t n ) { return magma_malloc_host( (void**) ptrPtr, n*sizeof(float) ); }
213 inline magma_err_t magma_dmalloc_host( double **ptrPtr, size_t n ) { return magma_malloc_host( (void**) ptrPtr, n*sizeof(double) ); }
214 inline magma_err_t magma_cmalloc_host( cuFloatComplex **ptrPtr, size_t n ) { return magma_malloc_host( (void**) ptrPtr, n*sizeof(cuFloatComplex) ); }
215 inline magma_err_t magma_zmalloc_host( cuDoubleComplex **ptrPtr, size_t n ) { return magma_malloc_host( (void**) ptrPtr, n*sizeof(cuDoubleComplex) ); }
216 
217 
218 // ========================================
219 // device & queue support
220 void magma_getdevices(
221  magma_device_t* devices,
222  magma_int_t size,
223  magma_int_t* numPtr );
224 
225 void magma_getdevice( magma_device_t* dev );
226 
227 void magma_setdevice( magma_device_t dev );
228 
229 void magma_device_sync();
230 
231 
232 // ========================================
233 // queue support
234 void magma_queue_create( /*magma_device_t device,*/ magma_queue_t* queuePtr );
235 
236 void magma_queue_destroy( magma_queue_t queue );
237 
238 void magma_queue_sync( magma_queue_t queue );
239 
240 
241 // ========================================
242 // event support
243 void magma_event_create( magma_event_t* eventPtr );
244 
245 void magma_event_destroy( magma_event_t event );
246 
247 void magma_event_record( magma_event_t event, magma_queue_t queue );
248 
249 // blocks CPU until event occurs
250 void magma_event_sync( magma_event_t event );
251 
252 // blocks queue (but not CPU) until event occurs
254 
255 
256 // ========================================
257 // generic, type-independent routines to copy data.
258 // type-safe versions which avoid the user needing sizeof(...) are in [sdcz]set_get.cpp
259 void magma_setvector(
260  magma_int_t n, size_t elemSize,
261  void const *hx_src, magma_int_t incx,
262  void *dy_dst, magma_int_t incy );
263 
264 void magma_getvector(
265  magma_int_t n, size_t elemSize,
266  void const *dx_src, magma_int_t incx,
267  void *hy_dst, magma_int_t incy );
268 
270  magma_int_t n, size_t elemSize,
271  void const *hx_src, magma_int_t incx,
272  void *dy_dst, magma_int_t incy,
273  magma_stream_t stream );
274 
276  magma_int_t n, size_t elemSize,
277  void const *dx_src, magma_int_t incx,
278  void *hy_dst, magma_int_t incy,
279  magma_stream_t stream );
280 
281 
282 // ========================================
283 // error handler
284 void magma_xerbla( const char *name, magma_int_t info );
285 
286 #ifdef __cplusplus
287 }
288 #endif
289 
290 #endif
291