allow user to decode block by block

This commit is contained in:
Ahmet Inan 2023-04-28 10:55:46 +02:00
commit f2ebaf4504
2 changed files with 14 additions and 16 deletions

View file

@ -65,29 +65,26 @@ struct CauchyReedSolomonDecoder
}
return prod_xy / (index(rows[j] + col_i) * prod_x * prod_y);
}
void operator()(ValueType *data, const ValueType *blocks, const ValueType *block_nums, int block_len, int block_cnt)
void operator()(ValueType *data, const ValueType *blocks, const ValueType *block_nums, int block_num, int block_len, int block_cnt)
{
for (int i = 0; i < block_cnt; i++) {
for (int k = 0; k < block_cnt; k++) {
IndexType b_ik = inverse_cauchy_matrix(block_nums, i, k, block_cnt);
for (int j = 0; j < block_len; j++) {
if (k)
data[j] = fma(b_ik, blocks[block_len*k+j], data[j]);
else
data[j] = b_ik * blocks[block_len*k+j];
}
for (int k = 0; k < block_cnt; k++) {
IndexType b_ik = inverse_cauchy_matrix(block_nums, block_num, k, block_cnt);
for (int j = 0; j < block_len; j++) {
if (k)
data[j] = fma(b_ik, blocks[block_len*k+j], data[j]);
else
data[j] = b_ik * blocks[block_len*k+j];
}
data += block_len;
}
}
void operator()(value_type *data, const value_type *blocks, const value_type *block_nums, int block_len, int block_cnt)
void operator()(value_type *data, const value_type *blocks, const value_type *block_nums, int block_num, int block_len, int block_cnt)
{
(*this)(reinterpret_cast<ValueType *>(data), reinterpret_cast<const ValueType *>(blocks), reinterpret_cast<const ValueType *>(block_nums), block_len, block_cnt);
(*this)(reinterpret_cast<ValueType *>(data), reinterpret_cast<const ValueType *>(blocks), reinterpret_cast<const ValueType *>(block_nums), block_num, block_len, block_cnt);
}
void operator()(void *data, const void *blocks, const value_type *block_numbers, int block_bytes, int block_count)
void operator()(void *data, const void *blocks, const value_type *block_numbers, int block_number, int block_bytes, int block_count)
{
assert(block_bytes % sizeof(value_type) == 0);
(*this)(reinterpret_cast<value_type *>(data), reinterpret_cast<const value_type *>(blocks), block_numbers, block_bytes / sizeof(value_type), block_count);
(*this)(reinterpret_cast<value_type *>(data), reinterpret_cast<const value_type *>(blocks), block_numbers, block_number, block_bytes / sizeof(value_type), block_count);
}
};

View file

@ -47,7 +47,8 @@ void crs_test(int trials)
double enc_mbs = double(data_bytes) / enc_usec.count();
uint8_t *data = new uint8_t[data_bytes];
auto dec_start = std::chrono::system_clock::now();
decode(data, blocks, numbers, block_bytes, block_count);
for (int i = 0; i < block_count; ++i)
decode(data + block_bytes * i, blocks, numbers, i, block_bytes, block_count);
auto dec_end = std::chrono::system_clock::now();
auto dec_usec = std::chrono::duration_cast<std::chrono::microseconds>(dec_end - dec_start);
double dec_mbs = double(data_bytes) / dec_usec.count();