1
0

mandelbench.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <chrono>
  4. #include <functional>
  5. #include <Mandel.h>
  6. #include <cmath>
  7. #include "Fixed.h"
  8. mnd::MandelViewport benchViewport(void)
  9. {
  10. return mnd::MandelViewport{ -1.250000598933854152929, 0.0001879894057291665530, 0.0000003839916666666565, 0.0000003839916666666565 };
  11. }
  12. const std::vector<mnd::MandelInfo> benches = {
  13. mnd::MandelInfo{ benchViewport(), 32, 32, 15, false },
  14. mnd::MandelInfo{ benchViewport(), 32, 32, 25, false },
  15. mnd::MandelInfo{ benchViewport(), 32, 32, 75, false },
  16. mnd::MandelInfo{ benchViewport(), 32, 32, 125, false },
  17. mnd::MandelInfo{ benchViewport(), 32, 32, 250, false },
  18. mnd::MandelInfo{ benchViewport(), 64, 32, 250, false },
  19. mnd::MandelInfo{ benchViewport(), 64, 64, 250, false },
  20. mnd::MandelInfo{ benchViewport(), 64, 64, 500, false },
  21. mnd::MandelInfo{ benchViewport(), 64, 128, 500, false },
  22. mnd::MandelInfo{ benchViewport(), 128, 128, 500, false },
  23. mnd::MandelInfo{ benchViewport(), 128, 128, 1000, false },
  24. mnd::MandelInfo{ benchViewport(), 128, 256, 1000, false },
  25. mnd::MandelInfo{ benchViewport(), 256, 256, 1000, false },
  26. mnd::MandelInfo{ benchViewport(), 256, 256, 2000, false },
  27. mnd::MandelInfo{ benchViewport(), 256, 512, 2000, false },
  28. mnd::MandelInfo{ benchViewport(), 512, 512, 2000, false },
  29. mnd::MandelInfo{ benchViewport(), 512, 512, 4000, false },
  30. mnd::MandelInfo{ benchViewport(), 512, 512, 8000, false },
  31. mnd::MandelInfo{ benchViewport(), 512, 512, 16000, false },
  32. mnd::MandelInfo{ benchViewport(), 512, 512, 32000, false },
  33. mnd::MandelInfo{ benchViewport(), 512, 512, 64000, false },
  34. mnd::MandelInfo{ benchViewport(), 512, 512, 128000, false },
  35. mnd::MandelInfo{ benchViewport(), 512, 512, 256000, false },
  36. mnd::MandelInfo{ benchViewport(), 512, 512, 512000, false },
  37. mnd::MandelInfo{ benchViewport(), 512, 512, 1024000, false },
  38. mnd::MandelInfo{ benchViewport(), 512, 512, 2048000, false },
  39. mnd::MandelInfo{ benchViewport(), 512, 512, 4096000, false },
  40. mnd::MandelInfo{ benchViewport(), 512, 512, 8192000, false },
  41. mnd::MandelInfo{ benchViewport(), 512, 512, 16384000, false },
  42. mnd::MandelInfo{ benchViewport(), 512, 512, 32768000, false },
  43. mnd::MandelInfo{ benchViewport(), 512, 512, 65536000, false },
  44. mnd::MandelInfo{ benchViewport(), 512, 512, 131072000, false },
  45. mnd::MandelInfo{ benchViewport(), 512, 512, 262144000, false },
  46. mnd::MandelInfo{ benchViewport(), 512, 512, 524288000, false },
  47. mnd::MandelInfo{ benchViewport(), 512, 512, 1048576000, false },
  48. mnd::MandelInfo{ benchViewport(), 512, 512, 2097152000, false },
  49. };
  50. std::pair<long long, std::chrono::nanoseconds> measureMips(const std::function<std::pair<float*, long>()>& bench)
  51. {
  52. using namespace std::chrono;
  53. auto before = high_resolution_clock::now();
  54. auto [bitmap, length] = bench();
  55. auto after = high_resolution_clock::now();
  56. long long sum = 0;
  57. for (int i = 0; i < length; i++) {
  58. sum += std::floor(bitmap[size_t(i)]);
  59. }
  60. return std::make_pair(sum, duration_cast<nanoseconds>(after - before));
  61. /*
  62. double iterPerNanos = double(sum) / duration_cast<nanoseconds>(after - before).count();
  63. //printf("test took %lld millis\n", duration_cast<milliseconds>(after - before).count());
  64. //printf("test did %lld iters\n", sum);
  65. double megaItersPerSecond = iterPerNanos * 1000.0;
  66. return megaItersPerSecond;*/
  67. }
  68. double benchmark(mnd::MandelGenerator& generator)
  69. {
  70. /*mnd::MandelInfo mi;
  71. mi.bWidth = 250;
  72. mi.bHeight = 250;
  73. mi.maxIter = 4000;
  74. mi.view = benchViewport();*/
  75. int testIndex = 0;
  76. for (int i = 0; i < benches.size(); i++) {
  77. const mnd::MandelInfo& mi = benches[i];
  78. auto data = std::make_unique<float[]>(mi.bWidth * mi.bHeight);
  79. auto [iters, time] = measureMips([&generator, &mi, &data]() { generator.generate(mi, data.get()); return std::make_pair(data.get(), mi.bWidth * mi.bHeight); });
  80. //printf("benchmark lvl %d, time %d ms\n", i, time.count() / 1000 / 1000);
  81. //fflush(stdout);
  82. if (time > std::chrono::milliseconds(200)) {
  83. testIndex = i + 2;
  84. break;
  85. }
  86. }
  87. const mnd::MandelInfo& mi = benches[(testIndex >= benches.size()) ? (benches.size() - 1) : testIndex];
  88. auto data = std::make_unique<float[]>(mi.bWidth * mi.bHeight);
  89. auto [iters, time] = measureMips([&generator, &mi, &data]() { generator.generate(mi, data.get()); return std::make_pair(data.get(), mi.bWidth * mi.bHeight); });
  90. //printf("bench time %d ms\n", time.count() / 1000 / 1000);
  91. //fflush(stdout);
  92. return double(iters) / time.count() * 1000;
  93. }
  94. #define REPORT_PERFORMANCE(name, performance) \
  95. do { std::cout << std::setw(30) << (name) << std::setw(10) << std::right << std::showbase << std::fixed << std::setprecision(2) << performance << std::endl; } while(0)
  96. int main()
  97. {
  98. mnd::MandelContext mc = mnd::initializeContext();
  99. std::cout << "Benchmarking CPU [" << mc.getCpuInfo().getBrand() << "]" << std::endl;
  100. auto types = mc.getSupportedTypes();
  101. for (auto [type, extension] : types) {
  102. std::string extInfo = extension != mnd::CpuExtension::NONE ?
  103. std::string(" ") + mnd::toString(extension) : "";
  104. REPORT_PERFORMANCE(mnd::toString(type) + extInfo + " [MIps]: ", benchmark(*mc.getCpuGenerator(type, extension)));
  105. }
  106. std::cout << std::endl;
  107. for (auto& device : mc.getDevices()) {
  108. std::cout << "Benchmarking Device [" << device->getVendor() << " " << device->getName() << "]" << std::endl;
  109. auto types = device->getSupportedTypes();
  110. for (auto type : types) {
  111. REPORT_PERFORMANCE(mnd::toString(type) + " [MIps]: ", benchmark(*device->getGenerator(type)));
  112. }
  113. std::cout << std::endl;
  114. }
  115. }