<T>LAPACK 0.1.1
C++ Template Linear Algebra PACKage
Loading...
Searching...
No Matches
starpu.hpp
Go to the documentation of this file.
1
3//
4// Copyright (c) 2021-2023, University of Colorado Denver. All rights reserved.
5//
6// This file is part of <T>LAPACK.
7// <T>LAPACK is free software: you can redistribute it and/or modify it under
8// the terms of the BSD 3-Clause license. See the accompanying LICENSE file.
9
10#ifndef TLAPACK_STARPU_HH
11#define TLAPACK_STARPU_HH
12
15
16namespace tlapack {
17
18template <class T>
19constexpr real_type<T> real(const starpu::MatrixEntry<T>& x) noexcept
20{
21 if constexpr (is_complex<T>)
22 return real(T(x));
23 else
24 return real_type<T>(T(x));
25}
26
27template <class T>
28constexpr real_type<T> imag(const starpu::MatrixEntry<T>& x) noexcept
29{
30 if constexpr (is_complex<T>)
31 return imag(T(x));
32 else
33 return real_type<T>(0);
34}
35
36template <class T>
37constexpr T conj(const starpu::MatrixEntry<T>& x) noexcept
38{
39 if constexpr (is_complex<T>)
40 return conj(T(x));
41 else
42 return T(x);
43}
44
45namespace traits {
46 template <class T>
47 struct real_type_traits<starpu::MatrixEntry<T>, int>
48 : public real_type_traits<T, int> {};
49 template <class T>
50 struct complex_type_traits<starpu::MatrixEntry<T>, int>
51 : public complex_type_traits<T, int> {};
52} // namespace traits
53
54} // namespace tlapack
55
56namespace tlapack {
57
58// -----------------------------------------------------------------------------
59// Data descriptors
60
61// Number of rows
62template <class T>
63constexpr auto nrows(const starpu::Matrix<T>& A) noexcept
64{
65 return A.nrows();
66}
67// Number of columns
68template <class T>
69constexpr auto ncols(const starpu::Matrix<T>& A) noexcept
70{
71 return A.ncols();
72}
73// Size
74template <class T>
75constexpr auto size(const starpu::Matrix<T>& A) noexcept
76{
77 return A.nrows() * A.ncols();
78}
79
80// -----------------------------------------------------------------------------
81// Block operations for starpu::Matrix
82
83#define isSlice(SliceSpec) \
84 std::is_convertible<SliceSpec, \
85 std::tuple<starpu::idx_t, starpu::idx_t>>::value
86
87template <
88 class T,
89 class SliceSpecRow,
90 class SliceSpecCol,
91 typename std::enable_if<isSlice(SliceSpecRow) && isSlice(SliceSpecCol),
92 int>::type = 0>
93constexpr auto slice(const starpu::Matrix<T>& A,
94 SliceSpecRow&& rows,
95 SliceSpecCol&& cols) noexcept
96{
97 using starpu::idx_t;
98
99 const idx_t row0 = std::get<0>(rows);
100 const idx_t col0 = std::get<0>(cols);
101 const idx_t row1 = std::get<1>(rows);
102 const idx_t col1 = std::get<1>(cols);
103
104 return A.map_to_const_tiles(row0, row1, col0, col1);
105}
106template <
107 class T,
108 class SliceSpecRow,
109 class SliceSpecCol,
110 typename std::enable_if<isSlice(SliceSpecRow) && isSlice(SliceSpecCol),
111 int>::type = 0>
112constexpr auto slice(starpu::Matrix<T>& A,
113 SliceSpecRow&& rows,
114 SliceSpecCol&& cols) noexcept
115{
116 using starpu::idx_t;
117
118 const idx_t row0 = std::get<0>(rows);
119 const idx_t col0 = std::get<0>(cols);
120 const idx_t row1 = std::get<1>(rows);
121 const idx_t col1 = std::get<1>(cols);
122
123 return A.map_to_tiles(row0, row1, col0, col1);
124}
125
126#undef isSlice
127
128template <class T, class SliceSpec>
129constexpr auto slice(const starpu::Matrix<T>& v,
130 SliceSpec&& range,
131 starpu::idx_t colIdx) noexcept
132{
133 return slice(v, std::forward<SliceSpec>(range),
134 std::make_tuple(colIdx, colIdx + 1));
135}
136template <class T, class SliceSpec>
137constexpr auto slice(starpu::Matrix<T>& v,
138 SliceSpec&& range,
139 starpu::idx_t colIdx) noexcept
140{
141 return slice(v, std::forward<SliceSpec>(range),
142 std::make_tuple(colIdx, colIdx + 1));
143}
144
145template <class T, class SliceSpec>
146constexpr auto slice(const starpu::Matrix<T>& v,
147 starpu::idx_t rowIdx,
148 SliceSpec&& range) noexcept
149{
150 return slice(v, std::make_tuple(rowIdx, rowIdx + 1),
151 std::forward<SliceSpec>(range));
152}
153template <class T, class SliceSpec>
154constexpr auto slice(starpu::Matrix<T>& v,
155 starpu::idx_t rowIdx,
156 SliceSpec&& range) noexcept
157{
158 return slice(v, std::make_tuple(rowIdx, rowIdx + 1),
159 std::forward<SliceSpec>(range));
160}
161
162template <class T, class SliceSpec>
163constexpr auto slice(const starpu::Matrix<T>& v, SliceSpec&& range) noexcept
164{
165 assert((v.nrows() <= 1 || v.ncols() <= 1) && "Matrix is not a vector");
166
167 if (v.nrows() > 1)
168 return slice(v, std::forward<SliceSpec>(range), std::make_tuple(0, 1));
169 else
170 return slice(v, std::make_tuple(0, 1), std::forward<SliceSpec>(range));
171}
172template <class T, class SliceSpec>
173constexpr auto slice(starpu::Matrix<T>& v, SliceSpec&& range) noexcept
174{
175 assert((v.nrows() <= 1 || v.ncols() <= 1) && "Matrix is not a vector");
176
177 if (v.nrows() > 1)
178 return slice(v, std::forward<SliceSpec>(range), std::make_tuple(0, 1));
179 else
180 return slice(v, std::make_tuple(0, 1), std::forward<SliceSpec>(range));
181}
182
183template <class T>
184constexpr auto col(const starpu::Matrix<T>& A, starpu::idx_t colIdx) noexcept
185{
186 return slice(A, std::make_tuple(0, A.nrows()),
187 std::make_tuple(colIdx, colIdx + 1));
188}
189template <class T>
190constexpr auto col(starpu::Matrix<T>& A, starpu::idx_t colIdx) noexcept
191{
192 return slice(A, std::make_tuple(0, A.nrows()),
193 std::make_tuple(colIdx, colIdx + 1));
194}
195
196template <class T, class SliceSpec>
197constexpr auto cols(const starpu::Matrix<T>& A, SliceSpec&& cols) noexcept
198{
199 return slice(A, std::make_tuple(0, A.nrows()),
200 std::forward<SliceSpec>(cols));
201}
202template <class T, class SliceSpec>
203constexpr auto cols(starpu::Matrix<T>& A, SliceSpec&& cols) noexcept
204{
205 return slice(A, std::make_tuple(0, A.nrows()),
206 std::forward<SliceSpec>(cols));
207}
208
209template <class T>
210constexpr auto row(const starpu::Matrix<T>& A, starpu::idx_t rowIdx) noexcept
211{
212 return slice(A, std::make_tuple(rowIdx, rowIdx + 1),
213 std::make_tuple(0, A.ncols()));
214}
215template <class T>
216constexpr auto row(starpu::Matrix<T>& A, starpu::idx_t rowIdx) noexcept
217{
218 return slice(A, std::make_tuple(rowIdx, rowIdx + 1),
219 std::make_tuple(0, A.ncols()));
220}
221
222template <class T, class SliceSpec>
223constexpr auto rows(const starpu::Matrix<T>& A, SliceSpec&& rows) noexcept
224{
225 return slice(A, std::forward<SliceSpec>(rows),
226 std::make_tuple(0, A.ncols()));
227}
228template <class T, class SliceSpec>
229constexpr auto rows(starpu::Matrix<T>& A, SliceSpec&& rows) noexcept
230{
231 return slice(A, std::forward<SliceSpec>(rows),
232 std::make_tuple(0, A.ncols()));
233}
234
235template <class T>
236constexpr auto diag(const starpu::Matrix<T>& A, int diagIdx = 0)
237{
238 throw std::runtime_error("Not implemented");
239 return row(A, 0);
240}
241template <class T>
242constexpr auto diag(starpu::Matrix<T>& A, int diagIdx = 0)
243{
244 throw std::runtime_error("Not implemented");
245 return row(A, 0);
246}
247
248namespace traits {
249
250 template <class TA, class TB>
251 struct matrix_type_traits<starpu::Matrix<TA>, starpu::Matrix<TB>, int> {
252 using T = scalar_type<TA, TB>;
253 using type = starpu::Matrix<T>;
254 };
255
256 template <class TA, class TB>
257 struct vector_type_traits<starpu::Matrix<TA>, starpu::Matrix<TB>, int> {
258 using T = scalar_type<TA, TB>;
259 using type = starpu::Matrix<T>;
260 };
261
263 template <class U>
264 struct CreateFunctor<starpu::Matrix<U>, int> {
265 template <class T>
266 constexpr auto operator()(std::vector<T>& v,
267 starpu::idx_t m,
268 starpu::idx_t n = 1) const
269 {
270 assert(m >= 0 && n >= 0);
271 v.resize(m * n); // Allocates space in memory
272 starpu_memory_pin((void*)v.data(), m * n * sizeof(T));
273 return starpu::Matrix<T>(v.data(), m, n, 1, 1);
274 }
275 };
276
278 template <class U, int m, int n>
279 struct CreateStaticFunctor<starpu::Matrix<U>, m, n, int> {
280 static_assert(m >= 0 && n >= -1);
281
282 template <class T>
283 constexpr auto operator()(T* v) const
284 {
285 constexpr int Cols_ = (n == -1) ? 1 : n;
286 starpu_memory_pin(v, m * Cols_ * sizeof(T));
287 return starpu::Matrix<T>(v, m, Cols_, 1, 1);
288 }
289 };
290} // namespace traits
291
292} // namespace tlapack
293
294#endif // TLAPACK_STARPU_HH
constexpr real_type< T > real(const T &x) noexcept
Extends std::real() to real datatypes.
Definition utils.hpp:71
constexpr T conj(const T &x) noexcept
Extends std::conj() to real datatypes.
Definition utils.hpp:100
constexpr real_type< T > imag(const T &x) noexcept
Extends std::imag() to real datatypes.
Definition utils.hpp:86
Class for representing a matrix in StarPU that is split into tiles.
Definition Matrix.hpp:133
constexpr auto diag(T &A, int diagIdx=0) noexcept
Get the Diagonal of an Eigen Matrix.
Definition eigen.hpp:576
Concept for a matrix.
typename traits::real_type_traits< Types..., int >::type real_type
The common real type of the list of types.
Definition scalar_type_traits.hpp:113
Functor for data creation.
Definition arrayTraits.hpp:89
constexpr auto operator()(std::vector< T > &v, idx_t m, idx_t n=1) const
Creates a m-by-n matrix with entries of type T.
Definition arrayTraits.hpp:105
Functor for data creation with static size.
Definition arrayTraits.hpp:141
constexpr auto operator()(T *v) const
Creates a m-by-n matrix or, if n == -1, a vector of size m.
Definition arrayTraits.hpp:157
Complex type traits for the list of types Types.
Definition scalar_type_traits.hpp:145
Matrix type deduction.
Definition arrayTraits.hpp:176
Real type traits for the list of types Types.
Definition scalar_type_traits.hpp:71
Vector type deduction.
Definition arrayTraits.hpp:203