Program Listing for File MatrixMultiplication.cpp

Return to documentation for file (Source\PowerBench\Src\MatrixMultiplication.cpp)

#include "PowerBench/MatrixMultiplication.h"

using namespace Utils;

BENCHMARK_DEFINE_F(MatrixMultiplicationFixture, BM_MMNaive)(benchmark::State& st) {
  for (auto _ : st) {
    st.PauseTiming();
    Utils::ClearCache();
    st.ResumeTiming();

    const auto size = st.range(0);

    for (int i = 0; i < size; ++i)
    {
      for (int j = 0; j < size; ++j)
      {
        for (int k = 0; k < size; ++k)
        {
          m_result[i * size + j] += m_data1[i * size + k] * m_data2[k * size + j];
        }
      }
    }
  }
}
BENCHMARK_REGISTER_F(MatrixMultiplicationFixture, BM_MMNaive)->RangeMultiplier(2)->Range(256, 256 << 3);


BENCHMARK_DEFINE_F(MatrixMultiplicationFixture, BM_MMCacheOptimized)(benchmark::State& st) {
  for (auto _ : st) {
    st.PauseTiming();
    Utils::ClearCache();
    st.ResumeTiming();

    const auto size = st.range(0);

    double* rres;
    double* rmul1;
    double* rmul2;

    uint32_t i2, j2, k2;

    for (uint32_t i = 0; i < size; i += ELEMENTS_PER_LINE)
    {
      for (uint32_t j = 0; j < size; j += ELEMENTS_PER_LINE)
      {
        for (uint32_t k = 0; k < size; k += ELEMENTS_PER_LINE)
        {
          for (i2 = 0, rres = &m_result[i * size + j], rmul1 = &m_data1[i * size + k]; i2 < ELEMENTS_PER_LINE; ++i2, rres += size, rmul1 += size)
          {
            for (k2 = 0, rmul2 = &m_data2[k * size + j]; k2 < ELEMENTS_PER_LINE; ++k2, rmul2 += size)
            {
              for (j2 = 0; j2 < ELEMENTS_PER_LINE; ++j2)
              {
                rres[j2] += rmul1[k2] * rmul2[j2];
              }
            }
          }
        }
      }
    }
  }
}
BENCHMARK_REGISTER_F(MatrixMultiplicationFixture, BM_MMCacheOptimized)->RangeMultiplier(2)->Range(256, 256 << 3);