numerics 0.1.0
Loading...
Searching...
No Matches
vector.cpp
Go to the documentation of this file.
1/// @file core/backends/blas/vector.cpp
2/// @brief BLAS backend -- cblas level-1 vector operations
3
4#include "core/vector.hpp"
5#include "../seq/impl.hpp"
6#include <cmath>
7#include <cstdio>
8
9#ifdef NUMERICS_HAS_BLAS
10 #include <cblas.h>
11#endif
12
13namespace {
14void warn_blas_unavailable() {
15#ifndef NUMERICS_HAS_BLAS
16 static bool warned = false;
17 if (!warned) {
18 warned = true;
19 std::fprintf(stderr,
20 "[numerics] WARNING: Backend::blas requested but BLAS was "
21 "not found at "
22 "configure time.\n"
23 " Falling back to Backend::seq.\n"
24 " Install OpenBLAS and reconfigure: "
25 "apt install libopenblas-dev\n");
26 }
27#endif
28}
29} // namespace
30
31namespace num::backends::blas {
32
33void scale(Vector& v, real alpha) {
34 warn_blas_unavailable();
35#ifdef NUMERICS_HAS_BLAS
36 cblas_dscal(static_cast<int>(v.size()), alpha, v.data(), 1);
37#else
39#endif
40}
41
42void axpy(real alpha, const Vector& x, Vector& y) {
43 warn_blas_unavailable();
44#ifdef NUMERICS_HAS_BLAS
45 cblas_daxpy(static_cast<int>(x.size()), alpha, x.data(), 1, y.data(), 1);
46#else
47 num::backends::seq::axpy(alpha, x, y);
48#endif
49}
50
51real dot(const Vector& x, const Vector& y) {
52 warn_blas_unavailable();
53#ifdef NUMERICS_HAS_BLAS
54 return cblas_ddot(static_cast<int>(x.size()), x.data(), 1, y.data(), 1);
55#else
56 return num::backends::seq::dot(x, y);
57#endif
58}
59
60real norm(const Vector& x) {
61 warn_blas_unavailable();
62#ifdef NUMERICS_HAS_BLAS
63 return cblas_dnrm2(static_cast<int>(x.size()), x.data(), 1);
64#else
66#endif
67}
68
69} // namespace num::backends::blas
constexpr idx size() const noexcept
Definition vector.hpp:80
real dot(const Vector &x, const Vector &y)
Definition vector.cpp:51
void axpy(real alpha, const Vector &x, Vector &y)
Definition vector.cpp:42
real norm(const Vector &x)
Definition vector.cpp:60
void scale(Vector &v, real alpha)
Definition vector.cpp:33
real dot(const Vector &x, const Vector &y)
Definition vector.cpp:24
void scale(Vector &v, real alpha)
Definition vector.cpp:9
real norm(const Vector &x)
Definition vector.cpp:31
void axpy(real alpha, const Vector &x, Vector &y)
Definition vector.cpp:19
double real
Definition types.hpp:10
Vector operations.