Ich habe einen Test mit diesem
gemacht %Vor%Die Ergebnisse sind seltsam.
a_single_chain_computation
braucht, die Lade-Latenz ist nicht versteckt. v = _mm_mul_ps(v, v)
spart Prefetching etwa 0,60 - 0,57 = 0,03s. Und mit 16 v = _mm_mul_ps(v, v)
spart es etwa 1,1 - 0,75 = 0,35s. WARUM?) Sie müssen hier zwei verschiedene Dinge trennen (die leider einen ähnlichen Namen haben):
Nicht-temporaler Vorabruf - Dies würde die Zeile vorab holen, aber sie würde als die zuletzt verwendete Adresse geschrieben werden, wenn sie die Caches füllt, also wäre sie die erste Zeile für die Räumung, wenn Sie das nächste Mal verwenden. Das lässt Ihnen genügend Zeit, um es tatsächlich zu benutzen (außer Sie haben sehr viel Pech), aber würde nicht mehr als einen einzigen Weg aus dem Set verschwenden, da der nächste Prefetch, der mitkommen würde, es ersetzen würde. Übrigens, in Bezug auf Ihre Kommentare oben - jeder Prefetch würde den L3-Cache verschmutzen, es ist inklusive, so dass Sie ohne ihn nicht wegkommen können.
Nicht-zeitliche (Streaming-) Lade- / Speichervorgänge - dies wird auch nicht die Caches verschmutzen, sondern einen völlig anderen Mechanismus verwenden, um sie uncachefähig zu machen (sowie Schreibkombinierung). Dies hätte in der Tat eine Strafe für die Performance , auch wenn Sie diese Zeilen wirklich nie wieder benötigen , da ein cachefähiges Schreiben den Luxus hat, im Cache gepuffert zu bleiben, bis Sie es gelöscht haben um es sofort zu schreiben. Mit uncachables tun Sie, und in einigen Szenarien könnte es mit Ihrem mem BW interferieren. Auf der anderen Seite erhalten Sie den Vorteil der Schreib-Kombination und schwache Reihenfolge, die Sie einige Vorteile haben kann. Die Quintessenz hier ist, dass Sie es nur verwenden sollten, wenn es hilft, nicht davon ausgehen, dass es magisch Leistung verbessert (Nichts macht das heutzutage ..)
In Bezug auf Ihre Fragen -
Ihr Prefetching sollte funktionieren, aber es ist nicht früh genug, um etwas zu bewirken. versuche, i+1
durch eine größere Zahl zu ersetzen. Eigentlich, vielleicht sogar einen Sweep, wäre es interessant zu sehen, wie viele Elemente im Voraus Sie sehen sollten.
Ich nehme an, das ist dasselbe wie 1 - mit 16 Muls ist Ihre Iteration lang genug, damit der Prefetch funktioniert
Wie ich schon sagte - Ihre Geschäfte werden nicht den Vorteil haben, in den Caches der unteren Ebene gepuffert zu werden und müssten in den Speicher gespült werden. Das ist der Nachteil von Streaming-Stores. es ist natürlich implementierungsspezifisch, also könnte es besser werden, aber im Moment ist es nicht immer effektiv.
Wenn Ihre Rechenkette sehr kurz ist und Sie Speicher sequentiell lesen, dann wird die CPU von alleine gut vorabholen und tatsächlich schneller arbeiten, da ihr Decoder weniger Arbeit zu erledigen hat.
Das Streaming von Ladungen und Speichern ist nur dann sinnvoll, wenn Sie nicht in naher Zukunft auf diesen Speicher zugreifen möchten. Sie zielen hauptsächlich auf den nicht zwischengespeicherten Write-Back-Speicher (WB) ab, der normalerweise bei grafischen Oberflächen zu finden ist. Die explizite Präfefizierung kann auf einer Architektur (CPU-Modell) gut funktionieren und sich negativ auf andere Modelle auswirken. Verwenden Sie sie daher als letzte Option, wenn Sie sie optimieren.