#include <matrix.hpp>
#include <chrono>
#include <iomanip>
#include <iostream>
#include <random>
int main() {
constexpr std::size_t n=192,tile=24;
std::mt19937 rng(21);
std::uniform_real_distribution<double> sample(-1.,1.);
std::vector<double> a(n*n),b(n*n);
for(auto& x:a) x=sample(rng);
for(auto& x:b) x=sample(rng);
const auto reference=graduate::naive(a,b,n,n,n);
auto run=[&](bool blocked) {
const auto start=std::chrono::steady_clock::now();
const auto c=blocked ? graduate::blocked(a,b,n,n,n,tile)
: graduate::naive(a,b,n,n,n);
const auto end=std::chrono::steady_clock::now();
double checksum=0.;
for(std::size_t i=0;i<c.size();++i) {
if(std::abs(c[i]-reference[i])>1e-10*(1+std::abs(reference[i])))
throw std::runtime_error("result mismatch");
checksum+=c[i];
}
return std::pair{std::chrono::duration<double,std::milli>(end-start).count(),checksum};
};
(void)run(false); (void)run(true);
std::cout<<"pair,first,naive_ms,blocked_ms,checksum\n"<<std::setprecision(12);
for(int i=0;i<7;++i) {
std::pair<double,double> old,newer;
if(i%2==0) {old=run(false);newer=run(true);}
else {newer=run(true);old=run(false);}
std::cout<<i<<','<<(i%2==0?"naive":"blocked")<<','<<old.first<<','
<<newer.first<<','<<newer.second<<'\n';
}
}