10#ifndef TLAPACK_STARPU_MATRIXENTRY_HH
11#define TLAPACK_STARPU_MATRIXENTRY_HH
25 enum class Operation :
int {
48 template <
class T,
class U,
internal::Operation op>
54 if constexpr (
op == internal::Operation::Assign)
56 else if constexpr (
op == internal::Operation::Add)
58 else if constexpr (
op == internal::Operation::Subtract)
60 else if constexpr (
op == internal::Operation::Multiply)
62 else if constexpr (
op == internal::Operation::Divide)
73 template <
class T,
class U,
internal::Operation op>
79 if constexpr (
op == internal::Operation::Assign)
81 else if constexpr (
op == internal::Operation::Add)
83 else if constexpr (
op == internal::Operation::Subtract)
85 else if constexpr (
op == internal::Operation::Multiply)
87 else if constexpr (
op == internal::Operation::Divide)
98 template <
class T,
internal::Operation op>
102 using args_t = std::tuple<idx_t, idx_t, idx_t, idx_t>;
109 const idx_t& i = std::get<0>(
cl_args);
110 const idx_t& j = std::get<1>(
cl_args);
111 const idx_t&
k = std::get<2>(
cl_args);
112 const idx_t&
l = std::get<3>(
cl_args);
116 T&
x = ((T*)
A)[i +
ld * j];
117 const T&
y = ((T*)
A)[
k +
ld *
l];
120 if constexpr (
op == internal::Operation::Assign)
122 else if constexpr (
op == internal::Operation::Add)
124 else if constexpr (
op == internal::Operation::Subtract)
126 else if constexpr (
op == internal::Operation::Multiply)
128 else if constexpr (
op == internal::Operation::Divide)
144 template <
typename T>
159 .filter_arg_ptr = (
void*)
pos};
164 MatrixEntry(MatrixEntry&&) =
delete;
165 MatrixEntry(
const MatrixEntry&) =
delete;
166 MatrixEntry& operator=(
const MatrixEntry&) =
delete;
186 std::enable_if_t<std::is_same_v<real_type<U>, T>,
int> = 0>
203 constexpr MatrixEntry& operator=(
const T&
x)
noexcept
250 constexpr friend real_type<T> abs(
const MatrixEntry&
x)
noexcept
257 constexpr friend std::ostream& operator<<(std::ostream&
out,
258 const MatrixEntry&
x)
267 template <
internal::Operation op,
class U>
270 using internal::Operation;
271 struct starpu_codelet cl = internal::codelet_init();
273 cl.cpu_funcs[0] = internal::data_op_value<T, U, op>;
275 cl.modes[0] = (op == Operation::Assign) ? STARPU_W : STARPU_RW;
276 cl.name = (op == Operation::Assign) ?
"assign_value"
277 : (op == Operation::Add) ?
"add_value"
278 : (op == Operation::Subtract) ?
"subtract_value"
279 : (op == Operation::Multiply) ?
"multiply_value"
280 : (op == Operation::Divide) ?
"divide_value"
285 cl.where |= STARPU_CPU;
299 gen_cl_op_value<internal::Operation::Add,
real_type<T>>(),
301 gen_cl_op_value<internal::Operation::Multiply,
real_type<T>>(),
307 template <
internal::Operation op,
class U>
310 using internal::Operation;
311 struct starpu_codelet cl = internal::codelet_init();
313 cl.cpu_funcs[0] = internal::data_op_data<T, U, op>;
315 cl.modes[0] = (op == Operation::Assign) ? STARPU_W : STARPU_RW;
316 cl.modes[1] = STARPU_R;
317 cl.name = (op == Operation::Assign) ?
"assign_data"
318 : (op == Operation::Add) ?
"add_data"
319 : (op == Operation::Subtract) ?
"subtract_data"
320 : (op == Operation::Multiply) ?
"multiply_data"
321 : (op == Operation::Divide) ?
"divide_data"
326 cl.where |= STARPU_CPU;
340 gen_cl_op_data<internal::Operation::Add,
real_type<T>>(),
342 gen_cl_op_data<internal::Operation::Multiply,
real_type<T>>(),
348 template <
internal::Operation op>
351 using internal::Operation;
352 struct starpu_codelet cl = internal::codelet_init();
354 cl.cpu_funcs[0] = internal::matrixentry_op_matrixentry<T, op>;
356 cl.modes[0] = STARPU_RW;
357 cl.name = (op == Operation::Assign) ?
"copy_entry"
358 : (op == Operation::Add) ?
"add_entry"
359 : (op == Operation::Subtract) ?
"subtract_entry"
360 : (op == Operation::Multiply) ?
"multiply_entry"
361 : (op == Operation::Divide) ?
"divide_entry"
366 cl.where |= STARPU_CPU;
388 template <internal::Operation
op,
390 std::enable_if_t<(std::is_same_v<U, T> ||
391 std::is_same_v<U, real_type<T>>),
398 if (this->root_handle ==
x.root_handle) {
403 using args_t = std::tuple<idx_t, idx_t, idx_t, idx_t>;
419 task->callback_func = [](
void*
args)
noexcept {
427 std::is_same_v<U, T> ? cl_op_data[
int(
op)]
428 : cl_op_rdata[
int(
op)]);
430 task->handles[1] =
x.handle;
449 template <internal::Operation
op,
451 std::enable_if_t<(std::is_same_v<U, T> ||
452 std::is_same_v<U, real_type<T>>),
454 MatrixEntry& operate_and_assign(
const T&
x)
462 ? cl_op_value[
int(
op)]
463 : cl_op_rvalue[
int(
op)]);
465 task->cl_arg = (
void*)
x_ptr;
466 task->cl_arg_size =
sizeof(T);
467 task->callback_func = [](
void*
arg)
noexcept {
delete (T*)
arg; };
480 template <
class lhs_t,
483 (std::is_same_v<lhs_t, rhs_t>) ||
493 template <
class lhs_t,
496 (std::is_same_v<lhs_t, rhs_t>) ||
499 constexpr auto operator+(
const lhs_t&
x,
506 template <
class lhs_t,
509 (std::is_same_v<lhs_t, rhs_t>) ||
519 template <
class lhs_t,
522 (std::is_same_v<lhs_t, rhs_t>) ||
532 template <
class lhs_t,
535 (std::is_same_v<lhs_t, rhs_t>) ||
538 constexpr auto operator-(
const lhs_t&
x,
545 template <
class lhs_t,
548 (std::is_same_v<lhs_t, rhs_t>) ||
558 template <
class lhs_t,
561 (std::is_same_v<lhs_t, rhs_t>) ||
571 template <
class lhs_t,
574 (std::is_same_v<lhs_t, rhs_t>) ||
577 constexpr auto operator*(
const lhs_t&
x,
584 template <
class lhs_t,
587 (std::is_same_v<lhs_t, rhs_t>) ||
597 template <
class lhs_t,
600 (std::is_same_v<lhs_t, rhs_t>) ||
610 template <
class lhs_t,
613 (std::is_same_v<lhs_t, rhs_t>) ||
616 constexpr auto operator/(
const lhs_t&
x,
623 template <
class lhs_t,
626 (std::is_same_v<lhs_t, rhs_t>) ||
constexpr void data_op_data(void **buffers, void *args) noexcept
MatrixEntry operation with assignment using two StarPU variable buffers.
Definition MatrixEntry.hpp:49
constexpr struct starpu_codelet codelet_init() noexcept
Return an empty starpu_codelet struct.
Definition MatrixEntry.hpp:34
constexpr void matrixentry_op_matrixentry(void **buffers, void *args) noexcept
MatrixEntry operation with assignment using a two matrix entries.
Definition MatrixEntry.hpp:99
constexpr void data_op_value(void **buffers, void *args) noexcept
MatrixEntry operation with assignment using a StarPU variable buffer and a value.
Definition MatrixEntry.hpp:74
Sort the numbers in D in increasing order (if ID = 'I') or in decreasing order (if ID = 'D' ).
Definition arrayTraits.hpp:15
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
Arithmetic data type used by Matrix.
Definition MatrixEntry.hpp:145
const idx_t pos[2]
Position of the entry in the matrix.
Definition MatrixEntry.hpp:148
const starpu_data_handle_t root_handle
Matrix handle.
Definition MatrixEntry.hpp:146
~MatrixEntry() noexcept
Destructor cleans StarPU partition plan.
Definition MatrixEntry.hpp:169
starpu_data_handle_t handle
Entry handle.
Definition MatrixEntry.hpp:147
constexpr MatrixEntry(starpu_data_handle_t root_handle, const idx_t pos[2]) noexcept
MatrixEntry constructor from a variable handle.
Definition MatrixEntry.hpp:151