Nano Hash - криптовалюты, майнинг, программирование

Потенциальная ошибка в компиляторе Visual Studio C или в функции Intel Intrinsics AVX2 _mm256_set_epi64x

У меня действительно странная ошибка с 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.

Кажется, что мошеннические изменения в других переменных в структуре могут измениться, поскольку они не совпадают после того, как я добавил цикл, как это было раньше... (я не знаю, внес ли цикл специально изменения).

Редактировать: я не сторонник сборки... Вовсе нет. Я добавил сгенерированный ассемблерный код, хотя на картинке ниже, на случай, если это поможет мне понять, что происходит, и если это ошибка, вызванная не мной: введите здесь описание изображения


  • Ошибка в библиотеке маловероятна для встроенной функции, которая представляет собой всего лишь тонкую оболочку. Как вы проверяете результат? (Ошибка может быть там). Что такое сгенерированная сборка? 29.05.2016
  • Да, в самом деле. Я добавляю точку останова сразу после присваивания и проверяю значение, присвоенное структуре __m256i, которое кажется неправильным. Я добавил изображение в исходный пост для ясности в секунду. 29.05.2016
  • Конечно выглядит странно. Я бы не стал сразу исключать баг в визуализаторе; это намного сложнее, чем встроенное в сборку сопоставление. 29.05.2016
  • На снимке экрана показано, что long long в вашем вопросе используется __int64. 29.05.2016
  • Плохо, я протестировал разные типы данных, чтобы увидеть, дали ли они правильные результаты. Снимок экрана будет обновлен для использования __int64, так как это используется в документации Intel Intrinsics ( software.intel.com/sites/landingpage/IntrinsicsGuide/ ) 29.05.2016
  • Я добавил сгенерированный ассемблерный код в качестве картинки, но должен признать... Я почти ничего не знаю об ассемблере, поэтому я использую Intel Intrinsics для доступа к функциям AVX. Я надеюсь, что ассемблерный код может как-то помочь прояснить тайну. 29.05.2016
  • Очевидно, вы используете VS2015. Это похоже на регресс эта ошибка VS2013. Или они просто не справились с этим для генератора 32-битного кода, что, вероятно, связано с тем, что встроенный код нельзя было использовать в x86 с VS2013. Он отлично работает, когда вы ориентируетесь на x64, что является лучшим обходным решением. Там же можно отправить отчет об ошибке. 29.05.2016
  • @oPolo: разве VS не позволяет копировать/вставлять текст разборки? По возможности избегайте публикации изображений с текстом. Не утруждайте себя изменением на этом этапе, так как комментарий Ганса, вероятно, является ответом. 30.05.2016
  • Кроме того, пожалуйста, скажите мне, что это вывод asm в режиме отладки. Использование pshufb (_mm_shuffle_epi8) с константой из памяти для этой перетасовки просто полностью глупо. 30.05.2016
  • Если бы MSVC по умолчанию использовал 64-битный режим, таких вопросов на SO было бы намного меньше. 30.05.2016
  • stackoverflow.com/questions/ 27258261/ 08.06.2016

Ответы:


1

MSVC до недавнего времени не поддерживал ни одну из встроенных функций epi64x в 32-разрядном режиме. . В библиотеке VCL Агнера Фога он пишет

//#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

Чтобы обойти это в 32-битном режиме с MSVC, вы можете сделать это:

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]);

Или используйте 64-битный режим.

08.06.2016
  • Поздний ответ, извините... Это были напряженные месяцы. Я писал диссертацию, которая, к счастью, закончилась хорошо. Несмотря на задержку моего ответа, ваш пост помог мне обнаружить то, что я считал ошибкой, которая могла стоить мне часов (если не дня или двух) устранения неполадок во время моей диссертации. Это достойно большой благодарности: Большое спасибо за вашу помощь!! 08.11.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..