RISC-Vのコードサイズのすべて

Featured image for blog on RISC-V code size

ここコダシップでは、お客様のためにRISC-Vコアのコードサイズを小さくすることに情熱を注いでいます、 しかし、なぜでしょうか?状況を改善するために命令を追加することで、コアをより大きく、より複雑にしていないだろうか?つまり、プロセッサーに命令を追加すると、サイズ、複雑さ、消費電力が増大するため、それを正当化するメリットがなければならない。それでは、このブログでRISC-Vのコード・サイズを最適化する方法を見ていこう。 コード・サイズの縮小を検討すべき理由 まず、なぜそれを気にする必要があるのかを説明しよう。 理由1:トータルシステムでのコスト削減 小さな組み込みコアの場合、プロセッサの実際のサイズは、SoC(ブートROMを含む)や外部フラッシュメモリのサイズと比較すると、それほど重要ではありません。私たちが発見したのは、機能を追加するためにプロセッサーのサイズに例えば1~3%を加えることで、コードサイズを最大20%削減できるということだ。これは、ソフトウェアがより小さなROMと外部フラッシュ・メモリに収まることを意味し、プロセッサのサイズとパワーを適度に増加させながら、システムの総コストを大幅に削減する。 理由2:消費電力の削減とパフォーマンスの向上 プログラムのバイト数を減らすことで、コードのフェッチに必要なメモリ・フェッチの回数を減らすことができる。これにより、必要なレイテンシが短縮され、消費電力も削減される。さらに、キャッシュ・ミスが処理されるのを待つ時間や、キャッシュのないプロセッサでダイレクト・メモリ・アクセス(DMA)エンジンによってTCM(Tightly Coupled Memory)が満たされるのを待つ時間が減るため、性能も向上する。 なぜコードサイズを小さくするために努力しなければならないか、お分かりいただけたと思う。 Zc拡張の実装 コダシップが主導するRISC-V Zc拡張は、2023年第2四半期に承認された。もしチェックしたいのであれば、ここにリリースされた仕様へのリンクがある。そうでない場合は、これらが何であるかを簡単に説明しよう。 Zc 拡張とは? 私が代表を務めるRISC-Vコードサイズ削減タスクグループは、Zc拡張を考え出した。Zc拡張は、”C “と名付けられたRISC-V標準の圧縮命令セット拡張の一部であり、一般的な演算に16ビットの短い命令エンコーディングを追加することで、静的および動的なコードサイズを削減している。 私は最近、欧州でのRISC-Vサミットで、Zc拡張と辞書式圧縮のカスタム命令によるRISC-Vコード・サイズの削減に関する論文を発表した。ここでその概要を説明しよう。 作業開始の経緯 これにより、より多くのコードを命令メモリやキャッシュに収めることができるため、RISC-V C-extensionはコードサイズの削減や性能向上に非常に有効である。RISC-Vコアは、特にコストに敏感な小型デバイス(IoTデバイスなど)向けに、コードを格納するためにより多くのオンチップ・メモリ、またはオフチップ・フラッシュを必要とし、システム・コストを増加させる。より大規模なシステムでは、DDRまたはHBMのオフチップ・メモリが搭載されるでしょう。 コード・サイズ削減タスク・グループは、Zc拡張を定義することにより、この状況を改善するために2020年から活動している。 これらの拡張機能は、ハイエンドのアプリケーション・コアからマイクロコントローラまで、RISC-Vの実装範囲をカバーしています。 プロジェクトのスコープ 私が発表した論文では、提案したZc拡張の有効性を、一連のベンチマークを用いて評価し、C拡張とのコードサイズを比較した。 テストケースは、Opus [1]およびLP3 [2]オーディオコーデック、CoreMark [3]、Embench [4]、FPMark [5]、Debianベンチマークなどから抜粋した。コンパイラの依存性を排除するため、GCCとLLVMの両方を使用した。Zc命令の各グループと、辞書式圧縮のためのカスタム命令案を評価した。ベンチマークの詳細については、オンライン[6]を参照されたい。 発表された論文ではもっと多くのことが取り上げられているが、いくつかの最適化を見てみよう。近いうちにもっと長い形式の記事で紹介するかもしれない。ご期待ください! RISC-V Zc 拡張: Zcb Zcb 拡張機能はハイパフォーマンスの実装に適しており、RVA23 アプリケーション プロファイルに含まれており、実装コストをほぼゼロにして平均でほぼ 1% のコード サイズを節約する。エンベンチベンチマークの中には、この拡張によって5~6%の恩恵を受けるものもある。大規模なコードベースでは0.5%~2%が一般的だ。 現在、すべてのエンコーディングが予約されているため、アーキテクチャ・プロファイルと互換性がある。12のエンコーディングが含まれています。 命令はすべて、アーキテクチャ・プロファイルにある既存の命令の16ビット版であるため、コストは16ビット命令デコンプレッサー(実装されている場合)で12行追加されるか、16/32ビット命令デコーダーの組み合わせで12行追加され、既存のデコードにマッピングされるだけである。 命令は、符号/ゼロ拡張、乗算、バイトとハーフワードのロード/ストア、および機能性(-1とのXOR)ではないものに拡張される。 辞書式圧縮/命令テーブル 辞書式圧縮は、一般的なパターンをテーブルや辞書の短いインデックスに置き換える古い技法である[7]。これは圧縮アルゴリズムに使用され、少なくとも1990年代からコードサイズ削減のためにコンピュータアーキテクチャに適用されてきた。 このアイデアは、メモリ上にマイクロコードのテーブルを持ち、マイクロコードのエントリーを呼び出す16ビット命令を持つというものだ。最初のバージョンでは、各マイクロコード・シーケンスは単一の32ビット命令でなければならないという、機能のサブセットを提案している。 Zcmt/テーブルジャンプに非常によく似ているが、この最初のバージョンは、16ビットエンコーディングを任意の32ビット命令に展開することを可能にする(任意の32ビット関数アドレスに展開するのとは異なる)。PCとの複雑な関係を避けるため、表中の32ビット命令でPC相対命令のものは実行時に不正となる。 たとえば、これは Embench ベンチマーク picojpeg […]

