Linux 커널에서 부동 소수점 사용


84

나는 Robert Love의 "Linux Kernel Development"를 읽고 있는데, 다음 구절을 보았습니다.

(쉬운) 부동 소수점 사용 없음

사용자 공간 프로세스가 부동 소수점 명령어를 사용할 때 커널은 정수에서 부동 소수점 모드로의 전환을 관리합니다. 부동 소수점 명령어를 사용할 때 커널이해야하는 일은 아키텍처에 따라 다르지만 커널은 일반적으로 트랩을 포착 한 다음 정수에서 부동 소수점 모드로 전환을 시작합니다.

사용자 공간과 달리 커널은 쉽게 자체적으로 트랩 할 수 없기 때문에 부동 소수점을 완벽하게 지원하지 못합니다. 커널 내에서 부동 소수점을 사용하려면 다른 가능한 작업 중에서 부동 소수점 레지스터를 수동으로 저장하고 복원해야합니다. 짧은 대답은 : 하지 마십시오! 드문 경우를 제외하고는 커널에 부동 소수점 연산이 없습니다.

나는 이러한 "정수"및 "부동 소수점"모드에 대해 들어 본 적이 없습니다. 정확히 무엇이며 왜 필요한가요? 이 구별이 주류 하드웨어 아키텍처 (예 : x86)에 존재합니까, 아니면 좀 더 이국적인 환경에 특정한 것입니까? 프로세스와 커널의 관점에서 정수에서 부동 소수점 모드로의 전환은 정확히 무엇을 수반합니까?



2
이 책은 "모드"에 대해 이야기함으로써 문제를 약간 혼동합니다. 정수 명령어는 항상 사용할 수 있지만 FPU는 전체적으로 또는 부분적으로 비활성화 할 수 있습니다. 예를 들어 모든 제어 명령은 "정수"로 간주됩니다. 자세한 내용은 아래를 참조하십시오.
DigitalRoss 2012

@DigitalRoss : 용어에 동의합니다. 답변 BTW에 감사드립니다.
NPE

커널에서 부동 소수점 연산을 수행하려는 욕구가 무엇인지 아는 것이 흥미로울 것입니다. 커널 외부에서 수행해야하는 작업을 커널에서 수행하려는 의미에서 "나쁜 디자인"이라고 말하고 싶은 유혹이 있지만, FPU를 활용하는 것이 혁신적인 솔루션이 될 때 커널이 진정으로 수행해야하는 작업이 있습니까?
Chris Stratton

2
아무도 그것을 언급하지 않기 때문에 커널 내부 FP (또는 SIMD)를 사용하는 경우, 당신이 호출 할 필요가 kernel_fpu_begin()/ kernel_fpu_end()전 / 코드 후 확인 사용자 공간 FPU 상태를 만들기 위해 손상되지 않습니다. 이것이 Linux의 md코드가 RAID5 / RAID6에서하는 일입니다.
Peter Cordes

답변:


86

때문에...

  • 많은 프로그램은 부동 소수점을 사용하지 않거나 주어진 시간 조각에서 사용하지 않습니다.
  • FPU 레지스터 및 기타 FPU 상태를 저장하는 데는 시간이 걸립니다. 따라서

... OS 커널은 단순히 FPU를 끌 수 있습니다. Presto, 저장 및 복원 할 상태가 없으므로 컨텍스트 전환이 더 빠릅니다. (이것은 모드 가 의미하는 바이며 FPU가 활성화되었음을 의미합니다.)

프로그램이 FPU 작업을 시도하면 프로그램은 커널에 트랩하고 커널은 FPU를 켜고 이미 존재할 수있는 저장된 상태를 복원 한 다음 FPU 작업을 다시 실행하기 위해 돌아갑니다.

컨텍스트 전환 시간에 실제로 상태 저장 로직을 거치는 것을 알고 있습니다. (그런 다음 FPU가 다시 꺼질 수 있습니다.)

그건 그렇고, 커널 (Linux뿐만 아니라)이 FPU 작업을 피하는 이유에 대한 책의 설명이 완벽하게 정확하지 않다고 생각합니다. 1

커널 자체적으로 트랩 할 수 있으며 많은 일을합니다. (타이머, 페이지 오류, 장치 인터럽트 등) 실제 이유는 커널에 특별히 FPU 작업이 필요 하지 않고 FPU 가없는 아키텍처에서도 실행되어야하기 때문입니다. 따라서 항상 다른 소프트웨어 솔루션이있는 작업을 수행하지 않음으로써 자체 FPU 컨텍스트를 관리하는 데 필요한 복잡성과 런타임을 피할 수 있습니다.

커널이 FP를 사용하려는 경우 FPU 상태를 얼마나 자주 저장해야하는지 주목하는 것은 흥미 롭습니다 . . . 모든 시스템 호출, 모든 인터럽트, 커널 스레드 간의 모든 전환. 가끔 커널 FP가 필요하더라도 2 소프트웨어에서 수행하는 것이 더 빠를 것입니다.


1. 즉, 완전히 잘못되었습니다.
2. 커널 소프트웨어에 부동 소수점 산술 구현이 포함 된 경우가 몇 가지 있습니다 . 일부 아키텍처는 하드웨어에서 기존 FPU 작업을 구현하지만 일부 복잡한 IEEE FP 작업은 소프트웨어에 맡깁니다. (생각 : 비정상적인 산술) 어떤 이상한 IEEE 코너 케이스가 발생하면 트랩 할 수있는 ops의 pedantically 정확한 에뮬레이션을 포함하는 소프트웨어로 트랩합니다.


16

일부 커널 설계에서는 "커널"또는 "시스템"작업이 작업 전환 될 때 부동 소수점 레지스터가 저장되지 않습니다. (이것은 FP 레지스터가 크고 저장하는 데 시간과 공간이 모두 걸리기 때문입니다.) 따라서 FP를 사용하려고하면 값이 임의로 "푸핑"됩니다.

또한 일부 하드웨어 부동 소수점 체계는 트랩을 통해 "홀수"상황 (예 : 0 분할)을 처리하기 위해 커널에 의존하며 필요한 트랩 메커니즘은 현재 실행중인 커널 작업보다 더 높은 "레벨"에있을 수 있습니다.

이러한 이유로 (및 몇 가지 더) 일부 하드웨어 FP 체계는 작업에서 처음으로 FP 명령을 사용할 때 트랩됩니다. FP를 사용하도록 허용 된 경우 작업에서 부동 소수점 플래그가 켜지고 그렇지 않은 경우 발사대에 의해 총에 맞습니다.


Linux에서는 코드 앞 / 뒤에 kernel_fpu_begin()/ kernel_fpu_end()를 사용 하여 사용자 공간 FPU 상태의 저장 / 복원을 트리거합니다 (그리고 선점에 대한 커널 FPU 상태를 추측합니다).
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.