_mm256_setr_epi64x вызывает неправильные результаты при сборке x86 msvc v143 с /arch:AVX ⇐ C++
_mm256_setr_epi64x вызывает неправильные результаты при сборке x86 msvc v143 с /arch:AVX
Я размышляю над этим уже неделю, возможно, это ошибка компилятора, но я не могу быть полностью уверен.
Я использую MSVC - 19.37.32822.0 с cmake, мои target_compile_options: /utf-8/W3/bigobj/EHsc/arch:AVX ( /arch:AVX2 тоже не работает). Мой target_compile_features — cxx_std_20.
Внутренние функции _mm256_setr_epi64x и _mm256_set_epi64x дают неправильные результаты. Проблема не воспроизводится в отладочных сборках. Проблема не воспроизводится для сборок g++, clang++, clang-cl со всеми комбинациями параметров SIMD.
Это происходит только в этой конкретной сборке msvc x86 с включенным /arch:AVX или /arch:AVX2. Я не пробовал предыдущие наборы инструментов msvc — только последнюю версию v143 (MSVC — 19.37.32822.0)
Я написал соответствующий отчет об ошибке на веб-сайте Microsoft, но решил, что было бы полезно получить некоторую информацию и отсюда.
РЕДАКТИРОВАТЬ: Похоже, что эту проблему труднее воспроизвести, чем предполагалось. На первый взгляд кажется, что это связано с платформой тестирования Catch2. Я настроил репозиторий GitHub с необходимой кроссплатформенной настройкой cmake для его последовательного воспроизведения: https://github.com/Epixu/msvc_but_repro
Вы можете клонировать его и экспериментировать с ним. Я также добавил рабочий процесс (если вы нажмете «Действия» и войдёте в github, вы даже сможете увидеть журналы сборки/тестирования). Для него требуется cmake, и он автоматически получит среду тестирования Catch2
================== Старое предположение: Вот минимальный воспроизводимый пример:
#include #include интервал основной() { const int64_t значения[4] {11, 22, 33, 0}; const __m256i a1 = _mm256_setr_epi64x( значения[0], ценности[1], ценности[2], 0 // если я заменю это значением [3], все будет работать нормально ); alignas(32) int64_t b1[4]; _mm256_store_si256(reinterpret_cast(b1), a1); вернуть b1[0] == значения[0] && b1[1] == значения[1] && b1[2] ==values[2] // здесь всегда не получается && b1[3] == значения[3] ? 0:-1; } (богболт) Я не уверен, что это воспроизводит проблему, потому что я не могу запустить его в godbolt, но он воспроизводит это на моей машине, а также на бегунах github в моем CI. РЕДАКТИРОВАТЬ: это не воспроизводит проблему. Похоже, для воспроизведения требуется Catch2. См. ссылку на репродукцию GitHub выше для настройки воспроизведения.
Вот проблемная сборка (РЕДАКТИРОВАТЬ: Вероятно, не имеет значения):
const __m256i a1 = _mm256_setr_epi64x( 00400D6A mov ecx,dword ptr [ebp-38h] значения[0], ценности[1], ценности[2], 0 // если я заменю это значением [3], все будет работать нормально ); WHEN("a1 сохранен") { 00400D6D lea ecx,[ebp-2A4h] 00400D73 vmovdqu xmm0,xmmword ptr [значения] 00400D78 винсертф128 ymm0,ymm0,xmm1,1 00400D7E vmovdqu ymmword ptr [ebp-80h],ymm0 00400D83 vzeroupper А вот работающая альтернатива:
const __m256i a1 = _mm256_setr_epi64x( 00EC0D6A vmovdqu xmm0,xmmword ptr [значения] 00EC0D6F vinsertf128 ymm0,ymm0,xmmword ptr [ebp-38h],1 00EC0D76 vmovdqu ymmword ptr [ebp-80h],ymm0 значения[0], ценности[1], ценности[2], значения[3] // если я заменю это значением[3], все будет работать нормально ); WHEN("a1 сохранен") { 00EC0D7B lea ecx,[ebp-2A4h] 00EC0D81 vzeroupper Я не очень хорошо владею ASM, поэтому не уверен, что здесь что-то не так. Любая помощь будет оценена по достоинству!
Я написал соответствующий отчет об ошибке на веб-сайте Microsoft, но решил, что было бы полезно получить некоторую информацию и отсюда.
Заранее спасибо, надеюсь, это не какая-то нелепая ошибка с моей стороны.
Я размышляю над этим уже неделю, возможно, это ошибка компилятора, но я не могу быть полностью уверен.
Я использую MSVC - 19.37.32822.0 с cmake, мои target_compile_options: /utf-8/W3/bigobj/EHsc/arch:AVX ( /arch:AVX2 тоже не работает). Мой target_compile_features — cxx_std_20.
Внутренние функции _mm256_setr_epi64x и _mm256_set_epi64x дают неправильные результаты. Проблема не воспроизводится в отладочных сборках. Проблема не воспроизводится для сборок g++, clang++, clang-cl со всеми комбинациями параметров SIMD.
Это происходит только в этой конкретной сборке msvc x86 с включенным /arch:AVX или /arch:AVX2. Я не пробовал предыдущие наборы инструментов msvc — только последнюю версию v143 (MSVC — 19.37.32822.0)
Я написал соответствующий отчет об ошибке на веб-сайте Microsoft, но решил, что было бы полезно получить некоторую информацию и отсюда.
РЕДАКТИРОВАТЬ: Похоже, что эту проблему труднее воспроизвести, чем предполагалось. На первый взгляд кажется, что это связано с платформой тестирования Catch2. Я настроил репозиторий GitHub с необходимой кроссплатформенной настройкой cmake для его последовательного воспроизведения: https://github.com/Epixu/msvc_but_repro
Вы можете клонировать его и экспериментировать с ним. Я также добавил рабочий процесс (если вы нажмете «Действия» и войдёте в github, вы даже сможете увидеть журналы сборки/тестирования). Для него требуется cmake, и он автоматически получит среду тестирования Catch2
================== Старое предположение: Вот минимальный воспроизводимый пример:
#include #include интервал основной() { const int64_t значения[4] {11, 22, 33, 0}; const __m256i a1 = _mm256_setr_epi64x( значения[0], ценности[1], ценности[2], 0 // если я заменю это значением [3], все будет работать нормально ); alignas(32) int64_t b1[4]; _mm256_store_si256(reinterpret_cast(b1), a1); вернуть b1[0] == значения[0] && b1[1] == значения[1] && b1[2] ==values[2] // здесь всегда не получается && b1[3] == значения[3] ? 0:-1; } (богболт) Я не уверен, что это воспроизводит проблему, потому что я не могу запустить его в godbolt, но он воспроизводит это на моей машине, а также на бегунах github в моем CI. РЕДАКТИРОВАТЬ: это не воспроизводит проблему. Похоже, для воспроизведения требуется Catch2. См. ссылку на репродукцию GitHub выше для настройки воспроизведения.
Вот проблемная сборка (РЕДАКТИРОВАТЬ: Вероятно, не имеет значения):
const __m256i a1 = _mm256_setr_epi64x( 00400D6A mov ecx,dword ptr [ebp-38h] значения[0], ценности[1], ценности[2], 0 // если я заменю это значением [3], все будет работать нормально ); WHEN("a1 сохранен") { 00400D6D lea ecx,[ebp-2A4h] 00400D73 vmovdqu xmm0,xmmword ptr [значения] 00400D78 винсертф128 ymm0,ymm0,xmm1,1 00400D7E vmovdqu ymmword ptr [ebp-80h],ymm0 00400D83 vzeroupper А вот работающая альтернатива:
const __m256i a1 = _mm256_setr_epi64x( 00EC0D6A vmovdqu xmm0,xmmword ptr [значения] 00EC0D6F vinsertf128 ymm0,ymm0,xmmword ptr [ebp-38h],1 00EC0D76 vmovdqu ymmword ptr [ebp-80h],ymm0 значения[0], ценности[1], ценности[2], значения[3] // если я заменю это значением[3], все будет работать нормально ); WHEN("a1 сохранен") { 00EC0D7B lea ecx,[ebp-2A4h] 00EC0D81 vzeroupper Я не очень хорошо владею ASM, поэтому не уверен, что здесь что-то не так. Любая помощь будет оценена по достоинству!
Я написал соответствующий отчет об ошибке на веб-сайте Microsoft, но решил, что было бы полезно получить некоторую информацию и отсюда.
Заранее спасибо, надеюсь, это не какая-то нелепая ошибка с моей стороны.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
_mm256_setr_epi64x вызывает неправильные результаты при сборке x86 msvc v143 с /arch:AVX
Anonymous » » в форуме C++ - 0 Ответы
- 47 Просмотры
-
Последнее сообщение Anonymous
-