Heim > Backend-Entwicklung > C++ > Wie können wir log2(__m256d) in AVX2 sowohl für Intel- als auch für AMD-Prozessoren effizient implementieren?

Wie können wir log2(__m256d) in AVX2 sowohl für Intel- als auch für AMD-Prozessoren effizient implementieren?

Mary-Kate Olsen
Freigeben: 2024-11-27 15:49:10
Original
616 Leute haben es durchsucht

How Can We Efficiently Implement log2(__m256d) in AVX2 for Both Intel and AMD Processors?

Effiziente Implementierung von log2(__m256d) in AVX2

SVMLs __m256d _mm256_log2_pd (__m256d a) ist auf Intel-Compiler beschränkt und angeblich langsamer auf AMD-Prozessoren. Es gibt alternative Implementierungen, die sich jedoch häufig auf SSE und nicht auf AVX2 konzentrieren. Diese Diskussion zielt darauf ab, eine effiziente Implementierung von log2() für Vektoren mit vier doppelten Zahlen bereitzustellen, die mit verschiedenen Compilern kompatibel ist und sowohl auf AMD- als auch auf Intel-Prozessoren eine gute Leistung erbringt.

Traditionelle Strategie

Der übliche Ansatz nutzt die Formel log2(a*b) = log2(a) log2(b), die sich für doppelte Zahlen zum Exponenten log2(Mantisse) vereinfacht. Die Mantisse hat einen begrenzten Bereich von 1,0 bis 2,0 und eignet sich daher für eine Polynomnäherung, um log2 (Mantisse) zu erhalten.

Genauigkeit und Präzision

Die gewünschte Genauigkeit und Die Bandbreite der Eingaben beeinflusst die Umsetzung. Die VCL von Agner Fog strebt eine hohe Präzision durch Fehlervermeidungstechniken an. Für eine schnellere Annäherung an float log() sollten Sie jedoch die Polynomimplementierung von JRF in Betracht ziehen (hier zu finden: http://jrfonseca.blogspot.ca/2008/09/fast-sse2-pow-tables-or-polynomials.html).

VCL-Algorithmus

Die Log-Float- und Double-Funktionen von VCL folgen a zweiteiliger Ansatz:

  1. Exponent und Mantisse extrahieren: Der Exponent wird zurück in eine Gleitkommazahl umgewandelt und die Mantisse wird mit einer Prüfung auf Werte kleiner als SQRT2*0,5 angepasst. Darauf folgt eine Subtraktion von 1,0 von der Mantisse.
  2. Polynomische Näherung: Eine polynomische Näherung wird auf die angepasste Mantisse angewendet, um log(x) um x=1,0 zu berechnen. Für doppelte Genauigkeit verwendet VCL ein Verhältnis von zwei Polynomen 5. Ordnung.

Das Endergebnis wird durch Addition des Exponenten zur Polynomnäherung erhalten. VCL enthält zusätzliche Schritte zur Minimierung von Rundungsfehlern.

Alternative Polynomnäherungen

Für eine höhere Genauigkeit können Sie VCL direkt verwenden. Für eine schnellere ungefähre log2()-Implementierung für Float sollten Sie jedoch die Portierung der SSE2-Funktion von JRF auf AVX2 mit FMA in Betracht ziehen.

Rundungsfehler vermeiden

VCL verwendet verschiedene Techniken zur Reduzierung Rundungsfehler. Dazu gehören:

  • Aufteilen von ln2 in kleinere Konstanten (ln2_lo und ln2_hi)
  • Hinzufügen der Zeile res = nmul_add(x2, 0.5, x); zur Polynomauswertung

Unnötige Schritte entfernen

Wenn Ihre Werte bekanntermaßen endlich und positiv sind, können Sie die Leistung erheblich verbessern, indem Sie die Prüfungen auskommentieren Unterlauf, Überlauf oder Denormal.

Weitere Informationen Lesen

  • [Polynomnäherung mit Minimax-Fehler](http://gallium.inria.fr/blog/fast-vectorizable-math- approx/)
  • [Schneller angenäherter Logarithmus mit Bit Manipulation](http://www.machinedlearnings.com/2011/06/fast- approximate-logarithm-exponential.html)

Das obige ist der detaillierte Inhalt vonWie können wir log2(__m256d) in AVX2 sowohl für Intel- als auch für AMD-Prozessoren effizient implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage