Wednesday 19 June 2019

floating point - Avoiding denormal values in C++

Answer


Answer





After searching a long time for a performance bug, I read about denormal floating point values.



Apparently denormalized floating-point values can be a major performance concern as is illustrated in this question:
Why does changing 0.1f to 0 slow down performance by 10x?



I have an Intel Core 2 Duo and I am compiling with gcc, using -O2.



So what do I do? Can I somehow instruct g++ to avoid denormal values?
If not, can I somehow test if a float is denormal?


Answer




You can test whether a float is denormal using



#include 

if ( std::fpclassify( flt ) == FP_SUBNORMAL )


(Caveat: I'm not sure that this will execute at full speed in practice.)



In C++03, and this code has worked for me in practice,




#include 
#include

if ( flt != 0 && std::fabsf( flt ) < std::numeric_limits::min() ) {
// it's denormalized
}


To decide where to apply this, you may use a sample-based analyzer like Shark, VTune, or Zoom, to highlight the instructions slowed by denormal values. Micro-optimization, even more than other optimizations, is totally hopeless without analysis both before and after.



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...