Gerade Intels alte Sachen weniger gut geschrieben werden als ihre neue Sachen, man bedenkt, unter der Annahme, const
eine Verbesserung.
Beachten Sie, dass blend_epi16
SSE4.1 ist, während srli_si128
SSE2 ist. Wahrscheinlich haben sie sich dafür entschieden, den Punkt zu bekräftigen, dass das Argument eine Kompilierzeitkonstante sein muss, wenn sie intrinsics für SSE 4.1 hinzugefügt haben.
Der AVX2 intrinsisch für die 256bit Version verwendet const: __m256i _mm256_srli_si256 (__m256i a, const int imm)
. Dies bestätigt im Grunde, dass sie noch nicht an const
gedacht hatten, da sie begannen, const
für dieselbe Anweisung zu verwenden.
Beachten Sie auch, dass sie so unglücklich mit dem _mm_srli_si128
Namen für die psrldq
instruction waren, dass sie einen neuen Namen für sie eingeführt: _mm_bsrli_si128
sollte in neuem Code bevorzugt werden, um macht deutlicher, es ist eine Byte-Verschiebung, nicht ein 128-Bit breites Bit -Verschiebung. Es ist viel anders als _mm_srli_epi64
. Das Handbuch des Handbuchs erwähnt leider nicht den Namen bsrli
.
AVX512 Lade-/Speicher-Spezifika wird void*
statt __m128i*
verwenden, die eine andere nette Abwechslung ist.
Also im Grunde macht Intel Dinge anders, weil der alte Weg suboptimal war, nicht weil sie müssen.
Interessant, nach meiner Kennung nicht gefunden Fehler, _mm_bsrli_si128 ist nicht verfügbar in VS 2015. _mm_srli_si128 ist jedoch verfügbar. – Thomas
@Volatile: das ist bedauerlich. [Intels intrinsics guide listet es auf] (https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE,SSE2,SSE3,SSSE3,SSE4_1,SSE4_2,AVX,AVX2,Other&text=bsrli&expand=552), und gcc/clang unterstützen es. Vielleicht ist es nicht wirklich Standard. Ich wünschte es wäre, weil es offensichtlich klarer ist. Das ist wirklich bedauerlich, dass es nicht auf MSVC portierbar ist. Du hast den Catch-All 'immintrin.h' oder' x86intrin.h' eingeschlossen, richtig? –
Ja, ich bekomme den Bezeichner Fehler mit immintrin.h enthalten. – Thomas