2016-05-29 19 views
7

Ich habe einen wirklich seltsamen Fehler mit Intel Intrinsics auf einer AVX2-Funktion, die ich hier teilen möchte. Entweder mache ich etwas falsch (ich kann nicht wirklich was zu diesem Zeitpunkt sehen) oder einen Fehler in der Bibliothek.Möglicher Fehler in Visual Studio C Compiler oder in Intel Intrinsics 'AVX2 "_mm256_set_epi64x" -Funktion

Ich habe diesen einfachen Code in meinem main.c:

__int64 test = 0xFFFF'FFFF'FFFF'FFFF; 
__m256i ymm = _mm256_set_epi64x(0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           test); 

Der Wert, der variable ymm zugewiesen bekommt, ist aus irgendeinem seltsamen Grund:

ymm.m256i_i64[0] = 0xffff'ffff'ffff'ffff 
ymm.m256i_i64[1] = 0x0000'0000'0000'0000 
ymm.m256i_i64[2] = 0x0000'ffff'0000'0000 
ymm.m256i_i64[3] = 0x0000'0000'0000'0000 

ich stundenlang das Debuggen wurden bei Dieser Punkt, aber kann nicht sehen, warum ymm.m256i_i64[2] diesen Schurkenwert erhält. Bitte helfen Sie!

Fun/seltsame Tatsache: Wenn ich diesen C-Code schreiben:

__m256i ymm = _mm256_set_epi64x(0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           0xFFFF'FFFF'FFFF'FFFF); 

Dann gehen die Werte richtig eingestellt:

ymm.m256i_i64[0] = 0xffff'ffff'ffff'ffff 
ymm.m256i_i64[1] = 0x0000'0000'0000'0000 
ymm.m256i_i64[2] = 0x0000'0000'0000'0000 
ymm.m256i_i64[3] = 0x0000'0000'0000'0000 

Anmerkung: Ich Visual Studio verwenden; beide ihre Compiler und ihre Debugging-Tools, wie im folgenden Beispiel Bild zeigt: enter image description here

Der printf den Code folgenden gedruckt: ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ff ff 00 ff ff 00 00 ff 00 00 00 ff 00 00 00.

Es scheint, dass die Rogue-Änderungen in den anderen Variablen in der Struktur ändern können, da sie nicht identisch sind, nachdem ich die Schleife hinzugefügt habe, wie sie vorher waren ... (Ich weiß nicht, ob die Schleife speziell gemacht der Wechsel).

Edit: Ich bin kein Falke zur Montage .... Überhaupt nicht. Ich fügte hinzu, die generierte Assembly-Code, obwohl im Bild unten, im Fall, dass jemand mir helfen kann, helfen, zu verstehen, was los ist, und wenn es ein Fehler von mir nicht verursacht: enter image description here

+1

"Bug in Bibliothek" ist eher unwahrscheinlich für eine intrinsische, die nur ein dünner Wrapper ist. Wie überprüfen Sie das Ergebnis? (Bug könnte da drin sein). Was ist die generierte Baugruppe? – MSalters

+0

Ja, tatsächlich. Ich füge einen Breakpoint direkt nach der Zuweisung hinzu und überprüfe den Wert der __m256i-Struktur, die falsch erscheint. Ich habe ein Bild zum ursprünglichen Beitrag für die Klarheit in einer Sekunde hinzugefügt. – oPolo

+1

Sieht sicher komisch aus. Ich würde einen Fehler im Visualizer nicht sofort ausschließen; Das ist viel komplexer als das Assembly-Mapping. – MSalters

Antwort

4

MSVC until recently did not support any of the epi64x intrinsics in 32-bit mode. In Agner VCL Bibliothek Nebel schreibt er

//#if defined (_MSC_VER) && _MSC_VER < 1900 && ! defined (__x86_64__) && ! defined(__INTEL_COMPILER) 
// MS compiler cannot use _mm256_set1_epi64x in 32 bit mode, and 
// cannot put 64-bit values into xmm register without using 
// mmx registers, and it makes no emms 

um diesen mit MSVC in 32-Bit-Modus zu arbeiten, dies zu tun:

union { 
    int64_t q[4]; 
    int32_t r[8]; 
} u; 
u.q[0] = a; u.q[1] = b; u.q[2] = c; u.q[3] = d; 
_mm256_setr_epi32(u.r[0], u.r[1], u.r[2], u.r[3], u.r[4], u.r[5], u.r[6], u.r[7]); 

oder 64-Bit-Modus verwenden.

+1

Späte Antwort, sorry ... Es war einige stressige Monate. Ich schrieb meine Diplomarbeit, die glücklicherweise gut endete. Ungeachtet der Verspätung meiner Antwort, hat Ihr Beitrag mir geholfen, zu erkennen, was ich für einen Fehler hielt, der mich Stunden (wenn nicht ein oder zwei Tage) der Fehlersuche während meiner Doktorarbeit gekostet haben könnte. Vielen Dank für Ihre Hilfe !! – oPolo