Арифметика с плавающей точкой половинной точности на чипах Intel
Можно ли выполнить арифметику с плавающей запятой половинной точности на чипах Intel?
Я знаю, как загружать / хранить / преобразовывать числа с плавающей запятой половинной точности [1], но я не знаю, как добавить / умножить их без преобразования в числа с плавающей запятой одинарной точности.
[1] https://software.intel.com/en-us/articles/performance-benefits-of-half-precision-floats
1 ответ
Можно ли выполнить арифметику с плавающей запятой половинной точности на чипах Intel?
Да, по-видимому, встроенный графический процессор в Skylake и более поздних версиях имеет аппаратную поддержку FP16 и FP64, а также FP32. С достаточно новыми драйверами вы можете использовать его через OpenCL.
На более ранних чипах вы получаете примерно одинаковую пропускную способность для FP16 по сравнению с FP32 (возможно, просто конвертируете на лету практически бесплатно), но на чипах SKL / KBL вы получаете примерно вдвое большую пропускную способность FP32 для GPGPU Mandelbrot (обратите внимание на масштабирование журнала на ось Mpix/s диаграммы в этой ссылке).
Коэффициент усиления в FP64 (double
) производительность тоже была огромной.
Но на ядрах IA (Intel-Architecture) нет; даже с AVX512 нет никакой аппаратной поддержки, кроме как конвертировать их.
Конечно, вы могли бы реализовать программную плавающую точку, возможно, даже в SIMD-регистрах, так что технически ответ на вопрос, который вы задали, все еще "да", но он не будет быстрее, чем при использовании F16C. VCVTPH2PS
/ VCVTPS2PH
инструкция + упакованный сингл vmulps
/ vfmadd132ps
HW поддержка.
Так что технически да, но не в полезной форме, за исключением GPGPU. Используйте HW-поддерживаемое преобразование SIMD в / из float
/ __m256
в коде x86.
Если вы используете все ядра, я бы подумал, что во многих случаях вы по-прежнему ограничены пропускной способностью памяти, и с плавающей запятой половинной точности будет выигрыш.