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 解凍版のインストールとルートパスワードの変更に関するチュートリアル

推薦する

Zabbix は DingTalk のアラーム機能を画像付きで設定します

実装のアイデア:まず、アラーム情報にはitemidが必要です。これは前提条件です。情報に渡されるパラ...

MySQL 5.7.18 Green Edition のダウンロードとインストールのチュートリアル

この記事では、MySQL 5.7.18のグリーンバージョンをダウンロードしてインストールする詳細な手...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

HTML ヘッドタグの詳細な紹介

HTML のヘッド部分には、ブラウザによる Web ページのレンダリングや SEO などに関連するタ...

フロントエンドのパフォーマンス最適化を学習するための準備として、HTML ページのレンダリング プロセスを理解する (続き)

昨夜、ブラウザのレンダリングプロセスに関するエッセイを書きましたが、小さなコードで説明しただけでした...

MySQL REVOKE でユーザー権限を削除する

MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...

JavaScript マウスイベントのケーススタディ

マウスイベントマウスが特定の操作を実行すると、イベント オブジェクトが生成され、イベントがトリガーさ...

Linux でプロセスを効果的に管理するための 8 つのコマンド

序文プロセス管理の役割:サーバーの健全性状態を判定する: プロセスの状態 (メモリ、CPU 占有率な...

HTML テーブル マークアップ チュートリアル (30): セルの暗い境界線の色属性 BORDERCOLORDARK

セルでは、暗い境界線の色を個別に定義できます。基本的な構文<TD ボーダーコロダーク=colo...

Linuxでのcrontabの使い方と注意点の詳しい説明

Crontab は定期的な実行を設定するために使用されるコマンドです。そのデーモン プロセスは cr...

Macでのファイル権限の表示と設定の詳細な説明

序文Mac システムのターミナルでファイルの権限を変更するには、Linux の chmod コマンド...

ウェブフロントエンド開発者が知っておくべき 9 つの実用的な CSS プロパティ

1. 角を丸くする今日の Web デザインは、常に最新の開発テクノロジーに追随しており、HTML5 ...

Html/Css (初心者が最初に読むべきガイド)

1. Web標準の意味を理解する - なぜWeb標準を採用するのか***** コンテンツとスタイル...

jsでライトスイッチの効果を実現

この記事の例では、ライトスイッチ効果を実現するためのjsの具体的なコードを参考までに共有しています。...

docker-maven-plugin の詳細な使用方法

目次Docker-Maven-プラグインMavenプラグインの自動デプロイメント手順1. ホストマシ...