У меня действительно странная ошибка с Intel Intrinsics в функции AVX2, которой я хотел бы поделиться здесь. Либо я делаю что-то не так (сейчас не могу понять, что именно), либо ошибка в библиотеке.
У меня есть этот простой код внутри моего 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);
Значение, которое присваивается переменной ymm по какой-то странной причине:
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
К этому моменту я отлаживал часы, но не могу понять, почему ymm.m256i_i64[2]
получает это мошенническое значение. Пожалуйста помоги!
Забавный/странный факт: если я напишу этот C-код:
__m256i ymm = _mm256_set_epi64x(0x0000'0000'0000'0000,
0x0000'0000'0000'0000,
0x0000'0000'0000'0000,
0xFFFF'FFFF'FFFF'FFFF);
Затем значения правильно устанавливаются:
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
Примечание. Я использую Visual Studio; как их компилятор, так и их инструменты отладки, как показано в примере ниже:
Printf, следующий за кодом, напечатан: 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
.
Кажется, что мошеннические изменения в других переменных в структуре могут измениться, поскольку они не совпадают после того, как я добавил цикл, как это было раньше... (я не знаю, внес ли цикл специально изменения).
Редактировать: я не сторонник сборки... Вовсе нет. Я добавил сгенерированный ассемблерный код, хотя на картинке ниже, на случай, если это поможет мне понять, что происходит, и если это ошибка, вызванная не мной: