Арифметика с плавающей точкой половинной точности на чипах 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.

Если вы используете все ядра, я бы подумал, что во многих случаях вы по-прежнему ограничены пропускной способностью памяти, и с плавающей запятой половинной точности будет выигрыш.

Другие вопросы по тегам