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:
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:
"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
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
Sieht sicher komisch aus. Ich würde einen Fehler im Visualizer nicht sofort ausschließen; Das ist viel komplexer als das Assembly-Mapping. – MSalters