Skip to content
Snippets Groups Projects
Commit 25dde50c authored by andreykproductengine's avatar andreykproductengine
Browse files

SL-11106 Time-limit benchmark test

parent 77ba3328
No related branches found
No related tags found
No related merge requests found
...@@ -1005,7 +1005,10 @@ F32 gpu_benchmark() ...@@ -1005,7 +1005,10 @@ F32 gpu_benchmark()
//number of samples to take //number of samples to take
const S32 samples = 64; const S32 samples = 64;
//time limit, allocation operations shouldn't take longer then 30 seconds, same for actual benchmark.
const F32 time_limit = 30;
ShaderProfileHelper initProfile; ShaderProfileHelper initProfile;
std::vector<LLRenderTarget> dest(count); std::vector<LLRenderTarget> dest(count);
...@@ -1023,12 +1026,14 @@ F32 gpu_benchmark() ...@@ -1023,12 +1026,14 @@ F32 gpu_benchmark()
gGL.setColorMask(true, true); gGL.setColorMask(true, true);
LLGLDepthTest depth(GL_FALSE); LLGLDepthTest depth(GL_FALSE);
LLTimer alloc_timer;
alloc_timer.start();
for (U32 i = 0; i < count; ++i) for (U32 i = 0; i < count; ++i)
{ {
//allocate render targets and textures //allocate render targets and textures
if (!dest[i].allocate(res, res, GL_RGBA, false, false, LLTexUnit::TT_TEXTURE, true)) if (!dest[i].allocate(res, res, GL_RGBA, false, false, LLTexUnit::TT_TEXTURE, true))
{ {
LL_WARNS() << "Failed to allocate render target." << LL_ENDL; LL_WARNS("Benchmark") << "Failed to allocate render target." << LL_ENDL;
// abandon the benchmark test // abandon the benchmark test
delete[] pixels; delete[] pixels;
return -1.f; return -1.f;
...@@ -1040,12 +1045,20 @@ F32 gpu_benchmark() ...@@ -1040,12 +1045,20 @@ F32 gpu_benchmark()
if (!texHolder.bind(i)) if (!texHolder.bind(i))
{ {
// can use a dummy value mDummyTexUnit = new LLTexUnit(-1); // can use a dummy value mDummyTexUnit = new LLTexUnit(-1);
LL_WARNS() << "Failed to bind tex unit." << LL_ENDL; LL_WARNS("Benchmark") << "Failed to bind tex unit." << LL_ENDL;
// abandon the benchmark test // abandon the benchmark test
delete[] pixels; delete[] pixels;
return -1.f; return -1.f;
} }
LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels); LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels);
if (alloc_timer.getElapsedTimeF32() > time_limit)
{
// abandon the benchmark test
LL_WARNS("Benchmark") << "Allocation operation took longer then 30 seconds, stopping." << LL_ENDL;
delete[] pixels;
return -1.f;
}
} }
delete [] pixels; delete [] pixels;
...@@ -1055,7 +1068,7 @@ F32 gpu_benchmark() ...@@ -1055,7 +1068,7 @@ F32 gpu_benchmark()
if (!buff->allocateBuffer(3, 0, true)) if (!buff->allocateBuffer(3, 0, true))
{ {
LL_WARNS() << "Failed to allocate buffer during benchmark." << LL_ENDL; LL_WARNS("Benchmark") << "Failed to allocate buffer during benchmark." << LL_ENDL;
// abandon the benchmark test // abandon the benchmark test
return -1.f; return -1.f;
} }
...@@ -1065,7 +1078,7 @@ F32 gpu_benchmark() ...@@ -1065,7 +1078,7 @@ F32 gpu_benchmark()
if (! buff->getVertexStrider(v)) if (! buff->getVertexStrider(v))
{ {
LL_WARNS() << "GL LLVertexBuffer::getVertexStrider() returned false, " LL_WARNS("Benchmark") << "GL LLVertexBuffer::getVertexStrider() returned false, "
<< "buff->getMappedData() is" << "buff->getMappedData() is"
<< (buff->getMappedData()? " not" : "") << (buff->getMappedData()? " not" : "")
<< " NULL" << LL_ENDL; << " NULL" << LL_ENDL;
...@@ -1086,7 +1099,8 @@ F32 gpu_benchmark() ...@@ -1086,7 +1099,8 @@ F32 gpu_benchmark()
buff->setBuffer(LLVertexBuffer::MAP_VERTEX); buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
glFinish(); glFinish();
for (S32 c = -1; c < samples; ++c) F32 time_passed = 0; // seconds
for (S32 c = -1; c < samples && time_passed < time_limit; ++c)
{ {
LLTimer timer; LLTimer timer;
timer.start(); timer.start();
...@@ -1103,6 +1117,7 @@ F32 gpu_benchmark() ...@@ -1103,6 +1117,7 @@ F32 gpu_benchmark()
glFinish(); glFinish();
F32 time = timer.getElapsedTimeF32(); F32 time = timer.getElapsedTimeF32();
time_passed += time;
if (c >= 0) // <-- ignore the first sample as it tends to be artificially slow if (c >= 0) // <-- ignore the first sample as it tends to be artificially slow
{ {
...@@ -1117,12 +1132,12 @@ F32 gpu_benchmark() ...@@ -1117,12 +1132,12 @@ F32 gpu_benchmark()
F32 gbps = results[results.size()/2]; F32 gbps = results[results.size()/2];
LL_INFOS() << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers" << LL_ENDL; LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers, " << (F32)results.size() << " tests took " << time_passed << " seconds" << LL_ENDL;
#if LL_DARWIN #if LL_DARWIN
if (gbps > 512.f) if (gbps > 512.f)
{ {
LL_WARNS() << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL; LL_WARNS("Benchmark") << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL;
//OSX is probably lying, discard result //OSX is probably lying, discard result
return -1.f; return -1.f;
} }
...@@ -1131,11 +1146,11 @@ F32 gpu_benchmark() ...@@ -1131,11 +1146,11 @@ F32 gpu_benchmark()
F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f; F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f;
F32 seconds = ms/1000.f; F32 seconds = ms/1000.f;
F64 samples_drawn = res*res*count*samples; F64 samples_drawn = res*res*count*results.size();
F32 samples_sec = (samples_drawn/1000000000.0)/seconds; F32 samples_sec = (samples_drawn/1000000000.0)/seconds;
gbps = samples_sec*8; gbps = samples_sec*8;
LL_INFOS() << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query" << LL_ENDL; LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL;
return gbps; return gbps;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment