Это правильно
Нет, абсолютно не делайте этого. Эти опции сообщают G CC, что он может использовать инструкции SIMD / FP где угодно в этом модуле компиляции, включая до kernel_fpu_begin()
или после kernel_fpu_end()
, или в функциях, которые никогда не вызывают kernel_fpu_begin()
.
, например, он может генерировать нагрузку movdqu
или сохранить для копирования 16 байтов структуры и поврежденное состояние регистра XMM в пространстве пользователя до того, как kernel_fpu_begin
сохранит его.
и оптимизирует FP / SIMD-код?
Нет, код ядра, использующий kernel_fpu_begin()
, также использует встроенный asm для запуска инструкций SIMD. Это будет выдавать инструкции SIMD без никакой помощи от компилятора.
Или теоретически некоторый код ядра может использовать атрибут функции, такой как __attribute__((target("sse2")))
, или что-то подобное для вспомогательной функции, вызываемой изнутри. kernel_fpu_begin()
/ end
блок. Но я думаю, что Linux предпочитает встроенный asm вместо этого плюс встроенную или автоматическую векторизацию.
Ядро не потрудится включить вызовы kernel_fpu_begin()
/ end
, если оно получит нулевую выгоду из него . Кстати, вы можете разобрать соответствующие модули ядра .ko
и увидеть, что они на самом деле содержат SIMD-инструкции, которые используют регистры XMM. Используйте objdump -drwC -Mintel foo.ko