Gibt es Anweisungen in SSE/SSE2
in der Lage, max/min in 4 ganzen 32-Bit zu finden? Ich habe versucht, etwas zu suchen, aber ich fand nur Anweisungen für 16/8 Bit. Vielen Dank im Voraus.Finden Sie max unter 32 Bit Ganzzahlen
Antwort
Der beste Weg ohne SSE4.1 scheint ein 32-Bit-Vergleich zu sein, und dann verwenden Sie diese Maske zu mischen: AND(mask, x) OR ANDN(mask, y)
.
Agner Fog's vector class library hat a function for it:
// function max: a > b ? a : b
static inline Vec4i max(Vec4i const & a, Vec4i const & b) {
#if INSTRSET >= 5 // SSE4.1 supported
return _mm_max_epi32(a,b);
#else
__m128i greater = _mm_cmpgt_epi32(a,b);
return selectb(greater,a,b);
#endif
}
Ich habe einige meist-ungetestet und noch nicht fusionierten Änderungen für diese Bibliothek on github. Die meisten meiner Änderungen sind signifikante Verbesserungen für die wenigen Funktionen, die ich mir angesehen habe (ganzzahlige horizontale Summen, Vierwort-Rechenkorrektur, Vierfach-Multiplikation). (Test/Feedback willkommen!)
Aber eine Menge des vorhandenen Codes ist ziemlich gut, also würde ich definitiv empfehlen, diese Wrapper-Klassen zu verwenden. Sie fügen keinen Overhead hinzu, wenn Sie mit aktivierten Optimierungen bauen, und sie machen die Syntax viel einfacher. z.B. a+b
anstelle von _mm_add_epi32(a,b)
.
Vielleicht sind horizontale Operationen tief liegende Früchte.Ich meine, sie sind keine Operationen, die man normalerweise in einer kritischen Schleife habenwürde, deshalb ist ihre Optimierung nicht so wichtig.haben Sie kritische Funktionen in der VCL gefunden, die optimiert werden müssen? Der schwierigste Teil der VCL sind Permutionen und Mischungen, siehe zum Beispiel [http://agner.org/optimize/vectorclass/r ead.php? i = 120). Ich denke, das ist der schwierigste Bereich, den man mit einer allgemeinen Klasse implementieren kann. –
@Zboson: yeah, es stellt sich heraus, dass die gesamte VCL immer 'vpblendvb' verwendet (2 Ups und eine Maske aus dem Speicher benötigt), sogar für kompilierzeitkonstante Mischungen. Als nächstes auf meiner Liste ist es, die Vorlagen so zu fixieren, dass sie viel schneller 'vpblendd' oder' plblendw' verwenden, wenn möglich.Ich habe auch eine Beschleunigung für 'operator >> (Vec2q)' (emuliert das fehlende 'psarq'), wo ich wesentlich besser für die 128b-Version getan habe, als nur Variable-Blend zu Sofort-Blend zu ändern. –
[Hier] (https://stackoverflow.com/questions/34122605/how-to-optimize-simd-transpose-function-8x4-4x8/34207876#34207876) ist ein weiteres interessantes Beispiel. Ich habe es schließlich richtig gemacht, aber das Problem ist, dass ich mehrere Varianten ausprobieren musste, bevor die VCL idealen Code anstelle von schlechtem Code produzierte. –
Vielleicht tut PMAXSD
den Trick?
Vergleicht gepackte vorzeichenbehaftete dword-Ganzzahlen im Zieloperanden (erster Operand) und dem Quelloperanden (zweiter Operand) und gibt das Maximum für jeden gepackten Wert im Zieloperanden zurück.
Es erfordert jedoch SSE 4.1 und/oder AVX-Unterstützung.
- 1. Unsignierte 32-Bit-Ganzzahlen in Javascript
- 2. Max JVM-Heap-Größe verstehen - 32 Bit vs 64 Bit
- 3. Drucken Ganzzahlen in 32-Bit feste Länge binär
- 4. kann nicht 32-Bit-DLL unter 64-Bit-Windows-
- 5. Subversion mit 32 Bit Server und 32/64 Bit Clients
- 6. PHP json_decode auf einem 32-Bit-Server
- 7. SSE intrinsics: Konvertieren 32-Bit-Gleitkommazahlen in UNSIGNED 8-Bit-Ganzzahlen
- 8. Flywaydb 32 Bit Version
- 9. 32-Bit-Ganzzahl-Arrays in 64-Bit-Maschinen zuweisen
- 10. Fehlermeldung MSIHANDLE() unter Windows Server 2003 SP2 32 Bit
- 11. Leistung von 32-Bit-Ganzzahlen in einer 64-Bit-Umgebung (C++)
- 12. SSE-Befehl zum Summieren von 32-Bit-Ganzzahlen zu 64-Bit
- 13. Einzel 32-Bit-MSI mit 32/64-Bit-Treiber
- 14. Vergleichen Sie zwei Ganzzahlen mit Bit-Operator
- 15. Eine 32-Bit-Gleitkommazahl einer 32-Bit-Ganzzahl zuordnen
- 16. Warum funktioniert dieser Code unter iOS 32 Bit, aber nicht unter 64 Bit?
- 17. Finden Sie die Modulnamen eines 64-Bit-Prozess von einem 32-Bit-App
- 18. Kompilieren 32 Bit von Win7 64 Bit
- 19. So finden Sie Max Date
- 20. WASP PowerShell 32 Bit
- 21. Seltsames 64/32-Bit-GUID-Problem unter IIS7
- 22. wie Windows7 Bit-Version, 32 Bit oder 64 Bit wissen?
- 23. 32-Bit- oder 64-Bit-Android-SDK unter Windows 64-Bit-Betriebssystem?
- 24. C# 32-Bit-App 64-Bit-Registrierung
- 25. 64-Bit-Assembly Anweisungen von 32 Bit
- 26. Bitpositionen in einer vorzeichenlosen 32-Bit-Ganzzahl finden
- 27. Kombinieren von zwei Ganzzahlen mit Bit-Verschiebung
- 28. Tomcat unter Windows x64 mit 32-Bit-JDK
- 29. Omnisharp und DotNET Core Debugger unter Windows 10 32-Bit
- 30. Environment.SpecialFolder.ProgramFiles Wert für eine 32-Bit-Anwendung unter Windows 7?
Suchen Sie eine horizontale Operation? Oder 4 gepackte Max-Operationen parallel, wie 'pmaxsd'? Wenn Sie ein horizontales Maximum mit SSE2 benötigen, speichern Sie es einfach im Speicher und verwenden Sie Skalar. Mit SSE4.1 wäre dann das Shuffling wie für eine horizontale Summe am schnellsten. Horizontale Operationen sind langsam. Wenn Ihr Algorithmus viele benötigt, verwenden Sie SIMD falsch. Weitere Informationen finden Sie im [SSE-Tag-Wiki] (http://stackoverflow.com/tags/sse/info). –
"Suchen Sie eine horizontale Operation?" Ich suche nach Operationen parallel. Ok, Sie schlagen vor, im Speicher zu speichern und skalare Operationen zu verwenden. (im Falle von horizontal). Aber warum schlägst du vor? Schließlich hat die Verwendung von SIMD keinen Vorteil. Meinst du, dass die horizontale Operation so schnell wie "Speichern in den Speicher und vergleichen Sie in" normalen "(skalaren) Weg? – Gilgamesz
Wenn Sie genau 4 Nummern, anstatt 1000 Nummern, gibt es nicht viel Nutzen von SIMD. (Es sei denn Ihre Zahlen sind 16bit ohne Vorzeichen, so dass Sie den speziellen Zweck ['PHMINPOSUW'] (http://www.felixcloutier.com/x86/PHMINPOSUW.html) verwenden können. Horizontal bedeutet" innerhalb eines einzelnen Vektors ", im Gegensatz zu was SIMD ist gut bei (zB füge a [0] zu b [0] hinzu, a [1] zu b [1] usw.) Wenn du ein horizontales Maximum von 4 Elementen ohne SSE4.1 finden musst, dann wahrscheinlich Skalar –