Назад
Інструкція vfmaddrnd231pd: задокументована в Intel SDM, але ніколи не створена
SiTech AI Team3 хв читання

Інструкція vfmaddrnd231pd: задокументована в Intel SDM, але ніколи не створена

Хитра FMA-інструкція vfmaddrnd231pd є у SDM Intel 2024 року, хоча на реальному залізі викликає помилку невизначеної інструкції. Розслідування блогу доводить її до покинутих експериментів AVX10 з округленням.

З’явлення інструкції

vfmaddrnd231pd значиться у Software Developer's Manual Intel (SDM) як член набору FMA-інструкцій. Згідно з виданням 2024 року, вона виконує злиті множення-додавання для пакованих значень рухомої коми подвійної точності з контролем округлення. Приєднаний до інструкції негайний байт визначає бітові поля округлення, DAZ, FTZ та придушення винятків. Такий контроль давав арифметичним операціям можливість безпосередньо обирати режим округлення замість повільних глобальних змінних і значно прискорював алгоритми, що залежать від округлення. Але цієї інструкції не існує.

Невдалі пошуки та помилка #UD

GNU assembler не знає vfmaddrnd231pd. SDM називає intrinsic-и Intel C/C++ Compiler _mm_fmaddround_pd та _mm256_fmaddround_pd, але їх немає не лише в Clang, а й в ICC. Ручне збирання інструкції зі списку opcode-ів SDM, VEX.DDS.128.66.0F3A.W1 B8 /r /ib, породжує ще одне питання: ніде в посібнику не пояснено, що означає DDS. На CPU Haswell, який підтримує FMA, вона викликає помилку #UD (невизначеної інструкції). У виданні SDM 2026 року цієї інструкції вже немає, хоча у виданні 2024 року вона є; немає й її споріднених варіантів pd, ps, sd, ss чи форм 132, 213, 231, які мають інші FMA-інструкції.

Покинутий прототип AVX10

Коментарі блогу доповнили історію. У 2023 році Intel через технічні обмеження не зміг додати AVX-512 до споживчих CPU, але хотів функції в стилі AVX-512, що привело до AVX10. AVX10 нагадував AVX-512, хоча умовно підтримував 512-бітні вектори. У префіксі EVEX AVX-512 статичні біти округлення використовуються залежно від ширини операції, тому налаштувати округлення можуть лише скалярні та 512-бітні операції. AVX10 без підтримки 512 бітів потребувало інше кодування. Теоретично Intel планувало виділити негайний байт для округлення, тому vfmaddrnd231pd та подібні інструкції потрапили в документацію. Вона використовує префікс VEX, а не EVEX, що дозволяло CPU без 512-бітних векторів ігнорувати EVEX. До 2024 року Intel відкинув цей підхід і використав останній невикористаний біт EVEX для округлення 256-бітних векторів з кодуванням і синтаксисом AVX-512, через що vfmaddrnd231pd та її споріднені стали зайвими. Під час переробки хтось почав видаляти з чернетки SDM з’явлення інструкції.

Патчі компілятора підтверджують історію

До 2025 року після популярності AVX-512 у Zen 4 вона стала обов’язковою, а Intel зробила підтримку 512 бітів у AVX10 необов’язковою. З оновленого whitepaper AVX10 прибрали максимум 256-бітних векторних регістрів і вбудовані інструкції округлення для 256 бітів. Intel надіслала патчі на видалення підтримки 256-бітного округлення в GCC, серед них Revert «AVX10.2 ymm rounding: Support vfmadd{132, 231, 213}p{s, d, h} intrins», який видалив intrinsic-и, такі як _mm256_fmadd_round_pd. Це дуже схоже на _mm256_fmaddround_pd, задокументований для фантомної інструкції. Пізніше в Intel помітили, що vfmaddrnd231pd ще залишався в SDM, і видалили його. Підсумок автора: інструкція є нащадком AVX10: додана під час прототипування, перероблена під інше кодування і врешті зайва, хоча випадково опублікована в офіційному посібнику, незважаючи на те, що ніколи не працюватиме на залізі.

Джерела: purplesyringa.moe

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.