Codasip Studio 9.2.0: 新機能

Codasip Studio 9.2が利用可能になりました。独自のプロセッサ設計自動化ツールセットのこの新しいバージョンには、アプリケーションを拡張および最適化する一連の新機能が強化されています。 Codasip Studio 9.2.0でサポートした新機能は次のとおりです: マクロ プロセッサ、uRISC-V 2.0、およびCodALの配列機能を見てみましょう マクロ プロセッサのサポートによるCODAL開発の効率化 Codasip Studio 9.2.0は、マクロ プロセッサ、つまり、コードを生成するための一連のコンストラクトを使用して、CodALモデルの記述を簡素化する強力なテキストプロセッサを搭載しています。C/C++プリプロセッサと比較して、引数付き呼び出し可能なマクロ、ループ、複雑な式などの主要な機能をサポートしています。 マクロ プロセッサは、開発者の作業を簡素化します。不要なオーバーヘッドを生み出す可能性のある作業の繰り返しや関数の呼び出しを避けることができます。次の例は、マクロ プロセッサの使用例を示しています。 なお、マクロ プロセッサは他の言語やツールでも使用可能です。 マルチスレッド アプリケーションのためのCODALの配列サポート Codasip Studio 9.2.0では、マルチスレッド コア用のレジスタとレジスタ ファイルの配列をサポートします。これらの配列は、スレッドごとに情報を保持します。配列のサイズはスレッドの数と一致し、各スレッドには、使用可能な配列内のそれぞれのインデックスのみが含まれます。 Codasip Studio 9.2.0では信号の配列もサポートされていますが、常に同じサイズであり、多次元配列はサポートされていないことに注意してください。配列から配列への代入は、データ型が一対一で一致していれば、リソース型が異なっていてもサポートされます。例えば、レジスタの配列を同じデータ型の信号の配列に割り当てることはサポートされています。 配列は動的にインデックスを付けることができます。ループの場合、配列で使用できるようにセマンティクスが拡張されます。 次の例は、アーキテクチャ リソースの配列構文を示しています。 register bit[32] r_foo [32]; register_file bit[32] rf_foo [FOO_SIZE]; register bit[1] s_foo [ONE + TWO]; URISC-V 2.0実験用サンプル 最初にCodasip Studio 9.0では、5段パイプライン アプリケーション用のuRISC-Vプロセッサをサンプル提供しました。uRISC-Vは、実際のRISC-V実装を確認しながら学習することができるチュートリアルです。Codasip Studio 9.2.0では、このチュートリアルがuRISC-V 2.0となり、3段パイプラインアプリケーションにも対応できるようになりました。 […]

既存RISC-Vプロセッサのカスタイマイズ

In the previous post we considered how you could create an optimized ISA for a domain-specific processor core by profiling software and experimenting with adding/removing instructions. Using the open RISC-V ISA can be a great starting point for a processor that combines application-specific capabilities and access to portable software.