[C++] Schnelleres sin/cos/tan

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Schnelleres sin/cos/tan

Beitrag von Krishty »

Krishty hat geschrieben:Lustig: Mein sincos() ist bloß 15 % schneller als je ein Aufruf an das CRT-sin() und -cos() zusammen.

Aber jetzt kommt’s: Daraufhin habe ich mit Intrinsics alles in astreinen SSE2-Text verwandelt, der Sinus und Kosinus als Vektor zweier doubles schön vektorisiert berechnet –

– und jetzt dauert ein Aufruf so lange wie vier CRT-sin() zusammen.
Weil ich in letzter Zeit viel mit SSE zu tun habe, habe ich mich dem Problem nochmal angenommen. Die SSE-optimierte Variante, die sincos() vektorisiert ausrechnet, ist tatsächlich gut 30 % schneller als die skalare Variante. Und 2,3× so schnell wie cos() und sin() der Visual C++ 2013-CRT. Ich habe es diesmal wieder auf einem Core i7 getestet, jedoch auf was aus der Ivy Bridge-Ära (der Core i7 der früheren Tests hat mittlerweile ein halbes Jahrzehnt auf dem Buckel). Also sowohl eigenes sincos() als auch SSE-vektorisierung lohnen sich. Der Quelltext, den ich früher gepostet habe, sieht auch völlig in Ordnung aus.

Mit 40 % Zeitanteil ist der langsamste Teil der Funktion jetzt übrigens das Kopieren des Rückgabewerts – wegen diesem „keine NRVO mit float“-Bug in Visual C++. Bin gespannt, ob sie den im 2015er Compiler behoben haben.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten