imate
C++/CUDA Reference
cblas_interface.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 "./cblas_interface.h"
17 
18 # if (USE_CBLAS == 1)
19 
20 #include <cstdlib> // abort
21 #include <iostream> // std::cerr
22 
23 
24 // ===============
25 // cblas interface
26 // ===============
27 
33 
34 namespace cblas_interface
35 {
36 
37  // =====
38  // xgemv (float)
39  // =====
40 
43 
44  template<>
45  void xgemv<float>(
46  CBLAS_LAYOUT layout,
47  CBLAS_TRANSPOSE TransA,
48  const int M,
49  const int N,
50  const float alpha,
51  const float* A,
52  const int lda,
53  const float* X,
54  const int incX,
55  const float beta,
56  float* Y,
57  const int incY)
58  {
59  cblas_sgemv(layout, TransA, M, N, alpha, A, lda, X, incX, beta, Y,
60  incY);
61  }
62 
63 
64  // =====
65  // xgemv (double)
66  // =====
67 
70 
71  template<>
72  void xgemv<double>(
73  CBLAS_LAYOUT layout,
74  CBLAS_TRANSPOSE TransA,
75  const int M,
76  const int N,
77  const double alpha,
78  const double* A,
79  const int lda,
80  const double* X,
81  const int incX,
82  const double beta,
83  double* Y,
84  const int incY)
85  {
86  cblas_dgemv(layout, TransA, M, N, alpha, A, lda, X, incX, beta, Y,
87  incY);
88  }
89 
90 
91  // =====
92  // xgemv (long double)
93  // =====
94 
97 
98  template<>
99  void xgemv<long double>(
100  CBLAS_LAYOUT layout,
101  CBLAS_TRANSPOSE TransA,
102  const int M,
103  const int N,
104  const long double alpha,
105  const long double* A,
106  const int lda,
107  const long double* X,
108  const int incX,
109  const long double beta,
110  long double* Y,
111  const int incY)
112  {
113  // Mark unused variables to avoid compiler warnings
114  // (-Wno-unused-parameter)
115  (void) layout;
116  (void) TransA;
117  (void) M;
118  (void) N;
119  (void) alpha;
120  (void) A;
121  (void) lda;
122  (void) X;
123  (void) incX;
124  (void) beta;
125  (void) Y;
126  (void) incY;
127 
128  std::cerr << "Error: cblas_?copy for long double type is not "
129  << "implemented. To use long double type, set USE_CBLAS "
130  << "to 0 and recompile the package."
131  << std::endl;
132  abort();
133  }
134 
135 
136  // =====
137  // xcopy (float)
138  // =====
139 
142 
143  template <>
144  void xcopy<float>(
145  const int N,
146  const float* X,
147  const int incX,
148  float* Y,
149  const int incY)
150  {
151  cblas_scopy(N, X, incX, Y, incY);
152  }
153 
154 
155  // =====
156  // xcopy (double)
157  // =====
158 
161 
162  template <>
163  void xcopy<double>(
164  const int N,
165  const double* X,
166  const int incX,
167  double* Y,
168  const int incY)
169  {
170  cblas_dcopy(N, X, incX, Y, incY);
171  }
172 
173 
174  // =====
175  // xcopy (long double)
176  // =====
177 
180 
181  template <>
182  void xcopy<long double>(
183  const int N,
184  const long double* X,
185  const int incX,
186  long double* Y,
187  const int incY)
188  {
189  // Mark unused variables to avoid compiler warnings
190  // (-Wno-unused-parameter)
191  (void) N;
192  (void) X;
193  (void) incX;
194  (void) Y;
195  (void) incY;
196 
197  std::cerr << "Error: cblas_?copy for long double type is not "
198  << "implemented. To use long double type, set USE_CBLAS "
199  << "to 0 and recompile the package."
200  << std::endl;
201  abort();
202  }
203 
204 
205  // =====
206  // xaxpy (float)
207  // =====
208 
211 
212  template <>
213  void xaxpy<float>(
214  const int N,
215  const float alpha,
216  const float* X,
217  const int incX,
218  float* Y,
219  const int incY)
220  {
221  cblas_saxpy(N, alpha, X, incX, Y, incY);
222  }
223 
224 
225  // =====
226  // xaxpy (double)
227  // =====
228 
231 
232  template <>
233  void xaxpy<double>(
234  const int N,
235  const double alpha,
236  const double* X,
237  const int incX,
238  double* Y,
239  const int incY)
240  {
241  cblas_daxpy(N, alpha, X, incX, Y, incY);
242  }
243 
244 
245  // =====
246  // xaxpy (long double)
247  // =====
248 
251 
252  template <>
253  void xaxpy<long double>(
254  const int N,
255  const long double alpha,
256  const long double* X,
257  const int incX,
258  long double* Y,
259  const int incY)
260  {
261  // Mark unused variables to avoid compiler warnings
262  // (-Wno-unused-parameter)
263  (void) N;
264  (void) alpha;
265  (void) X;
266  (void) incX;
267  (void) Y;
268  (void) incY;
269 
270  std::cerr << "Error: cblas_?axpy for long double type is not "
271  << "implemented. To use long double type, set USE_CBLAS "
272  << "to 0 and recompile the package."
273  << std::endl;
274  abort();
275  }
276 
277 
278  // ====
279  // xdot (float)
280  // ====
281 
284 
285  template <>
286  float xdot<float>(
287  const int N,
288  const float* X,
289  const int incX,
290  const float* Y,
291  const int incY)
292  {
293  return cblas_sdot(N, X, incX, Y, incY);
294  }
295 
296 
297  // ====
298  // xdot (double)
299  // ====
300 
303 
304  template <>
305  double xdot<double>(
306  const int N,
307  const double* X,
308  const int incX,
309  const double* Y,
310  const int incY)
311  {
312  return cblas_ddot(N, X, incX, Y, incY);
313  }
314 
315 
316  // ====
317  // xdot (long double)
318  // ====
319 
322 
323  template <>
324  long double xdot<long double>(
325  const int N,
326  const long double* X,
327  const int incX,
328  const long double* Y,
329  const int incY)
330  {
331  // Mark unused variables to avoid compiler warnings
332  // (-Wno-unused-parameter)
333  (void) N;
334  (void) X;
335  (void) incX;
336  (void) Y;
337  (void) incY;
338 
339  std::cerr << "Error: cblas_?dot for long double type is not "
340  << "implemented. To use long double type, set USE_CBLAS "
341  << "to 0 and recompile the package."
342  << std::endl;
343  abort();
344  }
345 
346 
347  // =====
348  // xnrm2 (float)
349  // =====
350 
353 
354  template <>
355  float xnrm2<float>(
356  const int N,
357  const float* X,
358  const int incX)
359  {
360  return cblas_snrm2(N, X, incX);
361  }
362 
363 
364  // =====
365  // xnrm2 (double)
366  // =====
367 
370 
371  template <>
372  double xnrm2<double>(
373  const int N,
374  const double* X,
375  const int incX)
376  {
377  return cblas_dnrm2(N, X, incX);
378  }
379 
380 
381  // =====
382  // xnrm2 (long double)
383  // =====
384 
387 
388  template <>
389  long double xnrm2<long double>(
390  const int N,
391  const long double* X,
392  const int incX)
393  {
394  // Mark unused variables to avoid compiler warnings
395  // (-Wno-unused-parameter)
396  (void) N;
397  (void) X;
398  (void) incX;
399 
400  std::cerr << "Error: cblas_?nrm2 for long double type is not "
401  << "implemented. To use long double type, set USE_CBLAS "
402  << "to 0 and recompile the package."
403  << std::endl;
404  abort();
405  }
406 
407 
408  // =====
409  // xscal (float)
410  // =====
411 
414 
415  template <>
416  void xscal<float>(
417  const int N,
418  const float alpha,
419  float* X,
420  const int incX)
421  {
422  cblas_sscal(N, alpha, X, incX);
423  }
424 
425 
426  // =====
427  // xscal (double)
428  // =====
429 
432 
433  template <>
434  void xscal<double>(
435  const int N,
436  const double alpha,
437  double* X,
438  const int incX)
439  {
440  cblas_dscal(N, alpha, X, incX);
441  }
442 
443 
444  // =====
445  // xscal (long double)
446  // =====
447 
450 
451  template <>
452  void xscal<long double>(
453  const int N,
454  const long double alpha,
455  long double* X,
456  const int incX)
457  {
458  // Mark unused variables to avoid compiler warnings
459  // (-Wno-unused-parameter)
460  (void) N;
461  (void) alpha;
462  (void) X;
463  (void) incX;
464 
465  std::cerr << "Error: cblas_?scal for long double type is not "
466  << "implemented. To use long double type, set USE_CBLAS "
467  << "to 0 and recompile the package."
468  << std::endl;
469  abort();
470  }
471 } // namespace cblas_interface
472 
473 #endif // USE_CBLAS