Linuxカーネルでの浮動小数点の使用


83

RobertLoveの「LinuxKernelDevelopment」を読んでいて、次の文章に出くわしました。

浮動小数点の(簡単な)使用なし

ユーザースペースプロセスが浮動小数点命令を使用する場合、カーネルは整数モードから浮動小数点モードへの遷移を管理します。浮動小数点命令を使用するときにカーネルが実行する必要があることはアーキテクチャによって異なりますが、カーネルは通常、トラップをキャッチしてから、整数モードから浮動小数点モードへの移行を開始します。

ユーザースペースとは異なり、カーネルはそれ自体を簡単にトラップできないため、浮動小数点をシームレスにサポートするという贅沢はありません。カーネル内で浮動小数点を使用するには、他の可能な雑用の中でも、浮動小数点レジスタを手動で保存および復元する必要があります。簡単な答えは:それをしないでください!まれな場合を除いて、カーネルには浮動小数点演算はありません。

これらの「整数」モードと「浮動小数点」モードについては聞いたことがありません。それらは正確には何であり、なぜそれらが必要なのですか?この違いは、主流のハードウェアアーキテクチャ(x86など)に存在しますか、それともいくつかのよりエキゾチックな環境に固有ですか?プロセスとカーネルの両方の観点から、整数モードから浮動小数点モードへの移行には正確に何が必要ですか?



2
この本は「モード」について話すことによって問題を少し混乱させます。整数命令は常に使用可能ですが、FPUは完全にまたは部分的に無効にすることができます。完全にFPopsで構成された有用な機能はありません。たとえば、すべての制御命令は「整数」と見なされます。詳細については、以下を参照してください。
DigitalRoss 2012

@DigitalRoss:用語については同意します。ところで答えてくれてありがとう、それは物事を明確にしました。
NPE 2012

カーネルで浮動小数点演算を実行したいという願望が何から生じているのかを知ることは興味深いでしょう。カーネル内で何かを実行しようとするという意味で「貧弱な設計」と言いたくなりますが、FPUを活用することが革新的なソリューションとなる場合、カーネルが本当に実行すべきことがあるのではないでしょうか。
クリス・ストラットン2012

2
誰もがそれを言及していないので、あなたはカーネル内部でFP(またはSIMD)を使用している場合、あなたは呼び出す必要がありますkernel_fpu_begin()/kernel_fpu_end()あなたのコードの後/前に、ユーザ空間のFPU状態が破損していないことを確認します。これは、LinuxのmdコードがRAID5 / RAID6に対して行うことです。
ピーターコーデス2017年

回答:


86

なぜなら...

  • 多くのプログラムは浮動小数点を使用しないか、特定のタイムスライスで使用しません。そして
  • FPUレジスタおよびその他のFPU状態の保存には時間がかかります。したがって、

... OSカーネルは単にFPUをオフにする場合があります。Presto、保存および復元する状態がないため、コンテキストの切り替えが高速になります。(これはモードの意味であり、FPUが有効になっていることを意味します。)

プログラムがFPU操作を試みると、プログラムはカーネルにトラップし、カーネルはFPUをオンにし、すでに存在する可能性のある保存状態を復元してから、FPU操作を再実行するために戻ります。

コンテキストスイッチ時に、実際に状態保存ロジックを通過することを認識しています。(その後、FPUが再びオフになる場合があります。)

ちなみに、LinuxだけでなくカーネルがFPU操作を回避する理由についての本の説明は...完全に正確ではないと思います。1

カーネルそれ自体にトラップすることができ、多くのことに対してそうします。(タイマ、ページフォルト、デバイス割り込み、他の人。)本当の理由は、カーネルは特にないということである必要があるFPUのOPSをしても、すべてのFPUなしのアーキテクチャ上で実行する必要があります。したがって、他のソフトウェアソリューションが常に存在する操作を実行しないことで、独自のFPUコンテキストを管理するために必要な複雑さとランタイムを回避するだけです。

カーネルがFPを使用したい場合、FPU状態を保存する必要がある頻度に注意するのは興味深いことです。。。すべてのシステムコール、すべての割り込み、カーネルスレッド間のすべての切り替え。たまにカーネルFPが必要だったとしても、2ソフトウェアでそれを行う方がおそらく速いでしょう。


1.つまり、完全に間違っています。
2.カーネルソフトウェアに浮動小数点演算の実装が含まれている場所について私が知っているいくつかのケースがあります 一部のアーキテクチャは、ハードウェアに従来のFPU opsを実装しますが、複雑なIEEEFP操作はソフトウェアに任せます。(考えてみてください:非正規化数。) 奇妙なIEEEコーナーケースが発生すると、トラップできるopsの正確なエミュレーションを含むソフトウェアにトラップされます。


16

一部のカーネル設計では、「カーネル」または「システム」タスクがタスクスイッチアウトされたときに浮動小数点レジスタが保存されません。(これは、FPレジスタが大きく、保存に時間とスペースの両方がかかるためです。)したがって、FPを使用しようとすると、値がランダムに「プーフ」になります。

さらに、一部のハードウェア浮動小数点スキームは、トラップを介して「奇妙な」状況(ゼロ除算など)を処理するためにカーネルに依存しており、必要なトラップメカニズムはカーネルタスクが現在実行しているよりも高い「レベル」にある場合があります。

これらの理由(およびその他のいくつかの理由)により、タスクで初めてFP命令を使用するときに、一部のハードウェアFPスキームがトラップされます。FPの使用が許可されている場合は、タスクで浮動小数点フラグがオンになります。そうでない場合は、銃殺隊に撃たれます。


Linuxの場合、使用kernel_fpu_begin()/kernel_fpu_end()前/トリガーにあなたのコードは、保存後/ユーザ空間のFPU状態の復元(と私は、プリエンプションに対するカーネルFPU状態の推測)。
ピーターコーデス2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.