Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: C++ Optimierung unterdrücken
AUTOR BEITRAG
Crush (White & Nerdy)

RANG Deckschrubber

#1 - 04.03 12:28

Wir haben in unserem Projekt eine sehr "hackige" Funktion zur schnellen Berechnung von ungefähren Wurzeln. Das Problem an dieser Funktion ist aber, dass wenn sie mit GCC und -O2 Optimierungseinstellung kompiliert wird nicht mehr richtig funktioniert.

Gibt es irgendeine Möglichkeit zu verhindern dass diese Funktion optimiert wird?

code:

float fastInvSqrt(float x)
{
    float xhalf = 0.5f * x;
    int i = *(int*) &x;
    i = 0x5f375a86 - (i >> 1);
    x = *(float*) &i;
    x = x * (1.5f-xhalf * x * x);
    return x;
}


P.S.: Auf "In eine eigene .cpp Datei packen und das Buildscript so umschreiben dass diese ohne Optimierung kompiliert wird" wäre ich auch gekommen. Wäre aber eine sehr unschöne Lösung.
[AZWAT]empi*kackekackescheissscheiss*

RANG Master of Clanintern

#2 - 07.03 23:02

In eine eigene .cpp Datei packen und das Buildscript so umschreiben dass diese ohne Optimierung kompiliert wird.

Sorry.

Ehrlich, das finde ich gar nicht soo unsauber.

Ansonsten kann es sein, dass es Compiler-spezifische Annotationen gibt (Pragmas quasi), mit denen das geht, aber das ist natürlich plöd für die Portabilität. Ich meine sowas bei Visual C++ 6 mal gesehen zu haben, aber das ist auch schon etwas her.

In Sachen Portabilität, nen Compiler-spezifisches Pragma wäre wahrscheinlich net schlimm. die Funktion sieht für mich in der Hinsicht zumindestens fragwürdig aus. Irgendwelche BitShiftereien und so. Bin grad zu faul, um das zu verstehen.
awx

RANG 0wn3r

#3 - 13.03 19:12

>> "Bin grad zu faul, um das zu verstehen.":
Ich bezweifle, dass du das verstehen würdest. An dem Code (prominent geworden durch Quake3) haben sich schon so manche Mathematiker die Zähne ausgebissen.
Der Code kommt höchstwahrscheinlich (indirekt) von diesem Paper: http://www.lomont.org/Math/Papers/2003/InvSqrt.pdf

*edit*
wenn der GCC optimizer das verpfuscht, sollte man das vielleicht als Bug reporten?!
Crush (White & Nerdy)

RANG Deckschrubber

#4 - 13.03 19:25

@awx: Ja, genau aus dieser Abhandlung haben wir die Funktion auch.