Open aaron-skydio opened 10 months ago
I noticed my generated code has a lot of std::pow
calls where y = 2
is known at codegen time. Is there anything I can do to make symforce emit something like _tmp2 = _tmp1 * _tmp1
instead?
For a constant exponent of 2 known at codegen time, your compiler should optimize the std::pow
to a multiply, so we don't bother special casing that to generate a multiply - the logic for which powers we special-case is here: https://github.com/symforce-org/symforce/blob/main/symforce/codegen/backends/cpp/cpp_code_printer.py#L68
If you have a compiler where this doesn't get optimized and actually results in a function call or something else that's not just a multiplication instruction that would be good to know though and we can also special-case that to generate a multiplication
Some thoughts from discussing this:
std::pow(x, y)
wherey
is a symbol at codegen time, but is a constant parameter at runtime (in particular an integer, in this case and the worst case1.0
). I can imagine maybe also wanting warnings for integer powers if fast-math isn’t on? Although maybe our codegen should handle this, or assume fast-math.pow(x, y)
is the only example, this doesn’t make sense? Not sure if we have other examplesOptimizationProblem
that encompass lots of expressions / residuals