Heim > Backend-Entwicklung > C++ > Warum ist meine Schleife bei der Verarbeitung von 8192-Elementen langsam?

Warum ist meine Schleife bei der Verarbeitung von 8192-Elementen langsam?

DDD
Freigeben: 2024-12-10 09:51:10
Original
707 Leute haben es durchsucht

Why is My Loop Slow When Processing 8192 Elements?

Warum die Leistung beim Durchlaufen von 8192 Elementen sinkt

Beim Durchlaufen von 8192 Elementen kommt es zu einer erheblichen Verlangsamung des Programms. Dies wird auf ein Problem mit der Speicherausrichtung zurückgeführt, das durch eine ineffiziente Schleifenstruktur verschärft wird.

Speicherausrichtung

Moderne Prozessoren nutzen Cache-Hierarchien, um die Datenzugriffsgeschwindigkeit zu verbessern. Ausgerichtete Speicherzugriffe, bei denen Daten an Adressen gespeichert werden, die ein Vielfaches der Cache-Zeilengröße betragen, ermöglichen einen schnelleren Datenabruf. In diesem Fall ist der SIZE-Parameter jedoch als 8192 definiert, was kein Vielfaches der Cache-Zeilengröße (normalerweise 64 Byte) ist. Diese Fehlausrichtung kann Speicherzugriffsvorgänge verlangsamen.

Schleifenreihenfolge

Erschwerend für das Problem der Speicherausrichtung ist die Reihenfolge der Schleifen. Der ursprüngliche Code durchläuft die Matrix spaltenweise, was zu nicht sequentiellen Speicherzugriffen führt. Dies zwingt den Prozessor dazu, langsamere, zufällige Datenabrufe aus dem Speicher durchzuführen.

Lösung

Es gibt zwei mögliche Lösungen:

  1. Ausrichten des Speichers: Definieren Sie SIZE auf ein Vielfaches der Cache-Zeilengröße (z. B. 8192). 64).
  2. Reihenfolge der Austauschschleife: Anstelle einer spaltenweisen Iteration, iterieren Sie zeilenweise über die Matrix. Dadurch werden Speicherzugriffe an der Organisation der Cache-Zeile ausgerichtet, was einen schnelleren und effizienteren Datenabruf ermöglicht.

Durch die Änderung der Schleifenreihenfolge im Code wird der Leistungsengpass beseitigt.

Beispiel

Der folgende Code veranschaulicht das Fix:

for(j=1;j<SIZE-1;j++) {
    for(i=1;i<SIZE-1;i++) {
        res[j][i]=0;
        res[j][i] += img[j-1][i-1];
        ...
    }
}
Nach dem Login kopieren

Leistungsvergleich

Nach der Anwendung des Fixes verbessert sich die Leistung erheblich:

Originalcode:

SIZE = 8191: 1.499 seconds
SIZE = 8192: 2.122 seconds
SIZE = 8193: 1.582 seconds
Nach dem Login kopieren

Fester Code:

SIZE = 8191: 0.376 seconds
SIZE = 8192: 0.357 seconds
SIZE = 8193: 0.351 seconds
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum ist meine Schleife bei der Verarbeitung von 8192-Elementen langsam?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage