2016-07-14 25 views
3

Intel's intrinsic guide scheint eine mysteriöse Unterscheidung mit unmittelbaren Werten zu machen. Sie bezeichnen einige als const und manche nicht als const. In der Praxis müssen die beiden Typen unabhängig voneinander Kompilierzeitkonstanten sein oder der Compiler wird sich beschweren. Ich frage mich nur, warum die Unterscheidung? Etwas, das ich vermisse?Warum nehmen manche Intel-Komponenten Konstanten an, während andere nicht konstant sind?

Hier ist ein Beispiel dafür, was Intel sagt:

_mm_blend_epi16 (__m128i a, __m128i b, const int imm8) 
_mm_srli_si128 (__m128i a, int imm8) 

Antwort

5

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.

+0

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

+0

@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? –

+0

Ja, ich bekomme den Bezeichner Fehler mit immintrin.h enthalten. – Thomas