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.
https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html sind teilweise gcc-spezifisch, aber ziemlich nett zu verwenden. – EOF
etwas Interessantes über die gcc-Vektor-Erweiterung https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68123 – user3528438
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