I would like to add an example so as to clarify what it is that I seek help
on:
I have a custom implementation of a class called Number. Number has
overloaded operators that write down a program of all computations that
Number witnesses in an original program.
For example, when the original program reads (original code):
z=x-(-y);
Then upon execution with type Number the following program will be produced
(generated code) as caused through stream buffers in Number:
tmp1 = -y;
z = x-tmp1;
This generated code is inferior to as if the original code had been
"z=x+y;".
Using expression templates or hoping for excellent compiler optimization on
the "generated code", I could try to improve the performance of the
generated code.
But that means equal to re-inventing the wheel, because obviously the
compilers have exactly these algebraic optimization capabilities already
built in.
So I want to use these capabilities. This is what my request is all about.
Certainly the compiler has algebraic expression optimization built in, so
what I now seek to find out is whether and how this can be leveraged
outside the rule-scope of native c++,
so as to improve the algebra of my original code. Of course I am aware that
this alters the original programs result entirely (as per the above
example) but this is precisely what I wish for.
Kind regards
In response to Segher:
On Mon, Aug 26, 2024 at 7:19 PM Segher Boessenkool <
segher@xxxxxxxxxxxxxxxxxxx> wrote:
On Mon, Aug 26, 2024 at 06:00:21PM +0200, Kai Song via Gcc-help wrote:
I would like to learn more how GCC implements algebraic optimization
heuristic such as given in -ffast-math .
Thank you for responding. Yet I cannot make sense of your response or
whether if how it relates to what I asked about.
Oh dear.
In particular, I have a type Number that is used in a code
-ffast-math means you are not dealing with numbers at all, but instead
with quantities somewhat akin to numbers, and you don't give two hoots
about what happens with them.
Well if it was able to "deal" with anything akin to numbers, that would
imply I can tell it to treat a type as if it was a number.
Clearly however, that is not the case. So you may have meant something
else, which is impossible to identify then due to ambiguity.
This is unfortunate because I deeply care. So if you indeed mean that
fastmath can be applied to anything akin to numbers,
I am looking forward to how I can use the compilers abilities in that
regard to transform algebraic expressions with custom types.
It replaces floating point expressions by other expressions that are
at best vaguely related, and almost always compute a very different
result.
Yes, so here it is besides the question; because my custom type Number,
which is the single point of interest in the communication, is not a
floating point type.
If you do not care about your numbers at all, and (against better
judgement) prefer more speed over all quality, you can use -ffast-math.
Well apparently I cannot, as per my question, since the algebraic
expressions are involving my custom class Number.
Or, you can admit you think arithmetic is magic. It is fine to use
then, too.
I am a mathematician. I do not know nor wonder what you seek to say.
I do care that arithmetic expressions are concise and equivalent.
For instance, I like when "z=x-(-y);" is replaced by "z=x+y;" where x and y
may be of type Number.
Segher