現在、ほとんどの CPU は浮動小数点ユニット (FPU) をサポートしています。FPU は、プロセッサ コアの外部に独立したコプロセッサとして配置されます。ただし、組み込みプロセッサでは浮動小数点演算はほとんど使用されないため、一部の組み込みプロセッサでは浮動小数点コプロセッサが削除されています。 X86 プロセッサには通常 FPU が搭載されています。ただし、ARM PPC MIPS プロセッサには FPU がありません。 Linux カーネルが浮動小数点演算を処理する方法については、FPU のあるプロセッサとないプロセッサの観点から説明できます。 (以下は私の個人的な知識のまとめです。あまり調べたわけではありません。間違いがあれば指摘していただき、一緒に学んでいただければ幸いです。) 1. FPU搭載プロセッサの場合 1 Linux カーネルの場合、カーネル自体はデフォルトで -msoft-float オプションでコンパイルされ、デフォルトでソフト浮動小数点プログラムとしてコンパイルされます。ソフト浮動小数点とは、gcc コンパイラが浮動小数点演算 (glibc ライブラリによって提供) をシミュレートし、浮動小数点演算コードを固定小数点演算に置き換えることを意味します。 FPU を搭載したプロセッサの場合、通常は arch/xxx/Makefile にあるコンパイル オプション -msoft-float を削除できます。カーネルをハード浮動小数点としてコンパイルする、つまりプロセッサの浮動小数点命令で浮動小数点を計算させる。 ハード浮動小数点演算は、シミュレートされた固定小数点演算よりも確実に効率的です。 (カーネルコードには通常浮動小数点演算がないので、効率は大きく影響を受けません) 2 カーネル上で実行されるアプリ、特に浮動小数点演算を多く含む QT などのグラフィックス プログラムの場合、プロセッサが浮動小数点演算と浮動小数点演算命令をサポートしているため、直接コンパイルできます。 2. FPUのないプロセッサの場合 1 Linux カーネルの場合、コンパイル時にデフォルトで -msoft-float オプションが使用され、プログラムはデフォルトでソフト浮動小数点プログラムとしてコンパイルされます。Linux カーネルのコンパイルはライブラリのリンクに依存せず、カーネルは対応するシミュレートされた浮動小数点 ABI を実装します。 2 カーネル上で実行されるアプリの場合、浮動小数点演算を処理する方法は 2 つあります。 (1)カーネルはソフト浮動小数点をシミュレートします。 アプリケーションは、ハード浮動小数点を使用して直接コンパイルされます (コンパイラは、デフォルトでハード浮動小数点プログラムにコンパイルします)。 カーネルに関しては、私が知っている PPC MIPS プロセッサはすべて、特別な浮動小数点演算例外処理を備えています。プログラムが浮動小数点命令に遭遇し、浮動小数点命令を実行できない場合、ハードウェアは対応する割り込み例外を生成します。カーネル浮動小数点例外ハンドラは、命令の内容に基づいてソフト浮動小数点シミュレーション演算を実行し、演算結果を返してから、実行をユーザー空間に戻します。 ARM の場合、例外導入で浮動小数点計算の例外エントリは見つかりませんでしたが、カーネルはソフト浮動小数点もサポートしています。 ARM Linux カーネルを構成する場合、次の構成が表示されます。 メニュー「浮動小数点エミュレーション」 コメント「少なくとも 1 つのエミュレーションを選択する必要があります」 設定 FPE_NWFPE ... これは、カーネル内のシミュレートされた浮動小数点プロセッサを構成するために使用されます。 ARM が例外シミュレーション ソフト浮動小数点のサポートをどのように実装するかについては、時間があるときに arch/arm/nwfpe のコードで具体的な実装を注意深く読む必要があります。 この方法の利点は、アプリケーションを再コンパイルする必要がなく、カーネル内で浮動小数点シミュレーションをオンにするだけで済むため、非常に便利であることです。 しかし、欠点も明らかです。浮動小数点演算ごとに割り込み例外がトリガーされ、ユーザー空間とカーネル空間が切り替わり、実行効率が低すぎます。 (2)ソフト浮動小数点を使用してアプリを再コンパイルする これにより、上記の問題を回避できます。アプリをコンパイルするときに、glibc ライブラリに接続する必要があります。--msoft-float を使用して、固定小数点演算の代わりに glibc のシミュレートされた浮動小数点を使用します。これの利点は、実行パフォーマンスが向上することです。 しかし、欠点は、異なるコンパイルオプションの使用により、使用されるABIが変わる可能性があることです。ライブラリまたはアプリケーションが同じコンパイルオプション(異なるABI)を使用しない場合、 システムの実行中に予期しない状況が発生し、クラッシュする可能性もあります。 PPC プロセッサの最近のデバッグ記録によると、カーネルは正常に起動し、コンソールに入りましたが、特定のアドレスで停止しました。ユーザー空間には浮動小数点演算が多数ありました。IC を照会したところ、FPU が削除され、プロセッサの浮動小数点例外が有効になっていないことが判明しました。 この方法では、浮動小数点命令に遭遇しても、プロセッサは例外をトリガーせず、命令の実行方法を認識できません。 したがって、カーネルを移植するときには、プロセッサに FPU があるかどうかも理解する必要があります。プロセッサが FPU を削除し、コアが対応する処理を実行しない場合 (浮動小数点例外を有効にする)、APP の浮動小数点命令の結果は予測できません。この場合、ソフト浮動小数点ツール チェーンを使用して APP をコンパイルできます。 ちょっとした考えです: プロセッサの場合、プロセッサ設計に浮動小数点例外がある場合 (MIPS PPC には両方に浮動小数点例外があります)、FPU に接続することもできます。 FPU に接続した後、浮動小数点例外はプロセッサ コアでシールドされる必要があります。そうしないと、浮動小数点演算によって依然として浮動小数点例外が生成され、FPU は実質的に意味を持たなくなります。 FPU がない場合、プロセッサ コアで浮動小数点例外を有効にする必要があります。そうしないと、上記で発生した問題と同じ問題が発生します。プロセッサは浮動小数点命令の実行方法を知らないため、結果は予測できません。 Linux カーネルの浮動小数点演算サポートに関する上記の簡単な説明が、私が皆さんにお伝えしたいことのすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM をサポートしていただければ幸いです。 以下もご興味があるかもしれません:
|
<<: WeChatアプレット+EChartsで動的更新プロセス記録を実現
>>: MySQL 5.7.20 解凍版のインストールとルートパスワードの変更に関するチュートリアル
現象: divを一定の振幅で円、楕円などに変更する方法: CSSのborder-radiusプロパテ...
境界範囲間のmysql間の範囲は両側の境界値を含む例: 3 から 7 までの id は、id >...
基本的な使い方 <!DOCTYPE html> <html lang="...
導入Vue Router 、 Vue.jsの公式ルーティング マネージャーです。 Vue.jsのコア...
1. HTMLタグは常に閉じる前のページのソース コードでは、次のような記述がよく見られます。 &l...
1. ユーザーを作成して承認するMySQL 8.0 では、ユーザーの作成と認証が以前とは異なります...
ウェブフロントエンド最適化のベストプラクティス: コンテンツWebフロントエンド最適化のベストプラク...
前のセクションでは、コンテンツ、サーバー、JavaScript、CSS など、Web サイトのパフォ...
次のような製品部品表があります。一部 部品ID 部品タイプ 製品ID ---------------...
目次1. テレポートの紹介1.1. 複数のテレポートを使用する2. テレポートを使用する理由3. テ...
スワップの紹介Linux のスワップ (スワップ パーティション) は、Windows の仮想メモリ...
理由は簡単です。 HTML ドキュメントでは、複数の空白文字は 1 つの空白文字と同等です。つまり、...
序文: Vue では、props を使用して、もともと分離されていたコンポーネントを直列に接続するこ...
この記事では、ボトムクエリ機能を実装するためのVueの具体的なコードを例として紹介します。具体的な内...
1. 前提条件JDKがインストールされましたecho $PATHソフトリンクを作成し、JDKのインス...