FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討(44. AXPYベンチマークの改善)

前回、ベンチマークのためにAXPYを動かした。 ハザードが発生しても、投機実行を継続するためにuopを生成し続けるポリシを採用すると、MSHRへの割り当て以外の時にも長いハザードが発生してしまい、結果的に性能が大きく落ちていた。 ISS CYCLE is updated t…

自作CPUにベクトル命令を追加する実装検討(43. AXPYベンチマークを動かす)

ベンチマーキングのために、RISC-Vのベクトル命令で構成されたAXPYを動作させてみることにする。 前回の実行では、各イタレーションで、かなりの空きサイクルがある。MSHRの空きも大きい。やはりもうちょっとアグレッシブにMSHRの割り当てを行って、可能な限…

自作CPUにベクトル命令を追加する実装検討(42. AXPYベンチマークを動かす)

ベンチマーキングのために、RISC-Vのベクトル命令で構成されたAXPYを動作させてみることにする。 #include "vector_defines_m8.h" void axpy_intrinsics(double a, double *dx, double *dy, int n) { int i; long gvl = _MM_VSETVLI(e64, n); //PLCT // _MMR…

自作CPUにベクトル命令を追加する実装検討(41. リプレイキューとベクトルuopsの考え直し)

実装の考え直しをして、Uop Generatorを移動して、アドレス生成の調整を行う。 1uop分しかReplay Queueには格納されないので、再度パイプラインに流すときのアドレスの調整を行う必要がある。 通常は、最初のアドレスがrs1+0でそれをベースにaddress generat…

自作CPUにベクトル命令を追加する実装検討(40. リプレイキューとベクトルuopsの考え直し)

ベクトル命令の実装検討、リプレイキューの構造について考え直す。 ベクトル命令は1命令で複数のuopに分解されるが、一度ハザードが発生してそれ以降のuopをすべてリプレイキューに格納すると、必要なリプレイキューの大きさが非常に大きくなってしまう。 そ…

自作CPUにベクトル命令を追加する実装検討 (39. Fixed-Pointベクトル命令セットについて考える)

RISC-VのRVVにはFixed-Point命令セットが含まれており、完全にRVV1.0を名乗るためにはこれらもサポートしなければならない。 12. Vector Fixed-Point Arithmetic Instructions 12.1. Vector Single-Width Saturating Add and Subtract 12.2. Vector Single-W…

自作CPUのベクトルLSUパイプラインのまとめ(2. マスクの作り方)

RISC-Vのベクトル・パイプラインには、実際には演算が適用されない領域がある。それが、 Prestart Region Masked Element Tail Region というものだ。PrestartはVSTARTよりも小さな値(要するに、ベクトル命令がリスタートするときの最初の要素) Masked Ele…

自作CPUにベクトル命令を追加する実装検討 (38. Widening / Narrowingについて考えを巡らせる)

RISC-Vのベクトル命令には、浮動小数点におけるWideningとNarrowingというものがある。 Wideningは、浮動小数点の演算実行時に、データ型を拡張して計算するものであり、一方でNarrowingは、データ型を縮小して計算する。 例えば、SEW=32(FP32)ならば、演算…

自作CPUのベクトルLSUパイプラインのまとめ(1. LSUパイプラインの概要)

ベクトルLSUのパイプラインは、大まかに以下のステージによって実行される。 ex0: 命令キューからの命令発行。命令詳細デコード。アドレス計算のためのレジスタアクセス。 ex1: ベクトル演算モードによるアドレス生成。TLBへのアクセスによる物理アドレスへ…

自作CPUにベクトル命令を追加する実装検討 (37. riscv-vector-testsのリグレッション結果確認)

ベクトル命令のテストパタンriscv-vector-testsでvadd.viに属するテストパタンがすべてPASSできるようになったので、とりあえず手持ちのテストパタンを全部流してみた。 実行したのは878個のriscv-vector-testsだ。それぞれの命令についてテストするもので、…

