19 #ifndef __MAGMA_INTERFACE_HPP_
20 #define __MAGMA_INTERFACE_HPP_
29 #include "magma_lapack.h"
33 #define TESTING_CHECK( err ) \
35 magma_int_t err_ = (err); \
37 fprintf( stderr, "Error: %s\nfailed at %s:%d: error %lld: %s\n", \
38 #err, __FILE__, __LINE__, \
39 (long long) err_, magma_strerror(err_) ); \
50 template<
typename T>
struct Magma_allocator
54 using pointer = value_type *;
55 using const_pointer = value_type
const *;
56 using void_pointer =
void*;
57 using const_void_pointer =
void const *;
58 using size_type = std::size_t;
60 Magma_allocator() =
default;
61 template<
class U> constexpr Magma_allocator(Magma_allocator<U>
const &) noexcept {};
63 pointer allocate(std::size_t n);
65 void deallocate(pointer data,std::size_t) noexcept {
70 template<>
double * Magma_allocator<double>::allocate(std::size_t n)
72 double * data{
nullptr};
73 magma_int_t err{magma_dmalloc_cpu(&data,
static_cast<magma_int_t
>(n))};
74 if(err!= 0)
throw std::bad_alloc{};
77 template<> magma_int_t * Magma_allocator<magma_int_t>::allocate(std::size_t n)
79 magma_int_t * data{
nullptr};
80 magma_int_t err{magma_imalloc_cpu(&data,
static_cast<magma_int_t
>(n))};
81 if(err!= 0)
throw std::bad_alloc{};
86 template<
typename A,
typename B>
inline constexpr
bool operator==(Magma_allocator<A>
const &,Magma_allocator<B>
const &)
87 {
return std::is_same<A,B>::value;}
88 template<
typename A,
typename B>
inline constexpr
bool operator!=(Magma_allocator<A>
const &,Magma_allocator<B>
const &)
89 {
return !std::is_same<A,B>::value;}
92 class Magma_array :
public std::vector<double,Magma_allocator<double>>
95 using Base = std::vector<double,Magma_allocator<double>>;
98 Magma_array(std::size_t _dim) : Base(_dim),dim{static_cast<magma_int_t>(_dim)} {}
99 Magma_array(Array<double>
const & source) ;
100 magma_int_t get_dim()
const {
return dim;}
102 Magma_array & operator=(Array<double>
const &source);
108 class Magma_matrix :
public Magma_array
111 using PPivot = std::unique_ptr<std::vector<magma_int_t,Magma_allocator<magma_int_t>>>;
122 Magma_matrix(std::size_t _order,std::size_t _lda=0) :
123 Magma_array{_lda==0 ? _order*_order : _order*_lda},
124 order{static_cast<magma_int_t>(_order)},
125 lda{static_cast<magma_int_t>(_lda==0 ? _order : _lda)}, pivot{nullptr}
126 {assert(lda >= std::max(1,order));}
128 Magma_matrix(Array<double>
const & source,std::size_t n) : Magma_array{source},
129 order{static_cast<magma_int_t>(n)},
130 lda{static_cast<magma_int_t>(n)}, pivot{nullptr} {}
132 bool is_factorized()
const {
return pivot !=
nullptr;}
133 double operator()(std::size_t i,std::size_t j)
const
135 assert(0<=i && i<dim && 0<=j && j<lda);
136 return (*
this)[i+lda*j];
139 double & operator()(std::size_t i,std::size_t j)
141 assert(0<=i && i<dim && 0<=j && j<lda);
142 return (*
this)[i+lda*j];
145 Magma_matrix & set_column(std::size_t col,Array<double>
const & source)
147 assert(source.get_nbr() == order);
148 for(std::size_t i{0};i<source.get_nbr();i++)
150 (*this)(i,col) = source.get_data()[i];
155 magma_int_t get_order()
const {
return order;}
156 magma_int_t get_lda()
const {
return lda;}
158 Magma_array & solve(Magma_array & second_member);
159 using Magma_array::operator=;