|
@@ -3,13 +3,51 @@
|
|
|
#include <cmath>
|
|
|
|
|
|
|
|
|
-mnd::MandelViewport Benchmarker::benchViewport(void) const
|
|
|
+mnd::MandelViewport Benchmarker::benchViewport(void)
|
|
|
{
|
|
|
- return mnd::MandelViewport{ -0.758267525104592591494, -0.066895616551111110830, 0.000000043217777777655, 0.000000043217777777655 };
|
|
|
+ //return mnd::MandelViewport{ -0.758267525104592591494, -0.066895616551111110830, 0.000000043217777777655, 0.000000043217777777655 };
|
|
|
+ return mnd::MandelViewport{ -1.250000598933854152929, 0.0001879894057291665530, 0.0000003839916666666565, 0.0000003839916666666565 };
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-double Benchmarker::measureMips(const std::function<Bitmap<float>()>& bench) const
|
|
|
+const std::vector<mnd::MandelInfo> Benchmarker::benches {
|
|
|
+ mnd::MandelInfo{ benchViewport(), 100, 100, 1000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 100, 200, 1000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 200, 200, 1000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 200, 200, 2000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 200, 400, 2000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 400, 400, 2000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 400, 400, 4000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 400, 800, 4000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 800, 800, 4000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 800, 800, 8000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 800, 800, 16000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 800, 1600, 16000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 1600, 1600, 16000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 1600, 1600, 32000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 1600, 1600, 64000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 1600, 3200, 64000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 3200, 3200, 64000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 3200, 3200, 128000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 3200, 3200, 256000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 3200, 3200, 512000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 3200, 3200, 1024000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 3200, 3200, 2048000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 3200, 6400, 2048000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 2048000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 4096000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 8192000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 16384000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 32768000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 65536000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 131072000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 262144000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 524288000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 1048576000 },
|
|
|
+ mnd::MandelInfo{ benchViewport(), 6400, 6400, 2097152000 },
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+std::pair<long long, std::chrono::nanoseconds> Benchmarker::measureMips(const std::function<Bitmap<float>()>& bench) const
|
|
|
{
|
|
|
using namespace std::chrono;
|
|
|
auto before = high_resolution_clock::now();
|
|
@@ -21,60 +59,41 @@ double Benchmarker::measureMips(const std::function<Bitmap<float>()>& bench) con
|
|
|
sum += std::floor(bitmap.pixels[size_t(i)]);
|
|
|
}
|
|
|
|
|
|
- double iterPerNanos = double(sum) / duration_cast<nanoseconds>(after - before).count();
|
|
|
- printf("test took %lld millis\n", duration_cast<milliseconds>(after - before).count());
|
|
|
- printf("test did %lld iters\n", sum);
|
|
|
- double megaItersPerSecond = iterPerNanos * 1000.0;
|
|
|
- return megaItersPerSecond;
|
|
|
+ return std::make_pair(sum, duration_cast<nanoseconds>(after - before));
|
|
|
}
|
|
|
|
|
|
double Benchmarker::benchmarkResult(mnd::Generator& mg) const
|
|
|
{
|
|
|
- // create testbenchmark
|
|
|
- mnd::MandelInfo mi;
|
|
|
- mi.bWidth = 250;
|
|
|
- mi.bHeight = 250;
|
|
|
- mi.maxIter = 4000;
|
|
|
- mi.view = benchViewport();
|
|
|
- double testValue = measureMips([&mg, &mi] () {
|
|
|
- Bitmap<float> bmp(mi.bWidth, mi.bHeight);
|
|
|
- mg.generate(mi, bmp.pixels.get());
|
|
|
- return bmp;
|
|
|
- });
|
|
|
-
|
|
|
- printf("testbench: %lf\n", testValue);
|
|
|
-
|
|
|
- std::vector<std::pair<double, mnd::MandelInfo>> benches {
|
|
|
- { 200, mnd::MandelInfo{ benchViewport(), 750, 750, 5000} },
|
|
|
- { 500, mnd::MandelInfo{ benchViewport(), 2000, 1000, 7500} },
|
|
|
- { 2000, mnd::MandelInfo{ benchViewport(), 2000, 2000, 15000} },
|
|
|
- { 5000, mnd::MandelInfo{ benchViewport(), 3000, 3000, 30000} },
|
|
|
- { 10000, mnd::MandelInfo{ benchViewport(), 4000, 4000, 75000} },
|
|
|
- { 100000, mnd::MandelInfo{ benchViewport(), 6000, 6000, 750000} },
|
|
|
- { std::numeric_limits<double>::max(), mnd::MandelInfo{ benchViewport(), 7000, 7000, 1000000} }
|
|
|
- };
|
|
|
-
|
|
|
- double megaItersPerSecond = 0.0;
|
|
|
- if (testValue < 100) {
|
|
|
- megaItersPerSecond = testValue;
|
|
|
- }
|
|
|
- else {
|
|
|
- for (auto& [thresh, info] : benches) {
|
|
|
- auto& m = info;
|
|
|
- if (testValue < thresh) {
|
|
|
- megaItersPerSecond = measureMips([&mg, &m] () {
|
|
|
- Bitmap<float> bmp(m.bWidth, m.bHeight);
|
|
|
- mg.generate(m, bmp.pixels.get());
|
|
|
- return bmp;
|
|
|
- });
|
|
|
- break;
|
|
|
- }
|
|
|
+ int testIndex = 0;
|
|
|
+
|
|
|
+ for (int i = 0; i < benches.size(); i++) {
|
|
|
+ const mnd::MandelInfo& mi = benches[i];
|
|
|
+ auto data = std::make_unique<float[]>(mi.bWidth * mi.bHeight);
|
|
|
+ auto [iters, time] = measureMips([&mg, &mi, &data]() {
|
|
|
+ Bitmap<float> bmp(mi.bWidth, mi.bHeight);
|
|
|
+ mg.generate(mi, bmp.pixels.get());
|
|
|
+ return bmp;
|
|
|
+ });
|
|
|
+ //printf("benchmark lvl %d, time %d ms\n", i, time.count() / 1000 / 1000);
|
|
|
+ //fflush(stdout);
|
|
|
+ if (time > std::chrono::milliseconds(1000)) {
|
|
|
+ testIndex = i + 2;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
+ const mnd::MandelInfo& mi = benches[(testIndex >= benches.size()) ? (benches.size() - 1) : testIndex];
|
|
|
+ auto data = std::make_unique<float[]>(mi.bWidth * mi.bHeight);
|
|
|
+ auto [iters, time] = measureMips([&mg, &mi, &data]() {
|
|
|
+ Bitmap<float> bmp(mi.bWidth, mi.bHeight);
|
|
|
+ mg.generate(mi, bmp.pixels.get());
|
|
|
+ return bmp;
|
|
|
+ });
|
|
|
+ //printf("bench time %d ms\n", time.count() / 1000 / 1000);
|
|
|
+ //fflush(stdout);
|
|
|
|
|
|
- return megaItersPerSecond;
|
|
|
+ return double(iters) / time.count() * 1000;
|
|
|
}
|
|
|
|
|
|
|