Есть ли в ядре Linux собственный контекст SSE/AVX?

Есть ли в ядре Linux собственный контекст SSE/AVX?

Я имею в виду, с точки зрения модуля ядра, могу ли я использовать инструкции SSE/AVX, не беспокоясь о приложениях пользовательского пространства, которые тоже могут их использовать? Или мне нужно использовать какие-то блокировки или делать сохранение контекста вручную?


person Ilya Matveychikov    schedule 03.09.2013    source источник
comment
Интересно, почему закрытое голосование? Это кажется правильным и полезным вопросом.   -  person Paul R    schedule 03.09.2013
comment
Возможный дубликат: stackoverflow.com/q/6227603/1401351. В частности, посмотрите ресурс, связанный с ответом на этот вопрос: раздел 6.3 agner.org/optimize/calling_conventions. .pdf   -  person Peter    schedule 03.09.2013
comment
Ребята, мне нужно знать, можно ли использовать инструкции AVX от LKM. Ни одна из этих ссылок не говорит мне об этом. И я тоже не ищу соглашения о вызовах.   -  person Ilya Matveychikov    schedule 03.09.2013
comment
Вы не читали документ? В нем говорится: Драйвер устройства, которому необходимо использовать векторные регистры, должен сначала сохранить эти регистры, вызвав функцию kernel_fpu_begin(), и восстановить регистры, вызвав kernel_fpu_end() перед возвратом или переходом в спящий режим. Есть и другие, например, тот факт, что вы вообще не можете использовать их в контексте прерывания. Краткий ответ: Да, можете. Длинный ответ: Но есть ограничения. Прочтите документ!   -  person Peter    schedule 03.09.2013
comment
@Peter Это был бы прекрасный ответ.   -  person CL.    schedule 03.09.2013
comment
@CL Спасибо, я просто немного расширил комментарий до ответа.   -  person Peter    schedule 03.09.2013


Ответы (1)


Ядро Linux по умолчанию не сохраняет FPU или векторные регистры, чтобы повысить скорость переключения контекста. Тем не менее, вы можете использовать их при определенных обстоятельствах.

Раздел 6.3 документа http://agner.org/optimize/calling_conventions.pdf очень хорошо описывает использование векторных регистров в режиме ядра, как в Windows, так и в Linux. Вот одна важная цитата:

Драйвер устройства, которому необходимо использовать векторные регистры, должен сначала сохранить эти регистры, вызвав функцию kernel_fpu_begin(), и восстановить регистры, вызвав kernel_fpu_end() перед возвратом или переходом в спящий режим.

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

person Peter    schedule 03.09.2013
comment
Большое спасибо за ответ :) - person Ilya Matveychikov; 03.09.2013