FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

「How to Design ISA」を読む

SNS界隈で少し話題になっていた記事、「How to Design ISA」を読んでみた。

https://queue.acm.org/detail.cfm?id=3639445

要点を以下にまとめてみた。

  • ISAの役割と重要性: ISAはコンパイラとマイクロアーキテクチャ間の「共通言語」であり、コンパイラの中間言語と多くの共通点がある。

  • 汎用ISAの存在しない: 特定のソース言語やマイクロアーキテクチャの種類に効率的なISAを設計する必要がある。例えば、C言語、CUDA、Erlangは異なるマシンで動作し、これらすべてを効率的にサポートする一般目的ISAは存在しない。

  • ビジネスと技術の関連性: ISAの安定性はビジネス上の問題であり、技術的な問題だけでない。安定したISAはソフトウェアエコシステムを育成しやすい。

  • アーキテクチャの重要性: ISAの重要性を強調し、マイクロアーキテクチャよりも性能に大きな影響を与えることがある。優れたISAを設計するほうが、優れたマイクロアーキテクチャを設計するよりもずっと安上がりである。

  • 小型コアと大型コアの要求: 小型の単一発行のインオーダ・コアはデコーダの複雑さやコードの小ささを重視するのに対し、大型のコアはレジスタのリネーミングや複雑なアドレスモードなど、他の要因が支配的になる。

  • 純粋主義への挑戦: 効率的なISAは常に妥協の産物であり、特定の命令や機能がそのISAの設計に大きな影響を与える可能性がある。

    • 例えばRISC-VのJump & Link命令やスタックポインタの特殊な操作命令など。これが全体的なハードウェア構成に影響を与える可能性がある。
    • RISC-V のJump&Link命令はリンクレジスタとして任意のレジスタを取り扱うことができる。これにより、ABIの制約に関わらない柔軟なISAを設計しようとしたようだが、結果的にABIに最適化されたマイクロアーキテクチャではこの柔軟性は失われてしまう。
    • スタックポインタにおいても同様に、ARMなどでは専用命令を持っているが、RISC-Vではすべて汎用な命令上でスタック操作を行うように設計されており、特定の最適化が阻まれる。
    • デコードの幅も重要。Apple M2の固定幅の命令長に対して、x86-64は非常にデコードの負荷が大きい。
  • 異なるソース・プログラミング言語の扱い: 新しいISAは広く採用されるまでに時間がかかることがあり、効率的なエミュレーションのターゲットとして設計されることが重要である。

    • 例えば、AppleのRosetta 2がx86-64命令をAArch64命令に変換する際、AppleはTSOモデルを独自に導入し、変換時の障害を最小化している。RISC-VでもTSOはオプションとして導入されている。
    • x86の多くの命令はフラグを設定し、AArch64ではこれをエミュレーションするために、x86と同様のフラグセットを持ち、フラグ設定命令を1〜2の命令に変換できる。
    • RISC-Vには条件コードが存在しないが、これはx86-64のエミュレーションにおいて重要である。条件分岐に基づくゼロのテストなどは、C/C++コードで非常に一般的であり、これを効率的に行うためのISAの設計が重要であることを示している。
  • 測定の重要性: ISAの設計やISAの機能の決定が異なるマイクロアーキテクチャでどのように機能するかをシミュレーションして確認することが重要である。