ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
cublas.h
Go to the documentation of this file.
1#if !defined(CUBLAS_H_)
2# define CUBLAS_H_
3
17
19typedef struct cublashandle
20{
22
29
31
32/*
33This function initializes the CUBLAS library and creates a handle to an opaque
34structure holding the CUBLAS library context.
35*/
40
41/*
42This function releases hardware resources used by the CUBLAS library.
43*/
48
49/* This function copies a tile of rows x cols elements from a matrix A in host
50memory space to a matrix B in GPU memory space. It is assumed that each element
51requires storage of elemSize bytes and that both matrices are stored in
52column-major format, with the leading dimension of the source matrix A and
53destination matrix B given in lda and ldb, respectively. The leading dimension
54indicates the number of rows of the allocated matrix, even if only a submatrix
55of it is being used. In general, B is a device pointer that points to an object,
56or part of an object, that was allocated in GPU memory space via cublasAlloc().
57*/
59 int rows,
60 int cols,
61 int elemSize,
62 const void *A,
63 int lda,
64 void *B,
65 int ldb)
66{
67 // Due to the Fortran column major the ldb must be the rows of matrix A
68 __ESBMC_assert(ldb == rows, "Full matrix is not bein copied");
69
71}
72
73/*
74This function copies a tile of rows x cols elements from a matrix A in GPU
75memory space to a matrix B in host memory space. It is assumed that each element
76requires storage of elemSize bytes and that both matrices are stored in
77column-major format, with the leading dimension of the source matrix A and
78destination matrix B given in lda and ldb, respectively. The leading dimension
79indicates the number of rows of the allocated matrix, even if only a submatrix
80of it is being used. In general, A is a device pointer that points to an object,
81or part of an object, that was allocated in GPU memory space via cublasAlloc().
82*/
84 int rows,
85 int cols,
86 int elemSize,
87 const void *A,
88 int lda,
89 void *B,
90 int ldb)
91{
92 __ESBMC_assert(lda == cols, "Full matrix is not bein recovered");
94}
95
97cublasSetVector(int n, int elemSize, const void *A, int lda, void *B, int ldb)
98{
99 __ESBMC_assert(lda == ldb, "Full matrix is not bein copied");
100
102}
103
105cublasGetVector(int n, int elemSize, const void *A, int lda, void *B, int ldb)
106{
107 __ESBMC_assert(ldb == lda, "Full matrix is not bein copied");
108
110}
111
113 cublasHandle_t handle,
114 int n,
115 const float *alpha,
116 float *x,
117 int incx)
118{
119 for (int i = 0; i < n; i++)
120 {
121 int j = 1 + (i - 1) * incx;
122 x[j] = ((float)alpha[0]) * x[j];
123 }
125}
126
128 cublasHandle_t handle,
129 int n,
130 const double *alpha,
131 double *x,
132 int incx)
133{
134 for (int i = 0; i < n; i++)
135 {
136 int j = 1 + (i - 1) * incx;
137 x[j] = ((double)alpha[0]) * x[j];
138 }
140}
141
143 cublasHandle_t handle,
144 int n,
145 float *x,
146 int incx,
147 float *y,
148 int incy)
149{
150 for (int i = 0; i < n; i++)
151 {
152 int k = 1 + (i - 1) * incx;
153 int j = 1 + (i - 1) * incy;
154 y[j] = x[k];
155 x[k] = y[j];
156 }
158}
159
161 cublasHandle_t handle,
162 int n,
163 double *x,
164 int incx,
165 double *y,
166 int incy)
167{
168 for (int i = 0; i < n; i++)
169 {
170 int k = 1 + (i - 1) * incx;
171 int j = 1 + (i - 1) * incy;
172 y[j] = x[k];
173 x[k] = y[j];
174 }
176}
177
179 cublasHandle_t handle,
180 int n,
181 const float *x,
182 int incx,
183 const float *y,
184 int incy,
185 float *result)
186{
187 float aux = 0;
188 for (int i = 0; i < n; i++)
189 {
190 int k = 1 + (i - 1) * incx;
191 int j = 1 + (i - 1) * incy;
192 aux = y[j] * x[k] + aux;
193 }
194 result[0] = aux;
196}
197
199 cublasHandle_t handle,
200 int n,
201 const double *x,
202 int incx,
203 const double *y,
204 int incy,
205 double *result)
206{
207 double aux = 0;
208 for (int i = 0; i < n; i++)
209 {
210 int k = 1 + (i - 1) * incx;
211 int j = 1 + (i - 1) * incy;
212 aux = y[j] * x[k] + aux;
213 }
214 result[0] = aux;
216}
217
219 cublasHandle_t handle,
220 int n,
221 const float *x,
222 int incx,
223 float *y,
224 int incy)
225{
226 for (int i = 0; i < n; i++)
227 {
228 int k = 1 + (i - 1) * incx;
229 int j = 1 + (i - 1) * incy;
230 y[j] = x[k];
231 }
233}
234
236 cublasHandle_t handle,
237 int n,
238 const double *x,
239 int incx,
240 double *y,
241 int incy)
242{
243 for (int i = 0; i < n; i++)
244 {
245 int k = 1 + (i - 1) * incx;
246 int j = 1 + (i - 1) * incy;
247 y[j] = x[k];
248 }
250}
251
253 cublasHandle_t handle,
254 cublasOperation_t transa,
255 cublasOperation_t transb,
256 int m,
257 int n,
258 int k,
259 const float *alpha,
260 const float *A,
261 int lda,
262 const float *B,
263 int ldb,
264 const float *beta,
265 float *C,
266 int ldc)
267{
268 if ((transa == CUBLAS_OP_N) && (transb == CUBLAS_OP_N))
269 {
270 for (int contadorZ = 0; contadorZ < m; contadorZ++)
271 {
272 for (int contadorY = 0; contadorY < n; contadorY++)
273 {
274 float result = 0;
275 for (int contadorX = 0; contadorX < k; contadorX++)
276 {
277 result =
278 (A[contadorX + contadorZ * k] * B[contadorX * n + contadorY]) +
279 result;
280 }
281 C[contadorY + contadorZ * m] =
282 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
283 }
284 }
285 }
286
287 else if ((transa == CUBLAS_OP_N) && (transb == CUBLAS_OP_T))
288 {
289 for (int contadorZ = 0; contadorZ < m; contadorZ++)
290 {
291 for (int contadorY = 0; contadorY < n; contadorY++)
292 {
293 float result = 0;
294 for (int contadorX = 0; contadorX < k; contadorX++)
295 {
296 result =
297 (A[contadorX + contadorZ * k] * B[contadorX + contadorY * n]) +
298 result;
299 }
300 C[contadorY + contadorZ * m] =
301 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
302 }
303 }
304 }
305 else if ((transa == CUBLAS_OP_T) && (transb == CUBLAS_OP_N))
306 {
307 for (int contadorZ = 0; contadorZ < m; contadorZ++)
308 {
309 for (int contadorY = 0; contadorY < n; contadorY++)
310 {
311 float result = 0;
312 for (int contadorX = 0; contadorX < k; contadorX++)
313 {
314 result =
315 (A[contadorX * k + contadorZ] * B[contadorX * n + contadorY]) +
316 result;
317 }
318 C[contadorY + contadorZ * m] =
319 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
320 }
321 }
322 }
323 else if ((transa == CUBLAS_OP_T) && (transb == CUBLAS_OP_T))
324 {
325 for (int contadorZ = 0; contadorZ < m; contadorZ++)
326 {
327 for (int contadorY = 0; contadorY < n; contadorY++)
328 {
329 float result = 0;
330 for (int contadorX = 0; contadorX < k; contadorX++)
331 {
332 result =
333 (A[contadorX * k + contadorZ] * B[contadorX + contadorY * n]) +
334 result;
335 }
336 C[contadorY + contadorZ * m] =
337 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
338 }
339 }
340 }
342}
343
345 cublasHandle_t handle,
346 cublasOperation_t transa,
347 cublasOperation_t transb,
348 int m,
349 int n,
350 int k,
351 const double *alpha,
352 const double *A,
353 int lda,
354 const double *B,
355 int ldb,
356 const double *beta,
357 double *C,
358 int ldc)
359{
360 if ((transa == CUBLAS_OP_N) && (transb == CUBLAS_OP_N))
361 {
362 for (int contadorZ = 0; contadorZ < m; contadorZ++)
363 {
364 for (int contadorY = 0; contadorY < n; contadorY++)
365 {
366 float result = 0;
367 for (int contadorX = 0; contadorX < k; contadorX++)
368 {
369 result =
370 (A[contadorX + contadorZ * k] * B[contadorX * n + contadorY]) +
371 result;
372 }
373 C[contadorY + contadorZ * m] =
374 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
375 }
376 }
377 }
378 else if ((transa == CUBLAS_OP_N) && (transb == CUBLAS_OP_T))
379 {
380 for (int contadorZ = 0; contadorZ < m; contadorZ++)
381 {
382 for (int contadorY = 0; contadorY < n; contadorY++)
383 {
384 float result = 0;
385 for (int contadorX = 0; contadorX < k; contadorX++)
386 {
387 result =
388 (A[contadorX + contadorZ * k] * B[contadorX + contadorY * n]) +
389 result;
390 }
391 C[contadorY + contadorZ * m] =
392 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
393 }
394 }
395 }
396 else if ((transa == CUBLAS_OP_T) && (transb == CUBLAS_OP_N))
397 {
398 for (int contadorZ = 0; contadorZ < m; contadorZ++)
399 {
400 for (int contadorY = 0; contadorY < n; contadorY++)
401 {
402 float result = 0;
403 for (int contadorX = 0; contadorX < k; contadorX++)
404 {
405 result =
406 (A[contadorX * k + contadorZ] * B[contadorX * n + contadorY]) +
407 result;
408 }
409 C[contadorY + contadorZ * m] =
410 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
411 }
412 }
413 }
414 else if ((transa == CUBLAS_OP_T) && (transb == CUBLAS_OP_T))
415 {
416 for (int contadorZ = 0; contadorZ < m; contadorZ++)
417 {
418 for (int contadorY = 0; contadorY < n; contadorY++)
419 {
420 float result = 0;
421 for (int contadorX = 0; contadorX < k; contadorX++)
422 {
423 result =
424 (A[contadorX * k + contadorZ] * B[contadorX + contadorY * n]) +
425 result;
426 }
427 C[contadorY + contadorZ * m] =
428 alpha[0] * result + beta[0] * C[contadorY + contadorZ * m];
429 }
430 }
431 }
433}
435 cublasHandle_t handle,
436 int n,
437 const float *alpha,
438 const float *x,
439 int incx,
440 float *y,
441 int incy)
442{
443 for (int i = 0; i < n; i++)
444 {
445 int k = 1 + (i - 1) * incx;
446 int j = 1 + (i - 1) * incy;
447 y[j] = ((float)alpha[0]) * x[k] + y[j];
448 }
450}
451
453 cublasHandle_t handle,
454 int n,
455 const double *alpha,
456 const double *x,
457 int incx,
458 double *y,
459 int incy)
460{
461 for (int i = 0; i < n; i++)
462 {
463 int k = 1 + (i - 1) * incx;
464 int j = 1 + (i - 1) * incy;
465 y[j] = ((double)alpha[0]) * x[k] + y[j];
466 }
468}
469
470#endif /*CUBLAS_H_*/
cublasStatus_t cublasDcopy(cublasHandle_t handle, int n, const double *x, int incx, double *y, int incy)
Definition cublas.h:235
cublasStatus_t cublasGetVector(int n, int elemSize, const void *A, int lda, void *B, int ldb)
Definition cublas.h:105
cublasStatus_t cublasSscal(cublasHandle_t handle, int n, const float *alpha, float *x, int incx)
Definition cublas.h:112
struct cublashandle cublasHandle_t
cublasStatus_t cublasDscal(cublasHandle_t handle, int n, const double *alpha, double *x, int incx)
Definition cublas.h:127
cublasStatus_t cublasSdot(cublasHandle_t handle, int n, const float *x, int incx, const float *y, int incy, float *result)
Definition cublas.h:178
cublasStatus_t cublasSswap(cublasHandle_t handle, int n, float *x, int incx, float *y, int incy)
Definition cublas.h:142
cublasStatus_t cublasSetVector(int n, int elemSize, const void *A, int lda, void *B, int ldb)
Definition cublas.h:97
enum cublasoperation cublasOperation_t
Definition cublas.h:30
cublasStatus_t cublasSgemm(cublasHandle_t handle, cublasOperation_t transa, cublasOperation_t transb, int m, int n, int k, const float *alpha, const float *A, int lda, const float *B, int ldb, const float *beta, float *C, int ldc)
Definition cublas.h:252
cublasStatus_t cublasCreate(cublasHandle_t *handle)
Definition cublas.h:36
cublasStatus_t cublasSaxpy(cublasHandle_t handle, int n, const float *alpha, const float *x, int incx, float *y, int incy)
Definition cublas.h:434
cublasStatus_t cublasDaxpy(cublasHandle_t handle, int n, const double *alpha, const double *x, int incx, double *y, int incy)
Definition cublas.h:452
cublasStatus_t cublasDswap(cublasHandle_t handle, int n, double *x, int incx, double *y, int incy)
Definition cublas.h:160
cublasStatus_t cublasSetMatrix(int rows, int cols, int elemSize, const void *A, int lda, void *B, int ldb)
Definition cublas.h:58
cublasStatus_t cublasDgemm(cublasHandle_t handle, cublasOperation_t transa, cublasOperation_t transb, int m, int n, int k, const double *alpha, const double *A, int lda, const double *B, int ldb, const double *beta, double *C, int ldc)
Definition cublas.h:344
enum cublasstatus custatusResult
enum cublasoperation cuoperation
cublasStatus_t cublasScopy(cublasHandle_t handle, int n, const float *x, int incx, float *y, int incy)
Definition cublas.h:218
enum cublasstatus cublasStatus_t
Definition cublas.h:18
cublasStatus_t cublasDestroy(cublasHandle_t handle)
Definition cublas.h:44
cublasStatus_t cublasDdot(cublasHandle_t handle, int n, const double *x, int incx, const double *y, int incy, double *result)
Definition cublas.h:198
cublasstatus
Definition cublas.h:5
@ CUBLAS_STATUS_NOT_SUPPORTED
Definition cublas.h:14
@ CUBLAS_STATUS_INVALID_VALUE
Definition cublas.h:9
@ CUBLAS_STATUS_EXECUTION_FAILED
Definition cublas.h:12
@ CUBLAS_STATUS_LICENSE_ERROR
Definition cublas.h:15
@ CUBLAS_STATUS_NOT_INITIALIZED
Definition cublas.h:7
@ CUBLAS_STATUS_ARCH_MISMATCH
Definition cublas.h:10
@ CUBLAS_STATUS_SUCCESS
Definition cublas.h:6
@ CUBLAS_STATUS_INTERNAL_ERROR
Definition cublas.h:13
@ CUBLAS_STATUS_MAPPING_ERROR
Definition cublas.h:11
@ CUBLAS_STATUS_ALLOC_FAILED
Definition cublas.h:8
cublasoperation
Definition cublas.h:24
@ CUBLAS_OP_N
Definition cublas.h:25
@ CUBLAS_OP_C
Definition cublas.h:27
@ CUBLAS_OP_T
Definition cublas.h:26
cublasStatus_t cublasGetMatrix(int rows, int cols, int elemSize, const void *A, int lda, void *B, int ldb)
Definition cublas.h:83
#define C
Definition exp2f.c:25
#define A
Definition logf.c:22
Definition float.py:1
Definition cublas.h:20