2017-01-29 1 views
0

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.

+5

Der Fehler schreibt '1 << 32' in erster Linie – harold

+0

@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

+2

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 '. –

Antwort

0

Die folgenden Code-Ausgänge 0 1 0 1 0 1 0 1 wie Sie es erwarten ...

#include <stdlib.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <x86intrin.h> 

int main() { 
    __m256i vec_mask = _mm256_set1_epi64x(UINT64_C(1) << 32); 
    uint32_t tmp_mask[8]; 
    _mm256_storeu_si256((__m256i *)tmp_mask, vec_mask); // store 
    for (int i = 0; i < 8; ++i) 
     printf("%d ", tmp_mask[i]); 
}