g ++ implementiert __restrict__
für Zeiger, aber ich konnte nichts über Iteratoren finden. Meine allgemeine Absicht ist es, den Compiler zu ermutigen, STL-Schleifen zu vektorisieren.
Bearbeiten:
Auch wenn der Compiler nicht vektorisieren kann, sollte das Schlüsselwort __restrict__
dem Compiler mitteilen können, dass innerhalb einer Schleife keine unnötigen Neuladungen erforderlich sind.
Ich kenne die Antwort auf Ihre direkte Frage nicht. Allerdings wäre der Compiler nur in der Lage, eine Schleife für std::vector
zu vektorisieren, da es der einzige Container ist (denke ich), der zusammenhängende Speicher und keine Abhängigkeiten zwischen aufeinanderfolgenden Speicherorten hat (anders als z. B. std::list
). Ich weiß jedoch nicht, wie ich das schaffen soll.
Aktualisieren
Nach einigen Experimenten (die für das Gesamtziel relevant sein können oder nicht), entdeckte ich, dass in der ICC das Folgende nicht vektorisiert:
%Vor%wobei Folgendes gilt:
%Vor% Offenbar ist das Problem nicht so sehr Iteratoren, sondern der Aufruf von vec.end()
innerhalb des Schleifenkonstrukts, das offensichtlich nicht herausgerechnet werden kann, obwohl klar ist, dass der Schleifenkörper die Vektorgrenzen nicht beeinflusst / p>
In GCC konnte ich nichts zum Vektorisieren bekommen. Dies ist nicht überraschend, weil GCC beim Aufspüren von SSE-Möglichkeiten viel schlechter ist als ICC.