現在、ほとんどの 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 解凍版のインストールとルートパスワードの変更に関するチュートリアル
最近、携帯電話で https が有効になりました。緑色のロックを取得するには、次の問題を解決する必要...
wangEditor は、JavaScript と CSS に基づいて開発された Web リッチ テ...
目次ミックスインの実装フック関数のマージプロジェクト実践伸ばす要約するVue は mixins AP...
方法1: var a = [1,2,3]; var b = [4,5] b を連結します。 コンソー...
node を D ドライブにインストールしましたが、C ドライブのスペースを占有したくなかったため、...
この記事では、ユーザーのログイン切り替えを実現するためのVueの具体的なコードを例として紹介します。...
Mysql マスタースレーブ サービスの実装例を構成する### メインデータベースmy.cnfを構成...
この記事では、参考までにMySQL 8.0.16のインストールと設定方法のグラフィックチュートリアル...
コードをコピーコードは次のとおりです。 <!--[IEの場合]><script t...
解決: <head> に次のコードを追加します。コードをコピーコードは次のとおりです。 ...
Dockerネットワーク管理とコンテナIP設定に基づいてNginxロードバランシングを実装するすべて...
今日は、CSS を使用して左上の三角形を記述するいくつかの方法を紹介します。概略図(幅と高さを60p...
ウェブサイトを作成している際に、flv や MP4 形式などのビデオ ファイルはローカルでは正常に再...
導入Binlog ログ、つまりバイナリ ログ ファイルは、データベースに対するユーザー操作の SQL...
この記事では、クリックするとランダムグラフィックの生成を実現するJavaScriptの具体的なコード...