Wie behandeln Compiler SSE (oder andere) intrinsische Funktionen?

8

Vor einiger Zeit habe ich irgendwo gelesen, dass SSE-Eigenfunktionen zu effizientem Maschinencode kompilieren, weil Compiler sie anders behandeln als gewöhnliche Funktionen. Ich bin am Wandern, wie wirklich Compiler es tun und was C-Programmierer tun können, um den Prozess zu erleichtern. Gibt es irgendwelche Richtlinien, wie man intrinsische Funktionen in einer Weise benutzt, die den Compiler dazu bringt, effizienten Maschinencode zu erzeugen?

Danke.

    
pic11 15.04.2011, 13:03
quelle

2 Antworten

6

Die intrinsics kompilieren bis zu den Anweisungen der Darstellung, ob dies effizient ist oder nicht hängt davon ab, wie sie verwendet werden.

Auch behandelt jeder Compiler intrinsics ein wenig anders (aka seine Implementierung spezifisch), aber GCC ist Open Source, also Sie können sehen, wie sie die SSE behandeln, Open Watcom *, LCC , PCC und TCC* sind alle Open-Source-C-Compiler, obwohl sie keine SSE-Eigen- schaften haben, sie sollten immer noch intrinsisch sein, und Sie können sehen, wie sie damit umgehen.

Ich denke, was Sie gelesen haben, war mit der automatischen Vektorisierung von Code, etwas GCC, verbunden (siehe dies ) und ICC sind sehr gut, aber sie sind nicht so gut wie handoptimierter Code, zumindest noch nicht

* wurde möglicherweise mit Unterstützung für SSE aktualisiert, in letzter Zeit nicht überprüft ...

    
Necrolis 15.04.2011, 15:59
quelle
4

Im Gegensatz zu dem, was Necrolis geschrieben hat, können die intrinsics bis zu den Anweisungen, die sie repräsentieren, kompilieren oder nicht . Dies gilt insbesondere für Kopier- oder Ladeanweisungen wie _mm_load_pd , da der Compiler immer noch für die Zuweisung und Zuweisung von Registern verantwortlich ist, wenn er intrinsic verwendet. Dies bedeutet, dass das Kopieren eines Wertes von einem Ort zu einem anderen überhaupt nicht notwendig ist, wenn die zwei Orte durch das gleiche Register repräsentiert werden können. In diesem Fall kann der Compiler die Kopie entfernen. Es kann auch andere Anweisungen entfernen, wenn das Ergebnis nie verwendet wird.

Sehen Sie sich diesen Blogbeitrag an, in dem das Verhalten verschiedener Compiler verglichen wird trainieren. Es ist von 2009, so dass die Details möglicherweise nicht mehr gelten. Neuere Compiler optimieren jedoch Ihren Code wahrscheinlich, nicht weniger.

Wie für die tatsächliche Verwendung von Intrinsics ist die Antwort dieselbe wie für alle anderen Leistungsoptimierungen: Messen, Messen und Messen. Stellen Sie sicher, dass Sie sich tatsächlich mit einem heißen Stück Code beschäftigen, herauszufinden, warum es langsam ist, und dann verbessern Sie es. Sie werden sehr wahrscheinlich feststellen, dass die Verbesserung Ihrer Speicherzugriffsmuster wichtiger ist als die Verwendung von Intrinsics.

    
Jørgen Fogh 09.05.2013 14:44
quelle

Tags und Links