imate
C++/CUDA Reference
Loading...
Searching...
No Matches
cublas_symbols.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: Copyright 2021, Siavash Ameli <sameli@berkeley.edu>
3 * SPDX-License-Identifier: BSD-3-Clause
4 * SPDX-FileType: SOURCE
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the license found in the LICENSE.txt file in the root
8 * directory of this source tree.
9 */
10
11
12// =======
13// Headers
14// =======
15
16#include "./cublas_symbols.h"
17#include <cstdlib> // NULL
18#include <sstream> // std::ostringstream
19#include "./dynamic_loading.h" // dynamic_loading
20
21// Avoid CUBLAS numeration value not handled in switch [-Wswitch-enum] warning
22#ifdef _MSC_VER
23 #pragma warning(push, 0) // Suppress all warnings from the followings
24 #include <cublas_api.h> // CUBLAS_VER_MAJOR
25 #pragma warning(pop) // Restore previous warning level
26#elif defined(__INTEL_LLVM_COMPILER) || defined(__INTEL_COMPILER)
27 #pragma warning(push, 0)
28 #include <cublas_api.h> // CUBLAS_VER_MAJOR
29 #pragma warning(pop)
30#elif defined(__GNUC__) || defined(__clang__)
31 #pragma GCC diagnostic push
32 #pragma GCC diagnostic ignored "-Wswitch-enum"
33 #include <cublas_api.h> // CUBLAS_VER_MAJOR
34 #pragma GCC diagnostic pop
35#else
36 #include <cublas_api.h> // CUBLAS_VER_MAJOR
37#endif
38
39// =========================
40// Initialize static members
41// =========================
42
58
59
60// ============
61// get lib name
62// ============
63
66
68{
69 // Get the extension name of a shared library depending on OS
70 std::string lib_extension;
71
72 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) || \
73 defined(__NT__)
74 lib_extension = "lib";
75 #elif defined(__APPLE__)
76 lib_extension = "dylib";
77 #elif defined(__linux__)
78 lib_extension = "so";
79 #else
80 #error "Unknown compiler"
81 #endif
82
83 // Check cublas version
84 #ifndef CUBLAS_VER_MAJOR
85 #error "CUBLAS_VER_MAJOR is not defined."
86 #endif
87
88 // cublas shared library base name
89 std::string lib_base_name = "libcublas";
90
91 // Construct the lib name
92 std::ostringstream oss;
93 // oss << lib_base_name << "." << lib_extension;
94 oss << lib_base_name << "." << lib_extension << "." \
95 << CUBLAS_VER_MAJOR;
96
97 std::string lib_name = oss.str();
98 return lib_name;
99}
100
101
102#ifdef __cplusplus
103 extern "C" {
104#endif
105
106
107// =============
108// cublas Create
109// =============
110
113
114cublasStatus_t cublasCreate_v2(cublasHandle_t* handle)
115{
116 if (cublasSymbols::cublasCreate == NULL)
117 {
118 std::string lib_name = cublasSymbols::get_lib_name();
119 const char* symbol_name = "cublasCreate_v2";
120
122 dynamic_loading::load_symbol<cublasCreate_type>(
123 lib_name.c_str(),
124 symbol_name);
125 }
126
127 return cublasSymbols::cublasCreate(handle);
128}
129
130
131// ==============
132// cublas Destroy
133// ==============
134
135
138
139cublasStatus_t cublasDestroy_v2(cublasHandle_t handle)
140{
142 {
143 std::string lib_name = cublasSymbols::get_lib_name();
144 const char* symbol_name = "cublasDestroy_v2";
145
147 dynamic_loading::load_symbol<cublasDestroy_type>(
148 lib_name.c_str(),
149 symbol_name);
150 }
151
152 return cublasSymbols::cublasDestroy(handle);
153}
154
155
156// ====================
157// cublas Set Math Mode
158// ====================
159
160
163
164cublasStatus_t cublasSetMathMode(
165 cublasHandle_t handle,
166 cublasMath_t mode)
167{
169 {
170 std::string lib_name = cublasSymbols::get_lib_name();
171 const char* symbol_name = "cublasSetMathMode_v2";
172
174 dynamic_loading::load_symbol<cublasSetMathMode_type>(
175 lib_name.c_str(),
176 symbol_name);
177 }
178
179 return cublasSymbols::cublasSetMathMode(handle, mode);
180}
181
182
183// ===========
184// cublasSgemv
185// ===========
186
189
190cublasStatus_t cublasSgemv_v2(
191 cublasHandle_t handle,
192 cublasOperation_t trans,
193 int m,
194 int n,
195 const float* alpha,
196 const float* A,
197 int lda,
198 const float* x,
199 int incx,
200 const float* beta,
201 float* y,
202 int incy)
203{
204 if (cublasSymbols::cublasSgemv == NULL)
205 {
206 std::string lib_name = cublasSymbols::get_lib_name();
207 const char* symbol_name = "cublasSgemv_v2";
208
210 dynamic_loading::load_symbol<cublasSgemv_type>(
211 lib_name.c_str(),
212 symbol_name);
213 }
214
215 return cublasSymbols::cublasSgemv(handle, trans, m, n, alpha, A, lda, x,
216 incx, beta, y, incy);
217}
218
219
220// ===========
221// cublasDgemv
222// ===========
223
226
227cublasStatus_t cublasDgemv_v2(
228 cublasHandle_t handle,
229 cublasOperation_t trans,
230 int m,
231 int n,
232 const double* alpha,
233 const double* A,
234 int lda,
235 const double* x,
236 int incx,
237 const double* beta,
238 double* y,
239 int incy)
240{
241 if (cublasSymbols::cublasDgemv == NULL)
242 {
243 std::string lib_name = cublasSymbols::get_lib_name();
244 const char* symbol_name = "cublasDgemv_v2";
245
247 dynamic_loading::load_symbol<cublasDgemv_type>(
248 lib_name.c_str(),
249 symbol_name);
250 }
251
252 return cublasSymbols::cublasDgemv(handle, trans, m, n, alpha, A, lda, x,
253 incx, beta, y, incy);
254}
255
256
257// ===========
258// cublasScopy
259// ===========
260
263
264cublasStatus_t cublasScopy(
265 cublasHandle_t handle, int n,
266 const float* x,
267 int incx,
268 float* y,
269 int incy)
270{
271 if (cublasSymbols::cublasScopy == NULL)
272 {
273 std::string lib_name = cublasSymbols::get_lib_name();
274 const char* symbol_name = "cublasScopy_v2";
275
277 dynamic_loading::load_symbol<cublasScopy_type>(
278 lib_name.c_str(),
279 symbol_name);
280 }
281
282 return cublasSymbols::cublasScopy(handle, n, x, incx, y, incy);
283}
284
285
286// ===========
287// cublasDcopy
288// ===========
289
292
293cublasStatus_t cublasDcopy(
294 cublasHandle_t handle, int n,
295 const double* x,
296 int incx,
297 double* y,
298 int incy)
299{
300 if (cublasSymbols::cublasDcopy == NULL)
301 {
302 std::string lib_name = cublasSymbols::get_lib_name();
303 const char* symbol_name = "cublasDcopy_v2";
304
306 dynamic_loading::load_symbol<cublasDcopy_type>(
307 lib_name.c_str(),
308 symbol_name);
309 }
310
311 return cublasSymbols::cublasDcopy(handle, n, x, incx, y, incy);
312}
313
314
315// ===========
316// cublasSaxpy
317// ===========
318
321
322cublasStatus_t cublasSaxpy(
323 cublasHandle_t handle,
324 int n,
325 const float *alpha,
326 const float *x,
327 int incx,
328 float *y,
329 int incy)
330{
331 if (cublasSymbols::cublasSaxpy == NULL)
332 {
333 std::string lib_name = cublasSymbols::get_lib_name();
334 const char* symbol_name = "cublasSaxpy_v2";
335
337 dynamic_loading::load_symbol<cublasSaxpy_type>(
338 lib_name.c_str(),
339 symbol_name);
340 }
341
342 return cublasSymbols::cublasSaxpy(handle, n, alpha, x, incx, y, incy);
343}
344
345
346// ===========
347// cublasDaxpy
348// ===========
349
352
353cublasStatus_t cublasDaxpy(
354 cublasHandle_t handle,
355 int n,
356 const double *alpha,
357 const double *x,
358 int incx,
359 double *y,
360 int incy)
361{
362 if (cublasSymbols::cublasDaxpy == NULL)
363 {
364 std::string lib_name = cublasSymbols::get_lib_name();
365 const char* symbol_name = "cublasDaxpy_v2";
366
368 dynamic_loading::load_symbol<cublasDaxpy_type>(
369 lib_name.c_str(),
370 symbol_name);
371 }
372
373 return cublasSymbols::cublasDaxpy(handle, n, alpha, x, incx, y, incy);
374}
375
376
377// ==========
378// cublasSdot
379// ==========
380
383
384cublasStatus_t cublasSdot(
385 cublasHandle_t handle,
386 int n,
387 const float *x,
388 int incx,
389 const float *y,
390 int incy,
391 float *result)
392{
393 if (cublasSymbols::cublasSdot == NULL)
394 {
395 std::string lib_name = cublasSymbols::get_lib_name();
396 const char* symbol_name = "cublasSdot_v2";
397
399 dynamic_loading::load_symbol<cublasSdot_type>(
400 lib_name.c_str(),
401 symbol_name);
402 }
403
404 return cublasSymbols::cublasSdot(handle, n, x, incx, y, incy, result);
405}
406
407
408// ==========
409// cublasDdot
410// ==========
411
414
415cublasStatus_t cublasDdot(
416 cublasHandle_t handle,
417 int n,
418 const double *x,
419 int incx,
420 const double *y,
421 int incy,
422 double *result)
423{
424 if (cublasSymbols::cublasDdot == NULL)
425 {
426 std::string lib_name = cublasSymbols::get_lib_name();
427 const char* symbol_name = "cublasDdot_v2";
428
430 dynamic_loading::load_symbol<cublasDdot_type>(
431 lib_name.c_str(),
432 symbol_name);
433 }
434
435 return cublasSymbols::cublasDdot(handle, n, x, incx, y, incy, result);
436}
437
438
439// ===========
440// cublasSnrm2
441// ===========
442
445
446cublasStatus_t cublasSnrm2(
447 cublasHandle_t handle,
448 int n,
449 const float *x,
450 int incx,
451 float *result)
452{
453 if (cublasSymbols::cublasSnrm2 == NULL)
454 {
455 std::string lib_name = cublasSymbols::get_lib_name();
456 const char* symbol_name = "cublasSnrm2_v2";
457
459 dynamic_loading::load_symbol<cublasSnrm2_type>(
460 lib_name.c_str(),
461 symbol_name);
462 }
463
464 return cublasSymbols::cublasSnrm2(handle, n, x, incx, result);
465}
466
467
468// ===========
469// cublasDnrm2
470// ===========
471
474
475cublasStatus_t cublasDnrm2(
476 cublasHandle_t handle,
477 int n,
478 const double *x,
479 int incx,
480 double *result)
481{
482 if (cublasSymbols::cublasDnrm2 == NULL)
483 {
484 std::string lib_name = cublasSymbols::get_lib_name();
485 const char* symbol_name = "cublasDnrm2_v2";
486
488 dynamic_loading::load_symbol<cublasDnrm2_type>(
489 lib_name.c_str(),
490 symbol_name);
491 }
492
493 return cublasSymbols::cublasDnrm2(handle, n, x, incx, result);
494}
495
496
497// ===========
498// cublasSscal
499// ===========
500
503
504cublasStatus_t cublasSscal(
505 cublasHandle_t handle,
506 int n,
507 const float *alpha,
508 float *x,
509 int incx)
510{
511 if (cublasSymbols::cublasSscal == NULL)
512 {
513 std::string lib_name = cublasSymbols::get_lib_name();
514 const char* symbol_name = "cublasSscal_v2";
515
517 dynamic_loading::load_symbol<cublasSscal_type>(
518 lib_name.c_str(),
519 symbol_name);
520 }
521
522 return cublasSymbols::cublasSscal(handle, n, alpha, x, incx);
523}
524
525
526// ===========
527// cublasDscal
528// ===========
529
532
533cublasStatus_t cublasDscal(
534 cublasHandle_t handle,
535 int n,
536 const double *alpha,
537 double *x,
538 int incx)
539{
540 if (cublasSymbols::cublasDscal == NULL)
541 {
542 std::string lib_name = cublasSymbols::get_lib_name();
543 const char* symbol_name = "cublasDscal_v2";
544
546 dynamic_loading::load_symbol<cublasDscal_type>(
547 lib_name.c_str(),
548 symbol_name);
549 }
550
551 return cublasSymbols::cublasDscal(handle, n, alpha, x, incx);
552}
553
554#ifdef __cplusplus
555 }
556#endif
static cublasSaxpy_type cublasSaxpy
static cublasDdot_type cublasDdot
static cublasSetMathMode_type cublasSetMathMode
static cublasScopy_type cublasScopy
static cublasSscal_type cublasSscal
static cublasDaxpy_type cublasDaxpy
static cublasCreate_type cublasCreate
static cublasDestroy_type cublasDestroy
static cublasDnrm2_type cublasDnrm2
static cublasSdot_type cublasSdot
static cublasDcopy_type cublasDcopy
static cublasSnrm2_type cublasSnrm2
static cublasDscal_type cublasDscal
static cublasSgemv_type cublasSgemv
static std::string get_lib_name()
Returns the name of cublas shared library.
static cublasDgemv_type cublasDgemv
cublasStatus_t cublasDcopy(cublasHandle_t handle, int n, const double *x, int incx, double *y, int incy)
Definition of CUDA's cublasDcopy function using dynamically loaded cublas library.
cublasStatus_t cublasSgemv_v2(cublasHandle_t handle, cublasOperation_t trans, int m, int n, const float *alpha, const float *A, int lda, const float *x, int incx, const float *beta, float *y, int incy)
Definition of CUDA's cublasSgemv function using dynamically loaded cublas library.
cublasStatus_t cublasSscal(cublasHandle_t handle, int n, const float *alpha, float *x, int incx)
Definition of CUDA's cublasSscal function using dynamically loaded cublas library.
cublasStatus_t cublasSetMathMode(cublasHandle_t handle, cublasMath_t mode)
Definition of CUDA's cublasSetmathMode function using dynamically loaded cublas library.
cublasStatus_t cublasDscal(cublasHandle_t handle, int n, const double *alpha, double *x, int incx)
Definition of CUDA's cublasDscal function using dynamically loaded cublas library.
cublasStatus_t cublasSdot(cublasHandle_t handle, int n, const float *x, int incx, const float *y, int incy, float *result)
Definition of CUDA's cublasSdot function using dynamically loaded cublas library.
cublasStatus_t cublasSnrm2(cublasHandle_t handle, int n, const float *x, int incx, float *result)
Definition of CUDA's cublasSnrm2 function using dynamically loaded cublas library.
cublasStatus_t cublasSaxpy(cublasHandle_t handle, int n, const float *alpha, const float *x, int incx, float *y, int incy)
Definition of CUDA's cublasSaxpy function using dynamically loaded cublas library.
cublasStatus_t cublasDaxpy(cublasHandle_t handle, int n, const double *alpha, const double *x, int incx, double *y, int incy)
Definition of CUDA's cublasDaxpy function using dynamically loaded cublas library.
cublasStatus_t cublasScopy(cublasHandle_t handle, int n, const float *x, int incx, float *y, int incy)
Definition of CUDA's cublasScopy function using dynamically loaded cublas library.
cublasStatus_t cublasDestroy_v2(cublasHandle_t handle)
Definition of CUDA's cublasDestroy function using dynamically loaded cublas library.
cublasStatus_t cublasDnrm2(cublasHandle_t handle, int n, const double *x, int incx, double *result)
Definition of CUDA's cublasDnrm2 function using dynamically loaded cublas library.
cublasStatus_t cublasDgemv_v2(cublasHandle_t handle, cublasOperation_t trans, int m, int n, const double *alpha, const double *A, int lda, const double *x, int incx, const double *beta, double *y, int incy)
Definition of CUDA's cublasDgemv function using dynamically loaded cublas library.
cublasStatus_t cublasDdot(cublasHandle_t handle, int n, const double *x, int incx, const double *y, int incy, double *result)
Definition of CUDA's cublasDdot function using dynamically loaded cublas library.
cublasStatus_t cublasCreate_v2(cublasHandle_t *handle)
Definition of CUDA's cublasCreate function using dynamically loaded cublas library.
cublasStatus_t(* cublasDestroy_type)(cublasHandle_t handle)
cublasStatus_t(* cublasDgemv_type)(cublasHandle_t handle, cublasOperation_t trans, int m, int n, const double *alpha, const double *A, int lda, const double *x, int incx, const double *beta, double *y, int incy)
cublasStatus_t(* cublasDcopy_type)(cublasHandle_t handle, int n, const double *x, int incx, double *y, int incy)
cublasStatus_t(* cublasDaxpy_type)(cublasHandle_t handle, int n, const double *alpha, const double *x, int incx, double *y, int incy)
cublasStatus_t(* cublasDscal_type)(cublasHandle_t handle, int n, const double *alpha, double *x, int incx)
cublasStatus_t(* cublasSaxpy_type)(cublasHandle_t handle, int n, const float *alpha, const float *x, int incx, float *y, int incy)
cublasStatus_t(* cublasCreate_type)(cublasHandle_t *handle)
cublasStatus_t(* cublasSetMathMode_type)(cublasHandle_t handle, cublasMath_t mode)
cublasStatus_t(* cublasSscal_type)(cublasHandle_t handle, int n, const float *alpha, float *x, int incx)
cublasStatus_t(* cublasSgemv_type)(cublasHandle_t handle, cublasOperation_t trans, int m, int n, const float *alpha, const float *A, int lda, const float *x, int incx, const float *beta, float *y, int incy)
cublasStatus_t(* cublasSdot_type)(cublasHandle_t handle, int n, const float *x, int incx, const float *y, int incy, float *result)
cublasStatus_t(* cublasScopy_type)(cublasHandle_t handle, int n, const float *x, int incx, float *y, int incy)
cublasStatus_t(* cublasSnrm2_type)(cublasHandle_t handle, int n, const float *x, int incx, float *result)
cublasStatus_t(* cublasDdot_type)(cublasHandle_t handle, int n, const double *x, int incx, const double *y, int incy, double *result)
cublasStatus_t(* cublasDnrm2_type)(cublasHandle_t handle, int n, const double *x, int incx, double *result)