Почему инструкции SIMD не используются в ядре?
Я не смог найти много использования инструкций SIMD (таких как SSE/AVX) в ядре (за исключением одного места, где они использовались для ускорения вычисления четности RAID6).
Q1) Есть какая-то конкретная причина для этого или просто отсутствие варианта использования?
Q2) Что нужно сделать сегодня, если я хочу использовать инструкцию SIMD, например, драйвер устройства?
Q3) Насколько сложно будет включить в ядро фреймворк, такой как ISPC (только для экспериментов)?
1 ответ
Сохранение / восстановление состояния FPU (включая векторные регистры SIMD) обходится дороже, чем просто состояние целочисленного регистра GP. Это просто не стоит затрат в большинстве случаев.
В коде ядра Linux все, что вам нужно сделать, это вызвать kernel_fpu_begin()
/ kernel_fpu_end()
вокруг вашего кода. Это то, что делают драйверы RAID. См. http://yarchive.net/comp/linux/kernel_fp.html.
У x86 нет будущего способа сохранить / восстановить один или несколько векторных регистров. (Кроме ручного сохранения / восстановления xmm
зарегистрируйтесь с использованием устаревших инструкций SSE, что может привести к остановке перехода SSE/AVX на процессорах Intel, если в пользовательском пространстве были загрязнены верхние половины любых регистров ymm/zmm).
Причина того, что устаревшие SSE работают, заключается в том, что некоторые драйверы Windows уже делали это, когда Intel хотела представить AVX, поэтому они изобрели этот штраф за переходный процесс вместо того, чтобы устаревшие инструкции SSE обнуляли верхние 128b регистров ymm. (См. Это для более подробной информации об этом проектном решении.) Таким образом, в основном мы можем обвинить только двоичные драйверы Windows в беспорядке штрафа с переходом SSE/AVX.
IDK о архитектурах, отличных от x86, и о том, есть ли в существующих наборах команд SIMD перспективный способ сохранения / восстановления регистра, который будет продолжать работать для более длинных векторов. ARM32 может, если расширения продолжают шаблон использования нескольких 32-битных регистров FP в качестве одного более широкого регистра. (например q2
состоит из s8
через s11
.) Так что сохранение / восстановление пары q
регистры должны быть ориентированы на будущее, если расширение NEON 256b просто позволяет вам использовать 2 q
регистрируется как один 256b регистр. Или, если новые более широкие векторы разделены и не расширяют существующие регистры.