74 : block_size(block_size)
75 , nrows(backend::nbRow(A))
76 , ncols(backend::nbColumn(A))
77 , brows((nrows + block_size - 1) / block_size)
78 , bcols((ncols + block_size - 1) / block_size)
81 std::vector<ptrdiff_t> marker(bcols, -1);
84 for (ptr_type ib = 0; ib < static_cast<ptr_type>(brows); ++ib) {
85 ptr_type ia = ib * block_size;
87 for (
size_t k = 0; k < block_size && ia < static_cast<ptr_type>(nrows); ++k, ++ia) {
88 for (
auto a = backend::row_begin(A, ia); a; ++a) {
89 col_type cb = a.col() / block_size;
91 if (marker[cb] !=
static_cast<col_type
>(ib)) {
92 marker[cb] =
static_cast<col_type
>(ib);
100 std::partial_sum(ptr.begin(), ptr.end(), ptr.begin());
101 col.resize(ptr.back());
102 val.resize(ptr.back() * block_size * block_size, 0);
105 std::fill(marker.begin(), marker.end(), -1);
108 for (ptr_type ib = 0; ib < static_cast<ptr_type>(brows); ++ib) {
109 ptr_type ia = ib * block_size;
110 ptr_type row_beg = ptr[ib];
111 ptr_type row_end = row_beg;
113 for (
size_t k = 0; k < block_size && ia < static_cast<ptr_type>(nrows); ++k, ++ia) {
114 for (
auto a = backend::row_begin(A, ia); a; ++a) {
115 col_type cb = a.col() / block_size;
116 col_type cc = a.col() % block_size;
117 val_type va = a.value();
119 if (marker[cb] < row_beg) {
120 marker[cb] = row_end;
122 val[block_size * (block_size * row_end + k) + cc] = va;
126 val[block_size * (block_size * marker[cb] + k) + cc] = va;