ContentsFoundations to FrontierBezhig

graduate_code/cpp/benchmark.cpp

All lab code. Download this file.

#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';
    }
}