Zunächst wurde die Frage nach dem Leistungsunterschied zwischen elementweisen Additionen gestellt, die in einer kombinierten Schleife durchgeführt werden Schleife versus separate Schleifen. Allerdings wurde es später geändert, um Einblicke in das Cache-Verhalten zu gewinnen, das zu diesen Leistungsschwankungen führt.
Warum sind elementweise Additionen in separaten Einheiten wesentlich schneller? Schleifen als in einer kombinierten Schleife?
Nach weiterer Analyse wird davon ausgegangen dass dieses Verhalten durch Datenausrichtungsprobleme mit den vier in der Operation verwendeten Zeigern verursacht wird, was möglicherweise zu Konflikten zwischen Cache-Bank und Weg führt. Insbesondere ist es wahrscheinlich, dass die Arrays auf derselben Seitenzeile zugewiesen sind, was dazu führt, dass Zugriffe innerhalb jeder Schleife auf denselben Cache-Weg erfolgen. Dies ist weniger effizient als die Verteilung der Zugriffe auf mehrere Cache-Wege, was möglich ist, wenn die Arrays separat zugewiesen werden.
Könnten Sie welche bereitstellen? Solide Einblicke in die Details, die zu den unterschiedlichen Cache-Verhaltensweisen führen, wie durch die fünf Regionen im veranschaulicht Diagramm?
Region 1: Der Datensatz ist so klein, dass die Leistung eher vom Overhead wie Schleifen und Verzweigungen als vom Cache-Verhalten dominiert wird.
Region 2: Wurde früher auf Ausrichtungsprobleme zurückgeführt, legen weitere Analysen nahe, dass der Leistungsabfall in dieser Region noch weiter zunehmen muss Untersuchung. Cache-Bank-Konflikte könnten immer noch ein Faktor sein.
Region 3: Die Datengröße übersteigt die L1-Cache-Kapazität, was zu Leistungseinschränkungen durch die L1-zu-L2-Cache-Bandbreite führt.
Region 4: Die in der Single-Loop-Version beobachtete Leistungseinbuße ist wahrscheinlich auf falsche Aliasing-Störungen im Prozessor zurückzuführen Lade-/Speichereinheiten, die durch die Ausrichtung der Arrays verursacht werden. Falsches Aliasing tritt auf, wenn der Prozessor spekulativ Ladevorgänge ausführt und auf einen zweiten Ladevorgang an derselben Adresse mit einem anderen Wert stößt. In diesem Fall muss der Prozessor die spekulative Last verwerfen und den korrekten Wert neu laden, was zu einer Leistungseinbuße führt.
Region 5: Zu diesem Zeitpunkt übersteigt die Datengröße die Kapazität beider die L1- und L2-Caches, was zu Leistungseinschränkungen aufgrund der Speicherbandbreite führt.
Es könnte auch interessant sein, auf die Unterschiede zwischen CPU-/Cache-Architekturen hinzuweisen, indem für diese CPUs ein ähnliches Diagramm bereitgestellt wird.
Die bereitgestellte Grafik stellt Daten dar, die von zwei Intel Xeon X5482 Harpertown-Prozessoren mit 3,2 GHz gesammelt wurden. Ähnliche Tests auf anderen Architekturen, wie dem Intel Core i7 870 bei 2,8 GHz und dem Intel Core i7 2600K bei 4,4 GHz, ergeben Diagramme, die ähnliche Regionen aufweisen, obwohl die spezifischen Leistungswerte variieren können. Diese Abweichungen können auf Unterschiede in der Cache-Größe, der Speicherbandbreite und anderen Architekturmerkmalen zurückgeführt werden.
Das obige ist der detaillierte Inhalt vonWarum sind elementweise Additionen in separaten Schleifen schneller als in einer einzelnen Schleife, wenn man das Cache-Verhalten berücksichtigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!