プログラミング
Kraidは今や本物のコンパイラになった
Kraid is a now a real compiler (collabora.com)
要約
Collaboraが開発中のPanfrostドライバスタック向け新コンパイラ「Kraid」が、Vulkan CTSの全80万テストをパスするという大きなマイルストーンを達成しました。これは、従来のコンパイラが失敗するテストも含まれており、Kraidが実用的なコンパイラとなったことを示しています。ただし、現在はコンピュートシェーダーのみに対応しており、頂点シェーダーとフラグメントシェーダーはまだ開発途上です。
全文翻訳
前回Kraidについて書いたとき、Panfrostドライバスタックのために開発中の新しいコンパイラで、Vulkan CTSの単一テストをようやくパスしたことが大きなニュースでした。今日、大きなニュースは、それが今や80万ものテストすべてをパスしたことです。これには、古いコンパイラが失敗するテストもいくつか含まれています。Kraidは今や本物のコンパイラです。
ただし、興奮するのはまだ早いです。私たちはまだ完了から程遠いところにいます。100%のパス率は、コンピュートシェーダーのみがKraidを通過した場合のものです。頂点シェーダーとフラグメントシェーダーはまだ作業中です。数週間以内にはそれらが動作するようになることを期待していますが、まだ実装されていません。
また、生成されるコードの品質はまだかなり低いです。これはKraidの設計上の問題ではなく、戦略的な選択でした。レジスタアロケータに悪い割り当て判断をさせることは、レジスタ圧力がタイトになり、アロケータが良い判断を下せなくなった場合に発生する、コンパイラの残りの部分のバグを特定するのに役立ちます。
しかし、重要なのは、それを良くするためのすべてのツールが整ったことです。新しいコンパイラに対する要件チェックリストのほぼすべての項目がチェックオフされました。Kraidは現在、以下の機能を持っています:
* 任意の固定予算内で割り当て可能なSSAベースのレジスタアロケータ
* ほぼ線形時間で実行され、常にプログラムを指定されたレジスタ数に収めることに成功するSSAベースのスプレイヤー
* 64ビット演算の適切な処理
* ソースでの整数および浮動小数点拡張演算の適切な処理
* すべての場所での完全で正確なスウィズルサポート
* 単語およびバイト粒度の両方でコピー伝播パスを実行でき、スウィズルやベクトル収集操作を透過的に認識します
* 16ビット宛先への完全なサポートと、8ビット宛先へのシームレスにエミュレートされたサポート。(ほとんどの命令は実際の8ビット宛先をサポートしていないため、16ビットを割り当てることでそれを偽装する必要があります。)
* 命令のエンコーディングおよび命令に関するメタデータは、Armハードウェアの単体テストから提供されるXMLから直接抽出され、命令の正確なセマンティクスに対する私たちの理解をハードウェアに対して検証します
これからどうなるか?
コンパイラを構築したので、次はそれを歌わせる番です。すべてのコアコンポーネントは整っています。今度はギアをシフトし、生成されるコードに目を向け、構築したツールを使って改善を試みる時です。まだ書くべき最適化パスがいくつかあり、レジスタアロケータは多くの微調整が必要で、ブーリアンと8ビットデータに関する戦略を洗練させる必要があります。
また、他の2つのシェーダー段階を完成させる必要があります。頂点シェーダーは非常に単純ですが、フラグメントシェーダーは少しトリッキーです。BLENDおよびATEST命令はレジスタ割り当てに影響を与え、ブレンドシェーダー自体は、BLENDが関数ポインタ呼び出しになる場合があるため、メインフラグメントシェーダーとブレンドシェーダーの間にABIを定義する必要があります。これにより、IRに多くの微妙なコーナーケースが追加され、まだ解決されていません。これらは特に根本的なものではありませんが、いくつかの設計作業が残っています。
うまくいけば、すぐにパフォーマンスの向上が見られるでしょう。Kraidはすでに64ビット演算において古いコンパイラよりも優れています。改善を続けるにつれて、ほとんどのワークロードで古いコンパイラに匹敵するか、それを上回るようになることを期待していますが、それはまだ見られていません。