Ich bin ziemlich verwirrt von dem obigen Problem der Interpretation. Ich eine 256-Bit-Vektorregister mit 4 * 64-Bit-Integer-Wert 2^32
Verwendung intrinsics wie folgt aus:Problem der Interpretation von 64-Bit- bis 32-Bit-Integer im SIMD-Register
__m256i vec_mask = _mm256_set1_epi64x(1 << 32);
dann würde ich es als 8 * 32-Bit-Zahlen interpretieren mag:
__m256i * tmp_mask = new __m256i;
_mm256_storeu_si256(tmp_mask, vec_mask); // store
for (int i = 0; i < 8; ++i)
printf("%d ", ((int *)(tmp_mask))[i]);
delete tmp_mask;
wie für jeden 64-Bit-Wert 2^32
, ich denke, es so in SIMD-Register ist:
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000
So wird jeder 64-Bit-Wert 2^32
als <1, 0>
im 2 * 32-Bit-Format interpretiert. Die endgültige Ausgabe wird voraussichtlich von <0, 1, 0, 1, 0, 1, 0, 1>
von niedrig zu hoch sein, aber die Ausgabe ist ziemlich seltsam: <0, 0, 0, 0, 0, 0, 0, 0>
.
Irgendeine Idee, wo ich einen Fehler gemacht habe? Vielen Dank.
Der Fehler schreibt '1 << 32' in erster Linie – harold
@harold Leider habe ich nicht ganz Ihren Punkt. Du meinst zuerst '1 << 32' in einer Variablen 'a' zu speichern und dann '_mm256_set1_epi64x (a)'? – MarZzz
Um den Kommentar von @harold zu erweitern, denken Sie daran, dass '1' ein' int' ist, das zuallererst signiert ist, und zweitens normalerweise nur 32 Bit auf allen bekannten Plattformen. Wenn Sie '1 << 32 'ausführen, überlaufen Sie diese vorzeichenbehaftete 32-Bit-Ganzzahl, was zu * undefiniertem Verhalten * führt. Sie müssen einen vorzeichenlosen Typ verwenden, und einen, der größer als 32 Bit ist. Wie "unsigned long long", das Sie mit dem Suffix "ull" erhalten, wie in '1ull << 32 '. –