自作CPUにシンプルなデータプリフェッチャを実装する (2. 性能向上の確認)

前回のデータ・プリフェッチャで性能が向上しない問題。いろいろと解析した。 1つは、プリフェッチ生成時のバンド幅の問題。プリフェッチの生成により複数のプリフェッチ・リクエストが生成される場合、そこで前方のパイプラインが停止してしまってはならな…

自作CPUにベクトル命令を追加する実装検討 (36. vadd.viの確認)

ベクトル命令のデバッグで面倒くさいのは、複数のレジスタへの書き込みが発生したときの対処だ。 LMUL>1の時に、複数のベクトルレジスタの検証が行えるように環境を変更しよう。 void step_spike(long long rtl_time, long long rtl_pc, int rtl_priv, long …

自作CPUにベクトル命令を追加する実装検討 (35. vadd.viの確認)

順序違反と、LMUL>1の対応を実装して、どうにか最初のテストパタンvadd.viのPASSに成功した。 // vadd.vi-0 MW4(0x000000008003c000)<=0000000000000001 322930 : 41349 : PC=[000000008000003a] (M,11,01) 0003cf17 auipc t5, 0x3c GPR[30](26) <= 00000000…

自作CPUにシンプルなデータプリフェッチャを実装する

いろいろ勉強したCPUのデータプリフェッチャについて、理解を深めるために自作CPUにデータプリフェッチャを実装してみることにした。 まずは簡単なConstant Strideのプリフェッチだ。 LSUのパイプラインが1つ以上あるので、トレーニングテーブルの更新はその…

自作CPUにベクトル命令を追加する実装検討 (34. スカラ・ロード命令の順序違反検出の実装)

前回の続き。マイクロコードを変更して再実験を行う。今回の再実験で考え直さなければならないのは以下の通りだった。 テストケースを動かすためには、アウト・オブ・オーダ実行のメモリ・アクセスの順序入れ替えを考慮しなければならない。 これまではスカ…

HAIR: Halving the Area of the Integer Register File with Odd/Even Bankingを読む(2. パリティの構造)

レジスタ・ファイルのサイズを削減するための手法の論文「HAIR」を読んでいる。その内容を簡単にまとめようと思う。 もうちょっとパリティの構造について例を考えながら考察したいと思う。 例えば、以下のような命令のシーケンスを考える。 ld x10, 0(x11) a…

自作CPUにベクトル命令を追加する実装検討 (33. LMUL>1の対応考え直し)

前回の続き。マイクロコードを変更して再実験を行う。今回の再実験で考え直さなければならないのは以下の通りだった。 LMULを命令情報として追加して、最後の命令であればROBに命令終了通知を出す。 vsetvl命令がLMUL_CHANGE例外を出すとき、VSEWとかVLMULの…

Qualcomm等のヨーロッパ企業が合同でRISC-Vをベースとするチップ設計会社 "Quintauris"

Qualcomm等のヨーロッパ企業が合同でRISC-Vをベースとするチップ設計会社を設立するアナウンス、具体的な会社のウェブサイトが作られたようだった。 www.quintauris.eu プレイヤーは明らかに自動車向けであり、それも下記のウェブサイトの中に明記されている…

自作CPUのOoO発行の様子を計測するための仕組みの作成 (2. 各コンフィグレーションでの統計情報の取得)

前回の続き。もうちょっと修正して、統計情報がきちんと出るようにした。 alu[0] 53 / 245, lsu[0] 81 / 269, bru 66 / 207, csu 0 / 0, fpu[0] 0 / 0, 200 / 721 = 0.277 alu[0] 31 / 289, lsu[0] 59 / 228, bru 57 / 229, csu 0 / 0, fpu[0] 0 / 0, 147 / …

自作CPUのOoO発行の様子を計測するための仕組みの作成

自作CPUはアウト・オブ・オーダ命令発行できるような構成にしているのだが、そのうちどれくらいが実際にアウト・オブ・オーダ発行できているのかをちゃんと計測できていない。 いい機会なので、命令スケジューラに統計情報を処理する機能を追加して、全体命…

HAIR: Halving the Area of the Integer Register File with Odd/Even Bankingを読む(1. 概要)

レジスタ・ファイルのサイズを削減するための手法の論文「HAIR」を読んでいる。その内容を簡単にまとめようと思う。 HAIRのレジスタ・ファイルの構成について まず、この論文では汎用レジスタの構成について、読み込みポート・書き込みポートの多さが問題と…

あけましておめでとうございます 2024

あけましておめでとうございます。今年も、FPGA開発日記をよろしくお願いします。 今年は現時点で決まっている大きなプロジェクトとかは何もなくて、FPGA開発日記としては粛々と自分のことをやって、成果を出していければいいなと思う。 すこし課題に思って…

年末なので今年のまとめをしよう2023

FPGA開発日記は2015年1月4日開始から、おおよそ9年が経過しました。 今年は、ブログの記事数が3000記事に到達した節目でもあります。 プライベートでも仕事でも、かなり忙しい状況ではあるのですが、その中で継続して3000記事まで到達できたのは自分でも自信…

自作CPUにベクトル命令を追加する実装検討 (32. LMUL>1の対応考え直し)

ベクトル命令における、LMUL>1の対応というのは結構難易度の高い問題だ。 今回はその解決方法として、LMULの値がVSETVL命令で変更されると、例外を出して物理レジスタの構成を整列し直す方式を考えたい。 この方式を実際にVerilogで記述して動作をテストしよ…

自作CPUにベクトル命令を追加する実装検討 (32. LMUL>1のサポート実装)

msyksphinz.hatenablog.com ベクトルレジスタのLMUL>1サポートを具体的に考えていく。 前に考えた、LMULが変更されたときにベクトル・レジスタのリネームを整列する方法を考える。 例外を発生させるところまではできているので、例外の途中にvsetvl命令が実…

自作CPUにベクトル命令を追加する実装検討 (31. ベクトルレジスタ読み込みの遅延挿入)

msyksphinz.hatenablog.com 前回の続きで、ベクトルレジスタの1サイクル遅延に備えて、1ステージベクトル読み出しのためのステージを挿入した。 また、レジスタ読み出しを行った後に、ストアバッファのインタフェースがストールすることに備えて、ストールし…

自作CPUにベクトル命令を追加する実装検討 (30. ベクトルレジスタ読み込みの遅延挿入)

msyksphinz.hatenablog.com 汎用レジスタは、1サイクル遅延を挿入してBlockRAMを使えるようにしたので、ベクトル・レジスタも1サイクル遅延を挿入してBlockRAMを使えるようにした。 この時にいろいろと改変しないといけない場所で最も面倒なのが、STQからキ…

LiteX 2023.12 リリース確認

CHANGESは以下の通り。これを見る限りあまり大きな変更はないように思える。 自分の自作CPUをアップデートして、試してみなければ。 [> Fixed -------- - liteeth/arp : Fixed response on table update. - litesata/us(p)sataphy : Fixed data_width=32 cas…

Delaying Physical Register Allocation Through Virtual-Physical Registers (2. 性能評価)

ちょっとベクトルレジスタについて似たようなアイデアを考えたので探して読んでみた。 前回の続き。 msyksphinz.hatenablog.com Delaying physical register allocation through virtual-physical registers https://ieeexplore.ieee.org/document/809456 4.…

商用RISC-V命令セットシミュレータが使えない人のためのオープンソース命令セットシミュレータSpike入門 (2. DPI-Cを用いたC++との通信)

いろんなニュースがあり、Imperasの検証環境が使えなくなる可能性があるので、オープンソース(そしてほぼRISC-Vシミュレータとしてはデファクトスタンダード)のRISC-V命令セットシミュレータSpikeを使ってどのようにハードウェアを検証するかどうかについて…