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:
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!