diff --git a/cauchy_reed_solomon_erasure_coding.hh b/cauchy_reed_solomon_erasure_coding.hh index b7a1e65..5bddbdd 100644 --- a/cauchy_reed_solomon_erasure_coding.hh +++ b/cauchy_reed_solomon_erasure_coding.hh @@ -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(data), reinterpret_cast(blocks), reinterpret_cast(block_nums), block_len, block_cnt); + (*this)(reinterpret_cast(data), reinterpret_cast(blocks), reinterpret_cast(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(data), reinterpret_cast(blocks), block_numbers, block_bytes / sizeof(value_type), block_count); + (*this)(reinterpret_cast(data), reinterpret_cast(blocks), block_numbers, block_number, block_bytes / sizeof(value_type), block_count); } }; diff --git a/tests/crs_regression_test.cc b/tests/crs_regression_test.cc index c9025b1..39ad3f4 100644 --- a/tests/crs_regression_test.cc +++ b/tests/crs_regression_test.cc @@ -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(dec_end - dec_start); double dec_mbs = double(data_bytes) / dec_usec.count();