benchmarkdialog.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "benchmarkdialog.h"
  2. #include <chrono>
  3. BenchmarkDialog::BenchmarkDialog(mnd::MandelContext& mndContext, QWidget *parent) :
  4. QDialog(parent),
  5. mndContext{ mndContext }
  6. {
  7. ui.setupUi(this);
  8. auto& devices = mndContext.getDevices();
  9. int nDevices = devices.size() + 1;
  10. ui.tableWidget->setColumnCount(2);
  11. ui.tableWidget->setRowCount(nDevices);
  12. ui.tableWidget->setHorizontalHeaderLabels({"Single Precision", "Double Precision"});
  13. QString cpuDesc = ("CPU [" + mndContext.getCpuInfo().getBrand() + "]").c_str();
  14. ui.tableWidget->setVerticalHeaderItem(0, new QTableWidgetItem(cpuDesc));
  15. for (int i = 0; i < devices.size(); i++) {
  16. QString cpuDesc = ("GPU " + std::to_string(i + 1) + " [" + devices[i].getVendor() + " " + devices[i].getName() + "]").c_str();
  17. ui.tableWidget->setVerticalHeaderItem(i + 1, new QTableWidgetItem(cpuDesc));
  18. }
  19. }
  20. mnd::MandelViewport BenchmarkDialog::benchViewport(void) const
  21. {
  22. return mnd::MandelViewport{ -0.758267525104592591494, -0.066895616551111110830, 0.000000043217777777655, 0.000000043217777777655 };
  23. }
  24. double BenchmarkDialog::measureMips(const std::function<Bitmap<float>()>& bench) const
  25. {
  26. using namespace std::chrono;
  27. auto before = high_resolution_clock::now();
  28. auto bitmap = bench();
  29. auto after = high_resolution_clock::now();
  30. long long sum = 0;
  31. for (int i = 0; i < bitmap.width * bitmap.height; i++) {
  32. sum += std::floor(bitmap.pixels[size_t(i)]);
  33. }
  34. double iterPerNanos = double(sum) / duration_cast<nanoseconds>(after - before).count();
  35. printf("test took %lld nanos\n", duration_cast<nanoseconds>(after - before).count());
  36. printf("test did %lld iters\n", sum);
  37. double megaItersPerSecond = iterPerNanos * 1000.0;
  38. return megaItersPerSecond;
  39. }
  40. QString BenchmarkDialog::benchmarkResult(mnd::Generator& mg, int size, int iters) const
  41. {
  42. mnd::MandelInfo mi;
  43. mi.bWidth = size;
  44. mi.bHeight = size;
  45. mi.maxIter = iters;
  46. mi.view = benchViewport();
  47. double megaItersPerSecond = measureMips([&mg, &mi] () {
  48. Bitmap<float> bmp(mi.bWidth, mi.bHeight);
  49. mg.generate(mi, bmp.pixels.get());
  50. return bmp;
  51. });
  52. QString mips = QString::number(megaItersPerSecond, 'f', 2);
  53. return mips;
  54. }
  55. void BenchmarkDialog::on_run_clicked()
  56. {
  57. mnd::Generator& cpuf = mndContext.getCpuGeneratorFloat();
  58. mnd::Generator& cpud = mndContext.getCpuGeneratorDouble();
  59. ui.tableWidget->setItem(0, 0, new QTableWidgetItem(benchmarkResult(cpuf, 1000, 5000)));
  60. ui.tableWidget->setItem(0, 1, new QTableWidgetItem(benchmarkResult(cpud, 1000, 5000)));
  61. auto& devices = mndContext.getDevices();
  62. for (int i = 0; i < devices.size(); i++) {
  63. if (mnd::Generator* gpuf; gpuf = devices[i].getGeneratorFloat()) {
  64. ui.tableWidget->setItem(i + 1, 0, new QTableWidgetItem(benchmarkResult(*gpuf, 4000, 5000)));
  65. }
  66. if (mnd::Generator* gpud; gpud = devices[i].getGeneratorDouble()) {
  67. ui.tableWidget->setItem(i + 1, 1, new QTableWidgetItem(benchmarkResult(*gpud, 4000, 5000)));
  68. }
  69. }
  70. // ui.tableWidget->setItem(0, 1, new QTableWidgetItem(benchmarkResult(clg, 4000, 10000)));
  71. }