クロスコンパイルはネイティブコンパイルよりも高速ですか?

クロスコンパイルはネイティブコンパイルよりも高速ですか?

armベース(arm_v8-64、ubuntu20.04)ターゲットマシンとamdベースのホスト(x86_64、ubuntu20.04)があります。

ホストのCPUがターゲットのCPUよりもはるかに強力なので、クロスコンパイルがネイティブコンパイルよりも高速になる可能性があるかどうか疑問に思います。これは、真のクロスコンパイル環境(QEMUなどのエミュレータではなく、すべてのarm-libsをコピーしてそのツールチェーンを使用するなど)に基づいていることを意味します。

答え1

はい、クロスコンパイルは通常、遅いホストでデフォルトでコンパイルするよりも高速です。プログラムがx86でデフォルトでビルドされるのに約1分かかる場合は、x86マネージドクロスコンパイラを使用して1分以内に別のターゲットにクロスコンパイルされると予想できます。

答え2

クロスコンパイルのオーバーヘッドもほとんどありません。ホストクロスコンパイルは、基本的に通常の[クロスクロス]コンパイルと同じことを行います。

...高電力クロスコンパイルホストは通常​​、低電力ホストよりはるかに高速です。

なぜ?

コンパイラの仕組み

私が覚えている限り、2005年の大学では、コンパイラが次の手順を実行することを学びました。

  • 前処理 -#inclide均等化
  • トークンストリームの解析 - ソースコードを単語と演算子ストリームに分割します。
  • セマンティック解析 - 例:変数名を一緒に連結する
  • 翻訳 - 意味ツリーを抽象プログラムに変換
  • タイリング - 特定のアーキテクチャ用の抽象プログラムを作成するために一緒にグループ化されるCPU操作を選択します。
  • 接続 - プログラムユニットは、パッチされた相互参照メモリアドレスで互いに接続されます。

アーキテクチャ固有の最適化は複数のステップで実行できますが、ワークフローは基本的に同じです。

「タイリング」を理解することが重要です。抽象プログラムは、プログラムの最も原子的な形式ですが、通常はアーキテクチャとは独立しています。 CPU命令は、単一命令(RISC命令セットでも)で複数の操作を実行することがよくあります。タイリングは、同じプログラムを抽象プログラムとして記述するために一緒にグループ化されるアーキテクチャ指令を選択します。

なぜか私はいつもテトリスのようなタイルを想像しました。

クロスコンパイラはどう違いますか?

コンパイラ自体はコンパイルされたプログラムであることを覚えておいてください。

クロスコンパイラの定義は、単にタイリング自体がタイリングするのとは異なる命令セットを使用するコンパイラです。

したがって、x86_64->ARM クロスコンパイラは、ARM->ARM コンパイラとほぼ同じ抽象プログラムを実行します。

  • x86 ホスト用の x86 プログラムのコンパイルと ARM プログラムのコンパイルの違いは、タイリング時にコンパイラが使用する一連の命令です。
  • x86 ホストで ARM プログラムをコンパイルすることと ARM ホストで ARM プログラムをコンパイルすることの違いは、コンパイラが別の命令セットを使用することです。

コンパイル時に本当に重要なことは何ですか?

したがって、重要なのは、ビルドマシンのアーキテクチャではなく、マシンの生のCPUとメモリ機能です。

関連情報