Linuxカーネルの浮動小数点演算のサポートに関する簡単な説明

Linuxカーネルの浮動小数点演算のサポートに関する簡単な説明

現在、ほとんどの 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 をサポートしていただければ幸いです。

以下もご興味があるかもしれません:
  • Linux システムに gcc と kernel-devel をインストールする方法
  • カーネルが提供するインターフェースを使用してプロセス番号(pid)を出力します。
  • Linuxカーネルで関数呼び出しスタックを出力する方法についての簡単な説明
  • Linuxカーネルで関数ポインタに対応する関数名を出力する方法
  • NEONを使用してカーネル状態のアルゴリズムを高速化する方法を学ぶ
  • Ubuntu の kvm コマンドラインで 64 ビット Ubuntu をインストールするときに発生する「Ubuntu ツリーの hvm カーネルが見つかりません。」という問題の分析
  • CentOS7 カーネル カーネル5.0 バージョンアップグレード
  • LinuxカーネルとSVNバージョン間の競合の解決策

<<:  WeChatアプレット+EChartsで動的更新プロセス記録を実現

>>:  MySQL 5.7.20 解凍版のインストールとルートパスワードの変更に関するチュートリアル

推薦する

IMG での UserMap の使用例

usemap は <img> タグの属性であり、使用するイメージ マップの名前を指定する...

MySQLのデッドロックチェック処理の通常の方法

通常、デッドロックが発生すると、重みが最も小さい接続が強制終了され、ロールバックされます。ただし、最...

Intellij IDEA による Docker イメージの展開方法の手順の迅速な実装

目次1. Dockerはリモートアクセスを可能にする2. Intellij IDEAにDockerプ...

初めてDockerイメージを構築、実行、公開、取得するための詳細な手順

1. はじめに以前は、Python アプリケーションの作成を開始したい場合、最初のステップはマシンに...

Vueタイムラインコンポーネントの使い方

この記事の例では、参考までにvueタイムラインコンポーネントの具体的な実装コードを共有しています。具...

Typescript の as、疑問符、感嘆符の詳細な説明

1. asキーワードはアサーションを示すTypescript では、アサーションを表現する方法が 2...

Zookeeper&Kafka クラスターを構築するための Docker の実装

最近Kafka勉強しています。クラスタの状態をテストする準備をしていたときに、仮想マシンを 3 つ開...

Alibaba Cloud Serverにプログラムをデプロイし、ドメイン名を使用して直接アクセスする方法の詳細な説明

何もすることがなかったので、学習用に最も安いAlibaba Cloudサーバーを購入しました。年間3...

SELINUXの動作原理の詳細な説明

1. はじめにSELinux が Linux にもたらす主な価値は、柔軟で構成可能な MAC メカニ...

CentOS8 - bash: 文字化けとその解決方法

この状況は通常、中国語言語パックがインストールされていないか、デフォルトの言語設定に問題があるために...

ARGB、RGB、RGBAの違いと紹介

ARGB は、アルファ (透明度) チャネルが追加された RGB カラー モードであり、32 ビット...

UDP 接続オブジェクトの原理分析と使用例

以前、UDP を使い始めるために簡単な UDP サーバーとクライアントの例を作成しましたが、実際に使...

上位Nを見つけるためのMySQLグループソートの詳細な説明

MySQLグループソートで上位Nを見つけるテーブル構造grp でグループ化し、num で並べ替えて、...

CSS3 のボックス サイズ設定 (コンテンツ ボックスとボーダー ボックス) の詳細な説明

CSS3 のボックス サイズ設定 (content-box と border-box) CSS3 の...

MySQL の int、char、varchar のパフォーマンスを比較する

インターネットには、真実のように見える「噂」がたくさんあります。もちろん、悪意のあるものではありませ...