2016-05-02 6 views
2

In c/C++, die explizite Vektorisierung intrinsics zur Verfügung gestellt von immintrin.h, würde ich argumentieren, ist ein Kludge. Das heißt, für jeden CPU-Befehlssatz (z. B. SSE, AVX2, AVX512, ...) und für jeden Zahlentyp (dh float, double, int usw.) gibt es eine einzigartige Funktion für die gleichen grundlegenden Operationen, wie _mm_add_epi8 , _mm_add_epi16, _mm256_add_epi8, _mm256_add_epi16, alle für die Basis +. Also, wenn Sie mit intrinsics für AVX codieren, müssen Sie beim Upgrade auf AVX2 und dann für AVX512 und so weiter recode.Alternative zu immintrin.h

Auf der anderen Seite scheinen einige der Compiler grundlegenden, integrierten Operator (dh '+', '-', etc.) gut funktionieren (Daten sind ausgerichtet) auf alle Arten (Vektor und nicht) und einige gemischte Operationen (wie unten im Abschnitt dargestellt), was zu besserer Lesbarkeit und Skalierbarkeit führt (mit simd Befehlssatz).

// no need for #include "immintrin.h" 

#ifndef __AVX2__ 
#define SIMD_LEN 16 
#else 
#define SIMD_LEN 32 
#endif 

typedef int num_t; 

num_t a[N], b[N]; 

// for any num_t and SIMD_LEN, explicitly vectorize b[n] = 2*a[n] + 4 

typedef num_t vec_t __attribute__ ((__vector_size__ (SIMD_LEN))); 

vec_t *vA = (vec_t*)a; 
vec_t *vB = (vec_t*)b; 

int nNums = SIMD_LEN/sizeof(num_t); 

for (int n=0; n < (N/nNums); n++) 
    vB[n] = 2*vA[n] + 4; 

Offensichtlich solche flexibity/Skalierbarkeit wird nicht für alle Operationen verfügbar sein, aber es scheint, dass immintrin.h nicht natürlichen Ausdrücke so viel zu erlauben, ist wie es könnte.

Gibt es zu diesem Zweck einen alternativen "intrinsischen" Header zu der immintrin.h Familie, die mehr natürlichen Ausdruck ermöglicht, wie oben dargestellt? Mindestens eine, die viele der universellen, skalierbaren Op, wie horizontale addieren, nicht ausgerichtete Last, vergleichen, etc.?

Und für den Zweck dieser Frage bin ich nicht interessiert an "einfach den Compiler vektorisieren lassen". Das beantwortet einfach die Frage, ob man intrinsische Substanzen verwenden soll oder nicht.

+2

https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html sind teilweise gcc-spezifisch, aber ziemlich nett zu verwenden. – EOF

+1

etwas Interessantes über die gcc-Vektor-Erweiterung https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68123 – user3528438

+0

Ich kenne die eingebaute Vektor-Erweiterung wie in ihttps: //gcc.gnu.org gezeigt /onlinedocs/gcc/Vector-Extensions.html. In der Tat ist "immintrin.h" einfach Makro und Func auf ihnen gebaut. Ich suche nach einer Alternative zu "immintrin.h", die auf der gleichen Vektor-Erweiterung aufbaut, aber eine andere Syntax verwendet, die nicht bricht, wenn Code von SSE zu AVX zu AVX2 zu AVX512 zu was auch immer migriert wird. – codechimp

Antwort

1

Das Hauptargument für die Verwendung eines typedef mit __attribute__ ((__vector_size__... ist, dass es einfacheren Quellcode produziert.

Das wichtigste Argument zu bevorzugen immintrin.h ist, dass es weniger Compiler-spezifisch ist.

Sie können mehr über die Einschränkungen von jedem durch Web-Suche für die Kombination von immintrin und gcc vector extension herausfinden.

In jedem Fall sollte der Rest der Anwendung kaum bemerkt von ihnen, die Sie !:

Ich würde versuchen, werden mit der Entscheidung so lange wie möglich aufzuschieben durch all dies in eine mathvector Klasse/Struktur abstrahiert . Es kann zunächst eine einfache nicht-vektorisierte Implementierung haben. Entwickeln Sie zuerst alle anderen Teile Ihrer Anwendung. Sie können dann die Klasse mathevector in Zukunft immer vektorisieren lassen.

+0

Während 'immintrin.h', wie es ist, möglicherweise weniger Compiler-spezifische, aber es ist sehr viel CPU-und Variablentyp spezifisch, Das ist nicht gerade ein guter Kompromiss. Aber auf jeden Fall argumentiere ich nicht für die Verwendung von '__attribute ...'. Tatsächlich bin ich geneigt, es nicht zu benutzen. Aber ich suche nach etwas Besserem als das de facto 'immintrin.h ', was tatsächlich nur eine Menge von Inline-Funktionen und -Makros ist, die eine Standard-Syntax für explizite Vektorisierung durch die Verwendung des Compiler-spezifischen' Attributs 'definieren. Ich bin nur unzufrieden mit der genannten "Syntax". – codechimp