Beim Debuggen bin ich häufig in die handgeschriebene Assembler-Implementierung von memcpy und memset eingestiegen. Diese werden normalerweise mithilfe von Streaming-Anweisungen implementiert, falls verfügbar, Schleife entrollt, Ausrichtung optimiert usw. Ich bin kürzlich auch darauf gestoßen ‘Fehler’ aufgrund von memcpy-Optimierung in glibc.
Die Frage ist: Warum können die Hardwarehersteller (Intel, AMD) den konkreten Fall nicht optimieren
rep stos
und
rep movs
als solche erkannt werden, und das tun am schnellsten möglichst ausfüllen und kopieren ihre eigenen die Architektur?
Cop-out-Antwort: Weil sie es einfach nicht tun, und infolgedessen schreibt niemand solchen Code, und deshalb gibt es keinen Grund für sie, dies zu tun … (Zyklus geht weiter)
– Billy ONeal
13. Januar 2012 um 23:50 Uhr
@BillyONeal: Ich glaube nicht. Für jedes neue Feature, das sie hinzufügen, gibt es noch keinen Code, der es verwendet.
– Jakow Galka
13. Januar 2012 um 23:57 Uhr
Ja, aber wenn eine neue Funktion hinzugefügt wird, wird sie hinzugefügt, um in dem einen oder anderen Bereich eine bessere Leistung zu zeigen. Eine Optimierung ist für CPU-Anbieter nicht sinnvoll, da Compiler keinen solchen Code ausgeben.
– Billy ONeal
14. Januar 2012 um 0:06 Uhr
@BillyONeal: Tatsächlich tun sie das. Die intrinsische Version von memcpy auf MSVC wird auf genau diesen Code erweitert.
– Jakow Galka
14. Januar 2012 um 0:09 Uhr
Intel Ivybridge und höher tun optimiert haben
rep stos
undrep movs
. Intel nennt diese Unterstützung “Fast String” oder ERMSB (Enhanced Rep Movs/StosB). Weitere Informationen finden Sie im Optimierungshandbuch von Intel (verlinkt von stackoverflow.com/tags/x86/info). Dies ist immer noch eine gute Frage, warum frühere CPUs mikrocodierte Implementierungen von habenrep movs
Take waren nicht so schnell wie eine SSE-Schleife, die 16 B-Ladevorgänge/Speichervorgänge ausführt.– Peter Cordes
4. November 2015 um 22:18 Uhr