2014-06-17 4 views
7

Ich schreibe ein Programm mit Intel intrinsics. Ich möchte _mm_permute_pd intrinsisch verwenden, die nur auf CPUs mit AVX verfügbar ist. Für CPUs ohne AVX kann ich _mm_shuffle_pd verwenden, aber laut den Spezifikationen ist es viel langsamer als _mm_permute_pd. Haben die Header-Dateien für Intel-Spezifika-Konstanten definieren, die mir erlauben, zu unterscheiden, ob AVX unterstützt wird, so dass ich sth so schreiben kann:Wie überprüft man mit Intel-Intrinsics, ob AVX-Erweiterungen von der CPU unterstützt werden?

#ifdef __IS_AVX_SUPPORTED__ // is there sth like this defined? 
// use _mm_permute_pd 
# else 
// use _mm_shuffle_pd 
#endif 

? Ich habe this tutorial gefunden, die zeigt, wie man eine Laufzeitprüfung durchführt, aber ich muss eine statische Kompilierzeitprüfung für die aktuelle Maschine durchführen.

+0

'_mm_permute_pd' (' vpermilpd') ist nicht schneller als 'shufpd dest, selbe, selbe', es sei denn, es kann ein Speicherquelloperand in die Anweisung eingefügt werden. Siehe http://agner.org/optimize/ für Anweisungstabellen usw. –

Antwort

5

Ich nehme an, Sie verwenden Intel C++ Compiler. In diesem Fall - ja, gibt es solche Makros: Intel C++ Compiler Reference Guide: __AVX__, __AVX2__.

P.S. Beachten Sie, dass bei der Kompilierung Ihrer Anwendung mit aktiviertem AVX-Befehlssatz bei CPUs, die AVX nicht unterstützen, ein Fehler auftritt. Wenn Sie Ihre Software als Quellcode-Paket verteilen und auf dem Zielcomputer kompilieren möchten, ist dies eine praktikable Lösung. Andernfalls sollten Sie dynamisch nach AVX suchen.

P.P.S. Es gibt mehrere Optionen für ICC. Werfen Sie einen Blick auf die following compiler options und verweist auch auf andere.

+0

GCC unterstützt '-mtune = native', um den Befehlssatz abhängig von der aktuellen CPU abzustimmen, vielleicht gibt es etwas Ähnliches für ICC? – peppe

+0

Ja, es gibt '-xHost' für MacOS und Linux und'/QxHost' für Windows. Es gibt auch verschiedene Optionen wie "-march", "-arch" usw. – Romeo

5

GCC, ICC, MSVC und Clang definieren alle ein Makro __AVX__, das Sie überprüfen können. Tatsächlich ist es die einzige SIMD-Konstante, die von all diesen Compilern definiert wird (MSVC is the one that breaks the mold). Dies sagt Ihnen nur, ob Ihr Code mit AVX-Unterstützung kompiliert wurde (z. B. -mavx mit GCC oder/arch: AVX mit MSVC), er sagt Ihnen jedoch nicht, ob Ihre CPU AVX unterstützt. Wenn Sie wissen möchten, ob die CPU AVX unterstützt, müssen Sie CPUID überprüfen. Hier, asm-in-c-error, ist ein Beispiel zum Lesen der CPUID von all diesen Compilern.

Um dies richtig zu machen, schlage ich vor, Sie machen eine CPU dispatcher.

Edit: Falls will jemand wissen, wie die Werte verwenden, um von CPUID, um herauszufinden, ob AVX verfügbar sehen https://github.com/Mysticial/FeatureDetector

0

Es scheint mir, dass der einzige Weg ist, ein Programm zu kompilieren und auszuführen, ob identifiziert AVX ist verfügbar. Dann manuell oder automatisch kompilieren separaten Code mit oder ohne AVX-Funktionen. Für VS 2013 würde ich meinen Code im commomAVX-Ordner im folgenden verwenden, um hasAVX (oder nicht) zu identifizieren und damit eine von zwei verschiedenen BAT-Dateien auszuführen, um das entsprechende Programm zu kompilieren und zu verknüpfen.

http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip

Meine Frage war zu helfen, eine Lösung in Bezug auf die Verwendung von geeigneten Kompilierungsoptionen wie/Bogen zu identifizieren: AVX.

Verwandte Themen