Ich werde meine Frage mit einem Beispiel stellen. Jetzt habe ich eine Funktion namens do_something()
.Was ist der richtige Weg, um verschiedene Versionen von SSE-Intrinsics in GCC zu verwenden?
Es hat drei Versionen: do_something()
, do_something_sse3()
und do_something_sse4()
. Wenn mein Programm läuft, erkennt es die CPU-Funktion (siehe SSE3 oder SSE4) und ruft eine der drei Versionen entsprechend auf.
Das Problem ist: Wenn ich mein Programm mit GCC bauen, ich habe -msse4
für do_something_sse4()
einstellen zu kompilieren (zum Beispiel für die Header-Datei <smmintrin.h>
aufgenommen werden).
Wenn ich jedoch -msse4
einstelle, dann kann gcc SSE4-Anweisungen verwenden, und einige interne Elemente in do_something_sse3()
werden auch in einige SSE4-Anweisungen übersetzt. Also, wenn mein Programm auf CPU läuft, die nur SSE3 (aber keine SSE4) Unterstützung hat, verursacht es "illegale Anweisung" wenn Anrufe do_something_sse3()
.
Vielleicht habe ich ein paar schlechte Praxis. Könntest du ein paar Vorschläge machen? Vielen Dank.
Ich denke, der Standardansatz besteht darin, die verschiedenen Versionen in separaten Kompilierungseinheiten zu kompilieren. – Mysticial
@Mysticial, zuerst danke, dass Sie meine Frage bearbeitet haben. Wie ich es verstehe, bedeutet "kompiliere die verschiedenen Versionen in separaten Kompilierungseinheiten": setze alle "do_things_sse4" in eine Datei "functios_sse4.c" und kompiliere sie mit der Option "-msse4"; und kompiliere 'functions_sse3.c' mit' -msse3'. Ich werde es versuchen. (Ich muss vielleicht meine Codes rekonstruieren, die ursprünglich für MSVC geschrieben wurden) – shengbinmeng
Ja, genau das meinte ich. :) – Mysticial