Wie um zu überprüfen, mit Intel-Interna wenn AVX-Erweiterungen unterstützt wird die CPU?
Ich Schreibe ein Programm mit der Intel-Interna. Ich will _mm_permute_pd
intrinsische, die nur auf CPUs mit AVX. Für CPUs ohne AVX, die ich verwenden kann _mm_shuffle_pd
aber nach den Spezifikationen, ist es viel langsamer als _mm_permute_pd
. Tun die header-Dateien für Intel-Interna Konstanten definieren, die mir erlauben, zu unterscheiden, ob AVX unterstützt, so dass ich schreiben kann, sth wie diese:
#ifdef __IS_AVX_SUPPORTED__ //is there sth like this defined?
//use _mm_permute_pd
# else
//use _mm_shuffle_pd
#endif
? Ich habe festgestellt dieses tutorial, die zeigt, wie führen Sie eine Laufzeit überprüfen, aber ich brauche eine statische, compile-time check für die aktuelle Maschine.
_mm_permute_pd
(vpermilpd
) ist nicht schneller alsshufpd dest,same,same
, es sei denn, es ermöglicht einem Speicher-source-operand zu Falten in die Anleitung. Siehe agner.org/optimize für den Unterricht Tabellen, etc.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie sind mit Intel-C++ - Compiler. In diesem Fall - ja, es gibt solche Makros: Intel C++ Compiler Reference Guide:
__AVX__
,__AVX2__
.P. S. beachten Sie, dass, wenn Sie kompilieren Sie die Anwendung mit AVX-Befehlssatz aktiviert, es werden nicht auf CPUs nicht unterstützt AVX. Wenn Sie verteilen Ihre software als Quellcode-Paket kompilieren und auf der Ziel-Maschine - dies ist möglicherweise eine gute Lösung. Ansonsten solltest du für AVX dynamisch.
P. P. S. Es gibt mehrere Optionen für das ICC. Werfen Sie einen Blick auf die folgende compiler-Optionen und auch Verweise aus anderen.
-mtune=native
Melodie der Befehlssatz abhängig von der aktuellen CPU, vielleicht gibt es etwas ähnliches für ICC?-xHost
für MacOS und Linux/QxHost
für Windows. Es gibt auch verschiedene Optionen, wie-march
,-arch
etc.GCC, ICC, MSVC, und Klammerten sich alle definieren, die ein makro
__AVX__
die Sie überprüfen können. In der Tat ist es die einzige SIMD-Konstante definiert, die von allen Compilern (MSVC ist derjenige, der bricht die Form). Dies nur, sagt Sie, wenn Ihr code wurde kompiliert mit AVX-Unterstützung (z.B. -mavx mit GCC oder /arch:AVX mit MSVC) es tut dir nicht sagen, ob Ihre CPU AVX unterstützt. Wenn Sie wissen möchten, ob die CPU AVX unterstützt, müssen Sie check CPUID. Hier asm-in-c-Fehler, ist ein Beispiel für das Lesen CPUID von all den Compiler.Um diese richtig zu machen ich schlage vor, Sie machen eine CPU-dispatcher.
Edit: falls jemand wissen will wie die Werte von CPUID, um herauszufinden, ob AVX verfügbar ist, sehen https://github.com/Mysticial/FeatureDetector
Scheint es mir, dass der einzige Weg ist, um zu kompilieren und führen Sie ein Programm, das identifiziert, ob AVX verfügbar ist. Dann manuell oder automatisch kompilieren separaten code mit oder ohne AVX-Funktionen. Für VS 2013 würde ich meinen code in commomAVX Ordner im folgenden zu identifizieren hasAVX (oder auch nicht) und verwenden Sie diese, um auszuführen, eine von zwei verschiedenen BAT-Dateien die zum kompilieren und verknüpfen Sie das entsprechende Programm.
http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip
Meine Frage war, zu helfen, zu identifizieren, eine Lösung hinsichtlich der Verwendung geeigneter Optionen kompilieren wie /arch:AVX.