benchmarkdialog.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "benchmarkdialog.h"
  2. #include <chrono>
  3. BenchmarkDialog::BenchmarkDialog(QWidget *parent) : QDialog(parent)
  4. {
  5. ui.setupUi(this);
  6. }
  7. MandelViewport BenchmarkDialog::benchViewport(void) const
  8. {
  9. return MandelViewport{ -0.758267525104592591494, -0.066895616551111110830, 0.000000043217777777655, 0.000000043217777777655 };
  10. }
  11. double BenchmarkDialog::measureMips(const std::function<Bitmap<float>()>& bench) const
  12. {
  13. using namespace std::chrono;
  14. time_point before = high_resolution_clock::now();
  15. auto bitmap = bench();
  16. time_point after = high_resolution_clock::now();
  17. long long sum = 0;
  18. for (int i = 0; i < bitmap.width * bitmap.height; i++) {
  19. sum += std::floor(bitmap.pixels[size_t(i)]);
  20. }
  21. double iterPerNanos = double(sum) / duration_cast<nanoseconds>(after - before).count();
  22. printf("test took %lld nanos\n", duration_cast<nanoseconds>(after - before).count());
  23. printf("test did %lld iters\n", sum);
  24. double megaItersPerSecond = iterPerNanos * 1000.0;
  25. return megaItersPerSecond;
  26. }
  27. QString BenchmarkDialog::benchmarkResult(MandelGenerator& mg, int size, int iters) const
  28. {
  29. MandelInfo mi;
  30. mi.bWidth = size;
  31. mi.bHeight = size;
  32. mi.maxIter = iters;
  33. mi.view = benchViewport();
  34. double megaItersPerSecond = measureMips([&mg, &mi] () { return mg.generateRaw(mi); });
  35. QString mips = QString::number(megaItersPerSecond, 'f', 2);
  36. return mips;
  37. }
  38. void BenchmarkDialog::on_run_clicked()
  39. {
  40. CpuGenerator<double> cpg;
  41. CpuGenerator<float> cpgf;
  42. ClGenerator clg;
  43. ui.tableWidget->setItem(1, 0, new QTableWidgetItem(benchmarkResult(cpg, 2500, 5000)));
  44. ui.tableWidget->setItem(0, 0, new QTableWidgetItem(benchmarkResult(cpgf, 2500, 5000)));
  45. ui.tableWidget->setItem(0, 1, new QTableWidgetItem(benchmarkResult(clg, 4000, 8000)));
  46. }