Heim > Backend-Entwicklung > C++ > Warum führt das Ersetzen eines 32-Bit-Schleifenzählers durch einen 64-Bit-Schleifenzähler zu Leistungseinbußen mit „_mm_popcnt_u64' auf Intel-CPUs?

Warum führt das Ersetzen eines 32-Bit-Schleifenzählers durch einen 64-Bit-Schleifenzähler zu Leistungseinbußen mit „_mm_popcnt_u64' auf Intel-CPUs?

Patricia Arquette
Freigeben: 2024-12-03 15:04:10
Original
729 Leute haben es durchsucht

Why Does Replacing a 32-bit Loop Counter with 64-bit Cause Performance Degradation with `_mm_popcnt_u64` on Intel CPUs?

Das Ersetzen eines 32-Bit-Schleifenzählers durch einen 64-Bit führt zu verrückten Leistungsabweichungen mit mm_popcnt_u64 auf Intel-CPUs

Zusammenfassung

Der Artikel untersucht eine Leistungsabweichung, die beim Ersetzen eines 32-Bit-Schleifenzählers durch einen auftritt 64-Bit-Zähler in einer leistungskritischen Schleife unter Verwendung des intrinsischen _mm_popcnt_u64. Das Problem führte zu einem erheblichen Leistungsabfall auf Intel-CPUs, was zu unterschiedlichen Ausführungsgeschwindigkeiten führte. Der Autor untersucht die Gründe für dieses Verhalten und bietet mögliche Lösungen an.

Details

Der fragliche Code beinhaltet eine Schleife, die ein Datenarray durchläuft und einen Popcount durchführt Betrieb mit der intrinsischen x86-Anweisung. Die Schleifenzählervariable war ursprünglich eine vorzeichenlose Ganzzahl, aber das Ersetzen durch eine vorzeichenlose 64-Bit-Ganzzahl (uint64_t) führte zu einem Leistungsabfall von etwa 50 %.

Um die Ursache zu untersuchen, hat der Autor den Code mit kompiliert verschiedene Optimierungsflags und analysierte den resultierenden Assemblercode. Sie stellten fest, dass für die 32-Bit- und 64-Bit-Version unterschiedliche Assemblys generiert wurden, was sie auf einen Compiler-Fehler schließen ließ.

Nach dem Testen des Codes mit verschiedenen Compilern kam der Autor jedoch zu dem Schluss, dass das Problem nicht bestand Ursache ist ein Compilerfehler, sondern eine falsche Datenabhängigkeit in der Hardware. Die _mm_popcnt_u64-Anweisung weist bei Verwendung auf Intel Sandy/Ivy Bridge- und Haswell-Prozessoren eine falsche Abhängigkeit vom Zielregister auf, in dem die Anweisung vor der Ausführung wartet, bis das Ziel bereit ist. Diese falsche Abhängigkeit kann sich über Schleifeniterationen hinweg übertragen, wodurch der Prozessor daran gehindert wird, verschiedene Iterationen zu parallelisieren, was zu einem Leistungsverlust führt.

Der Autor präsentiert Inline-Assembly-Tests, die die Leistungsunterschiede demonstrieren, indem sie den Popcount-Vorgang isolieren und die falsche Abhängigkeit aufheben Kette. Diese Tests zeigen, dass die falsche Abhängigkeit erhebliche Auswirkungen auf die Leistung hat und zu einer Geschwindigkeitsreduzierung von 18,6195 GB/s auf 8,49272 GB/s führt.

Der Artikel hebt auch hervor, dass das Problem Intel-CPUs und AMD-Prozessoren betrifft Scheint nicht, dass dies falsch ist Abhängigkeit.

Lösungen

Um dieses Leistungsproblem zu mildern, schlägt der Autor mehrere Lösungen vor:

  • Verwenden Sie stattdessen einen 32-Bit-Schleifenzähler eines 64-Bit-Zählers für diese spezielle Schleife.
  • Wenn die Verwendung eines 64-Bit-Schleifenzählers erforderlich ist, unterbrechen Sie die falsche Abhängigkeitskette, indem das Zielregister explizit auf Null gesetzt wird, bevor es in der Popcount-Operation verwendet wird.
  • Verwenden Sie einen Compiler, der diese falsche Abhängigkeit kennt und Code generiert, um sie zu kompensieren.

Das obige ist der detaillierte Inhalt vonWarum führt das Ersetzen eines 32-Bit-Schleifenzählers durch einen 64-Bit-Schleifenzähler zu Leistungseinbußen mit „_mm_popcnt_u64' auf Intel-CPUs?. 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