1

C などの言語で記述する場合、理論的には、コンパイラは人間が読み取れるコードを取得し、それをマシン コード (比較的ハードウェアに依存するアトミック命令) に変換します。各 CPU アーキテクチャには、何らかのハードワイヤードな方法で CPU 用に実装された命令セットがあるようですが、異なる CPU は同じ ISA を異なる方法で実装できるようです (x86 など)。

これは、ISA が本質的にハードウェアの抽象化レイヤーとして機能するということですか? x86 は言う: これらは私が提供する標準的な命令です - ハードウェアがどのようにそれを行うかを知る必要はありません。

したがって、新しい CPU を構築し、x86 標準に準拠するように CPU を実装した場合、ハードウェアに固有のコンパイラを作成する必要はありませんが、C から x86 にコンパイルされたコンパイラはすべて、新しい CPU には ISA で十分でしょうか?

4

2 に答える 2

1

コンパイラは理論的には人間が読めるコードを受け取り、それをマシンコードに変換します

これはコンパイラが行うことだと思います。理論的ではありません。

命令セットの仕様を満たしている場合は、ハードウェアの実装を自由に選択できます。

命令セットには、実装を気にする必要のないビット精度の命令を CPU が実行する限り、ADD、SUBTRACT などの単純な命令が含まれる場合があります。実際、これは加算器の実装の複雑さを増してより高速なクロック速度を可能にすることでパフォーマンスを改善できる場所です。

于 2013-01-11T22:52:58.743 に答える
1

はい、x86 アーキテクチャは十分に文書化されており、抽象化レイヤーを形成しています。ただし、最適化コンパイラは、ロードと使用の遅延、ロードストア ユニットの数、計算ユニットの数とタイプ、キャッシュ サイズとキャッシュ ラインを理解していれば、より適切に実行できます。内部レジスタの数、一部のプロセッサは命令ストリームの並べ替えなどを行います。これらは実装固有のものです。

たとえば、古いプロセッサには整数乗算ユニットが 1 つしかなく、新しいプロセッサには 2 つある場合があります (非常に古いプロセッサには何もない場合があります。x86 ではありませんが、私はそのようなものを開発しました)。それらのタイプも異なる場合があります。これらの違いにより、最適化/コード生成における速度とスペースのトレードオフのバランスが変わるため、どちらが異なる命令シーケンスを使用するかを知る戦略になります。たとえば、大きな定数による乗算は、乗算命令を使用するとおそらく最短ですが、基になる実装によっては、いくつかのシフトおよび加算操作よりも遅くなったり速くなったりする可能性があります。そのため、コンパイラにはいくつかの選択肢があり、記述しているコードに関する多くの状態を追跡できるため、かなり複雑な決定戦略を使用できます。

もう 1 つの一般的な最適化戦略は、2 つ以上の異なる計算をインターリーブすることです。これにより、プロセッサをよりビジー状態に保つことができます。これを行うと、多くの場合、必要なレジスターの数が増加し、さらに多くの命令が必要になる場合があり、基礎となる実装によっては、さらに速くなるか、さらに長くなる可能性があります。

于 2013-01-11T22:53:12.463 に答える