Die Math-Funktionen des .NET-Frameworks arbeiten hauptsächlich mit Floats mit doppelter Genauigkeit, es gibt keine Überladungen mit einfacher Genauigkeit (Float). Wenn Sie in einem Hochleistungs- szenario mit Daten mit einfacher Genauigkeit arbeiten, führt dies zu einem unnötigen Casting und außerdem zu einer präziseren Berechnung der Funktionen als erforderlich, wodurch die Leistung in gewissem Maße beeinträchtigt wird.Einzelpräzision Math Operationen in .NET?
Gibt es eine Möglichkeit, einen Teil dieses zusätzlichen CPU-Overheads zu vermeiden? Z.B. Gibt es eine Open-Source-Math-Bibliothek mit Float-Überladungen, die zugrundeliegende FPU-Anweisungen direkt aufruft? (Mein Verständnis ist, dass dies Unterstützung in der CLR erfordern würde). Und eigentlich bin ich mir nicht sicher, ob moderne CPUs sogar Befehle mit einfacher Genauigkeit haben.
Diese Frage wurde zum Teil von dieser Frage inspiriert über eine S-förmige Funktion zu optimieren:
Wenn Sie auf Intrinsics beziehen, ist dies das gleiche wie externe Funktionen? - So werden die Mathematikfunktionen implementiert, im Gegensatz zu den in der Sprache definierten Eigenschaftswerten. AFAIK der CLR könnte leicht erweitert werden, um z.B. public static extern Double Sin (float a) zusätzlich zur Double-Precision-Version. – redcalx
Sprechen Sie darüber, es in nativem Code zu implementieren? Der P/Invoke-Aufwand, der für eine einzelne Gleitkommaoperation anfällt, würde den Versuch, die Leistungsbeeinträchtigung durch das Arbeiten mit "Sin (double)" zu vermeiden, vollständig negieren. Intrinsics werden als "extern" deklariert, sind aber nicht P/Invoke - der native Code für sie wird intern vom JIT selbst behandelt, um sie so effizient wie möglich zu machen. –
So könnte vielleicht etwas Leistung erzielt werden, wenn Ihr Algorithmus so wäre, dass Sie ein einzelnes P/Invoke erstellen könnten, das viele Gleitoperationen durchführt. – Fantius