07-24-2023, 03:14 AM
I was searching for a programming technique that would ensure variables used for benchmarking (without observable side effects) won't be optimized away by the compiler
[This](
/**
* Call doNotOptimizeAway(var) against variables that you use for
* benchmarking but otherwise are useless. The compiler tends to do a
* good job at eliminating unused variables, and this function fools
* it into thinking var is in fact needed.
*/
#ifdef _MSC_VER
#pragma optimize("", off)
template <class T>
void doNotOptimizeAway(T&& datum) {
datum = datum;
}
#pragma optimize("", on)
#else
template <class T>
void doNotOptimizeAway(T&& datum) {
asm volatile("" : "+r" (datum));
}
#endif
I want to use the above, but I have **little understanding of its workings**. I'm mostly interested in the non VC++ portion and **why/how the line**
asm volatile("" : "+r" (datum));
creates a non optimizable context or **why is this something one would choose to implement such a thing**. Also a comparison between the 2 methods would be interesting (I don't know how `pragma optimize` works but it looks like a cleaner solution - non portable though)
[This](
[To see links please register here]
) gives some info, but I ended up using [folly]([To see links please register here]
) and the following function/**
* Call doNotOptimizeAway(var) against variables that you use for
* benchmarking but otherwise are useless. The compiler tends to do a
* good job at eliminating unused variables, and this function fools
* it into thinking var is in fact needed.
*/
#ifdef _MSC_VER
#pragma optimize("", off)
template <class T>
void doNotOptimizeAway(T&& datum) {
datum = datum;
}
#pragma optimize("", on)
#else
template <class T>
void doNotOptimizeAway(T&& datum) {
asm volatile("" : "+r" (datum));
}
#endif
I want to use the above, but I have **little understanding of its workings**. I'm mostly interested in the non VC++ portion and **why/how the line**
asm volatile("" : "+r" (datum));
creates a non optimizable context or **why is this something one would choose to implement such a thing**. Also a comparison between the 2 methods would be interesting (I don't know how `pragma optimize` works but it looks like a cleaner solution - non portable though)