| 386 | } |
| 387 | |
| 388 | std::vector< size_t > |
| 389 | GpuStatTimer::pruneOutliers( size_t id , cl_double multiple ) |
| 390 | { |
| 391 | std::vector< StatData > mean = getMean( id ); |
| 392 | std::vector< StatData > stdDev = getStdDev( id ); |
| 393 | |
| 394 | std::vector< size_t > totalPrune; |
| 395 | for( size_t s = 0; s < timerData.at( id ).size( ); ++s ) |
| 396 | { |
| 397 | // Look on p. 379, "The C++ Standard Library" |
| 398 | // std::remove_if does not actually erase, it only copies elements, it returns new 'logical' end |
| 399 | StatDataVec::iterator newEnd = std::remove_if( timerData.at( id ).at( s ).begin( ), timerData.at( id ).at( s ).end( ), |
| 400 | PruneRange< StatData,cl_double >( mean[ s ], multiple * stdDev[ s ].doubleNanoSec ) ); |
| 401 | |
| 402 | StatDataVec::difference_type dist = std::distance( newEnd, timerData.at( id ).at( s ).end( ) ); |
| 403 | |
| 404 | if( dist != 0 ) |
| 405 | timerData.at( id ).at( s ).erase( newEnd, timerData.at( id ).at( s ).end( ) ); |
| 406 | |
| 407 | totalPrune.push_back( dist ); |
| 408 | } |
| 409 | |
| 410 | return totalPrune; |
| 411 | } |
| 412 | |
| 413 | size_t |
| 414 | GpuStatTimer::pruneOutliers( cl_double multiple ) |