72 const RightColumns_ right_columns,
73 GetRightColumn_ get_right_column,
74 Output_*
const output,
77 const auto left_NR = left.
nrow();
78 const auto common_dim = left.
ncol();
84 for (LeftIndex_ lr = 0; lr < length; ++lr) {
85 const auto lptr = lext->fetch(lbuffer.data());
86 for (RightColumns_ rc = 0; rc < right_columns; ++rc) {
88 const auto res = dense_dot_product<accumulators_>(common_dim, lptr, get_right_column(rc),
static_cast<Output_
>(0));
89 output[sanisizer::nd_offset<std::size_t>(rc, right_columns, start + lr)] = res;
100 std::fill_n(output, sanisizer::product_unsafe<std::size_t>(left_NR, right_columns), 0);
107 std::vector<std::vector<LeftValue_> > lbuffers;
108 lbuffers.reserve(max_block_rows);
109 for (LeftIndex_ b = 0; b < max_block_rows; ++b) {
114 std::optional<std::vector<Output_> > tmp_output;
121 const auto max_block_cols = sanisizer::min(right_columns, options.
primary_block_size);
123 tmp_output.emplace(sanisizer::product<I<
decltype(tmp_output->size())> >(max_block_cols, max_block_rows));
124 optr = tmp_output->data();
130 while (lr < length) {
132 for (LeftIndex_ lr_counter = 0; lr_counter < lr_num; ++lr_counter) {
133 lptrs[lr_counter] = ext->fetch(lbuffers[lr_counter].data());
136 RightColumns_ rc = 0;
137 while (rc < right_columns) {
138 const RightColumns_ rc_num = sanisizer::min(options.
primary_block_size, right_columns - rc);
140 LeftIndex_ out_row_offset;
141 RightColumns_ out_col_offset, out_stride;
143 std::fill_n(optr, sanisizer::product_unsafe<std::size_t>(rc_num, lr_num), 0);
150 out_stride = right_columns;
154 while (cd < common_dim) {
156 for (LeftIndex_ lr_counter = 0; lr_counter < lr_num; ++lr_counter) {
157 const auto leftrow = lptrs[lr_counter];
158 for (RightColumns_ rc_counter = 0; rc_counter < rc_num; ++rc_counter) {
159 auto& dest = optr[sanisizer::nd_offset<std::size_t>(out_col_offset + rc_counter, out_stride, out_row_offset + lr_counter)];
160 dest = dense_dot_product<accumulators_>(
162 get_right_column(rc + rc_counter) + cd,
172 for (LeftIndex_ lr_counter = 0; lr_counter < lr_num; ++lr_counter) {
174 optr + sanisizer::product_unsafe<std::size_t>(rc_num, lr_counter),
176 output + sanisizer::nd_offset<std::size_t>(rc, right_columns, start + lr + lr_counter)
void multiply_dense_row_with_dense_column_matrix_to_row_output(const tatami::Matrix< LeftValue_, LeftIndex_ > &left, const RightColumns_ right_columns, GetRightColumn_ get_right_column, Output_ *const output, const MultiplyDenseRowWithDenseColumnMatrixToRowOutputOptions &options)
Definition column_to_row.hpp:70