Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- auto to_dense_column_major_naive(std::vector<std::vector<double>> const & vec)
- -> std::vector<double>
- {
- auto n_col = vec.size();
- auto n_row = vec[0].size();
- std::vector<double> out_vec(n_col * n_row);
- for (size_t i = 0; i < n_col; ++i)
- for (size_t j = 0; j < n_row; ++j)
- out_vec[i * n_row + j] = vec[i][j];
- return out_vec;
- }
- auto to_dense_row_major_blocking(std::vector<std::vector<double>> const & vec)
- -> std::vector<double>
- {
- auto n_col = vec.size();
- auto n_row = vec[0].size();
- std::vector<double> out_vec(n_col * n_row);
- size_t block_side = 8;
- for (size_t l = 0; l < n_col; l += block_side) {
- for (size_t k = 0; k < n_row; k += block_side) {
- for (size_t j = l; j < l + block_side && j < n_col; ++j) {
- auto const &column = vec[j];
- for (size_t i = k; i < k + block_side && i < n_row; ++i)
- out_vec[i * n_col + j] = column[i];
- }
- }
- }
- return out_vec;
- }
- auto to_dense_column_major_naive(std::vector<std::vector<double>> const & vec)
- -> std::vector<double>
- {
- auto n_col = vec.size();
- auto n_row = vec[0].size();
- std::vector<double> out_vec(n_col * n_row);
- for (size_t i = 0; i < n_col; ++i)
- for (size_t j = 0; j < n_row; ++j)
- out_vec[i * n_row + j] = vec[i][j];
- return out_vec;
- }
- auto to_dense_row_major_naive(std::vector<std::vector<double>> const & vec)
- -> std::vector<double>
- {
- auto n_col = vec.size();
- auto n_row = vec[0].size();
- std::vector<double> out_vec(n_col * n_row);
- for (size_t i = 0; i < n_col; ++i)
- for (size_t j = 0; j < n_row; ++j)
- out_vec[j * n_col + i] = vec[i][j];
- return out_vec;
- }
- auto to_dense_row_major_blocking(std::vector<std::vector<double>> const & vec)
- -> std::vector<double>
- {
- auto n_col = vec.size();
- auto n_row = vec[0].size();
- std::vector<double> out_vec(n_col * n_row);
- size_t block_side = 8;
- for (size_t l = 0; l < n_col; l += block_side) {
- for (size_t k = 0; k < n_row; k += block_side) {
- for (size_t j = l; j < l + block_side && j < n_col; ++j) {
- auto const &column = vec[j];
- for (size_t i = k; i < k + block_side && i < n_row; ++i)
- out_vec[i * n_col + j] = column[i];
- }
- }
- }
- return out_vec;
- }
- auto to_dense_column_major_blocking(std::vector<std::vector<double>> const & vec)
- -> std::vector<double>
- {
- auto n_col = vec.size();
- auto n_row = vec[0].size();
- std::vector<double> out_vec(n_col * n_row);
- size_t block_side = 8;
- for (size_t l = 0; l < n_col; l += block_side) {
- for (size_t k = 0; k < n_row; k += block_side) {
- for (size_t j = l; j < l + block_side && j < n_col; ++j) {
- auto const &column = vec[j];
- for (size_t i = k; i < k + block_side && i < n_row; ++i)
- out_vec[j * n_row + i] = column[i];
- }
- }
- }
- return out_vec;
- }
- auto make_vecvec() -> std::vector<std::vector<double>>
- {
- std::vector<std::vector<double>> vecvec(50, std::vector<double>(4000));
- std::mt19937 mersenne {2019};
- std::uniform_real_distribution<double> dist(-1000, 1000);
- for (auto &vec: vecvec)
- for (auto &val: vec)
- val = dist(mersenne);
- return vecvec;
- }
- static void NaiveColumnMajor(benchmark::State& state) {
- // Code before the loop is not measured
- auto vecvec = make_vecvec();
- for (auto _ : state) {
- benchmark::DoNotOptimize(to_dense_column_major_naive(vecvec));
- }
- }
- BENCHMARK(NaiveColumnMajor);
- static void NaiveRowMajor(benchmark::State& state) {
- // Code before the loop is not measured
- auto vecvec = make_vecvec();
- for (auto _ : state) {
- benchmark::DoNotOptimize(to_dense_row_major_naive(vecvec));
- }
- }
- BENCHMARK(NaiveRowMajor);
- static void BlockingRowMajor(benchmark::State& state) {
- // Code before the loop is not measured
- auto vecvec = make_vecvec();
- for (auto _ : state) {
- benchmark::DoNotOptimize(to_dense_row_major_blocking(vecvec));
- }
- }
- BENCHMARK(BlockingRowMajor);
- static void BlockingColumnMajor(benchmark::State& state) {
- // Code before the loop is not measured
- auto vecvec = make_vecvec();
- for (auto _ : state) {
- benchmark::DoNotOptimize(to_dense_column_major_blocking(vecvec));
- }
- }
- BENCHMARK(BlockingColumnMajor);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement