雑多な趣味の記録帳

tom01h.exblog.jp

タグ:zero-riscy ( 53 ) タグの人気記事

zero-riscy の Matrix Mult 命令をパイプライン処理したい2

zeroriscy の Matrix Mult 命令をパイプライン化しています。
この命令はコンパイラ対応していないので、正直いって検証がずぶずぶになってしまいます。
でも、思いつく限りはストール制御を入れておきたいと思います。変更点は
  1. 命令デコーダのマルチサイクル命令判定部分から mmult命令を削除
  2. mmult ユニットをパイプライン化
  3. WB ステージで待たされているレジスタアドレスの数を増やす
  4. mmult 命令が完了したけど EX ステージに負けてレジスタ書き込みできないときにストール
  5. mmult 命令実行中はロードストア命令を発行しない
4と5が思いついたストール条件です。他にもありそうなら教えてください。
github 更新しました。


[PR]
by tom01h | 2018-06-11 00:31 | PCとか | Trackback | Comments(0)

zero-riscy の Matrix Mult 命令をパイプライン処理したい

以前 BNN 専用の命令をメモリインタフェース化した ので、zero-riscy の追加命令は行列積命令だけになりました。
それから、かつては 内積を 2つ並列に実行とか呼んでいました が、よく考えたら行列積ですよね。リンクのページに細かい事が書いてありますが、8bit 整数 3個を入力すると、8bit整数の 3×2の行列と掛けて、16bit 整数 2個が出てきます。累積できるようにもしています。飽和演算の構想もあったみたいですね。忘れていました (--)
こんなわけで命令の名前を mmult32 に変更して、モジュール名も変えたのですが、本当にやりたいことはパイプライン化です。この命令は演算に 4サイクルかかるので大きな効果が期待できます。また、この命令はコンパイラが自動で使ったりはしないので、まずはストールを検出しなくても良いソフトを書いて試してみました。やはり効果絶大で、1180519 サイクルから 787335 になりました。下は mmult32 を9回繰り返して 27×2 の行列と掛けているところです。
f0054075_00100259.png
[追記 波形のプログラムは ここ と思ったけどちょっとだけ違った]

[PR]
by tom01h | 2018-06-10 00:36 | PCとか | Trackback | Comments(0)

zero-riscy の Windows 用バイナリ更新

zero-riscy の Windows 用バイナリ を更新しました。
ニューラルネットアクセラレータも積んでいるのですが、8bit 整数の行列積命令はパラメータの更新が出来ないので、バイナリ配布の場合は使い物にならないですよね。

[PR]
by tom01h | 2018-06-09 17:59 | PCとか | Trackback | Comments(0)

zero-riscy のロードデータトレース機能を復活したい

ロードストア命令を 3段パイプ化した影響で、ロード命令のレジスタ書き込み値のトレース出力が出来なくなっていました。このままでは不便なので、ロードしたタイミングでトレース出力する機能を追加したいと思います。
レジスタ書き込みは "レジスタ名=書き込みデータ" でしたが、ロードデータの遅延書き込みは "レジスタ名<書き込みデータ" にして区別します。
こんな感じで出力されるようになりました。ぼんやりと眺めてみると、分岐命令の隙に書き込む事が多いように見えます。
f0054075_15344132.png
github 更新しました。

[PR]
by tom01h | 2018-06-08 21:27 | PCとか | Trackback | Comments(0)

zero-riscy を3段パイプにしたい3

zero-riscy のロードストアを 3段パイプにして、シミュレーションは何とか動くようになりました。しかし、FPGA に載せようとしたら論理ループがあると言って怒られました。
デバッグストールと Illegal CSR の原因となる命令が RAW ハザードで抑止されるのですが、命令が抑止されると RAW ハザードも消えちゃうっていうありがちな奴です。どちらも、シミュレーションでは顕在化しなかったパスですね。
RAW ハザード生成を見直して、命令抑止からのパスをなくしました。見かけ上は大きな変更に見えますが、上記変更以外は既存論理を有効に使った記述に変更しただけです。

[PR]
by tom01h | 2018-06-07 21:53 | PCとか | Trackback | Comments(0)

zero-riscy を3段パイプにしたい2

BNN アクセラレータの高速化も難しくなってきたので、そろそろ zero-riscy 本体に手を入れたいと思います。
zero-riscy は2段パイプの設計です。言い換えると、2段に収まらない命令はすべてマルチサイクル命令になります。具体的には、分岐、ロードストア、MUL/DIVがマルチサイクルになります。
この中で分岐はEXの資源を使い続けるのでパイプライン化の対象外です。
MUL/DIVはちょっと悩んでいるのだけどとりあえず保留して、ロードストアを3段パイプにしてみようと思います。
変更箇所はこんな感じ
  1. 命令デコーダのマルチサイクル命令判定部分からロードストアを削除
  2. ロードストアユニットをパイプライン化
  3. ロード結果を遅れてレジスタに書き戻す機能を追加
  4. RAWハザード検出
  5. WAW時に先行(ロードストアの)書き込みを無効化
  6. gnt を待つときはマルチサイクルのままにもどす
  7. rvalid を待つときは WBステージをストール
5番はバグのにおいがプンプンしますね。
3番について少し補足すると、レジスタの書き込みポートは増やさず、ロード結果はEXステージのレジスタ書き込みに負け、隙間をついて書き戻す方式です。昔教えてもらった方式で、バイパス機能は持たせません。
アクセラレータを使った推論プログラムの実行サイクルは、昨日のソフトの最適化で 1672165 から 1237938 になって、今日の 3段パイプ化で 1180519 になりました。
ちなみに、命令トレース出力がロード命令のレジスタ書き込み値の出力に対応出来なくなりました(--)
それから、もともと zero-riscy ってなぜかミスアラインアクセスに対応していたと思うのですが、良く分からないので取っちゃいました。

[PR]
by tom01h | 2018-06-06 22:55 | PCとか | Trackback | Comments(0)

zero-riscy を3段パイプにしたい

BNN アクセラレータの高速化も難しくなってきたので、そろそろ zero-riscy 本体に手を入れたいと思っています。
まずは、ロードストアを3段パイプにしたいのですが…
tests は通るのですが、kozos ブートローダが動かない。というか、バスに待たされるとダメみたいです。
なかなかうまく出来ないので、まずは理解の妨げになっているミスアラインアクセス機能を削除しました。
それと、拡張命令を使った BNN 推論プログラムの第1層の畳み込みの最適化がいまいちだったので更新しました。
ついでに、axi ブリッジのリタイミングはレスポンス側だけで、リクエスト側は素通しなのに気付きました。確かに変なタイミングパスが見えていたんですよね。
今更ながら修正しましたが、今のブロック図はこんな感じです。
f0054075_20464852.png

[PR]
by tom01h | 2018-06-05 22:47 | PCとか | Trackback | Comments(0)

vivado でバイト制御付きの RAM を推論する

ada さんに教えてもらった このページ を参考に、バイト制御付きの RAM の記述を見直そうと思います。記述自体を真似するのではなく、テンプレートが参考になるというところを…
まずは、Source の中から適当に選んで Verilog ファイルを開きます。
f0054075_22331695.png
そして電球マークをクリックして Language Templates を開いて、Verilog/Synthesis Constructs/Example Modules/… を選ぶとサンプルが表示されます。先のページの例と比べると、だいぶ洗練された感がありますね。ごく普通の Verilog 記述に見えます。
これを参考に書いた Verilog が、このファイル の下のモジュールになります。ついでにイネーブルも入れたら遅くなりました。
f0054075_22361142.png
今まではいい方法が分からなかったので、バイト幅の RAM を横に並べていました。
当然のとこながら、初期化データもバイトサイズに分割するという面倒な目に合っていましたが、今後は面倒から開放されそうです。そうはいっても、エンディアン変換は必要なのですが…

[PR]
by tom01h | 2018-05-30 23:21 | Trackback | Comments(0)

FPGA の zero-riscy の BNN アクセラレータをメモリマップ型に更新

BNN アクセラレータのメモリマップ型でスクラッチパッド RAM 統合型が完成したので、FPGA に載せて見たいと思います。
統合前は、ソフトウェア推論には大量のデータメモリが必要で、アクセラレータ付きの時は大きなアクセラレータ内蔵メモリが必要でした。どちらにも対応できるデザインは使用メモリが大きすぎたので ARTY A7 には乗りません でした。
今回の変更で、ソフトウェアが自由にメモリの使用量を分割できるようになったので、メモリの小さな(と言っても 220KB あるけど) ARTY A7 にも載せる事が出来ます。
f0054075_13312677.png
がしかし… 結構大変でした。
結局はデザインのバグだった(FPGA用にメモリのRTLだけは別に作っているので…)のですが、Vivado のバージョンアップを疑ってみたり、自作の IP に readmemh で初期化するメモリがあってそこではまったりといろいろ時間がかかりました。
後者(readmemh)の問題は、下みたいなファイルをインクルードする方法に変えました。ところで、バイト制御付きの RAM を推論する方法ってないんですかね?
reg [7:0] ram [0:8*1024-1] = {
8'h17,
8'h00};
しかし、Vivado ってやっぱりなんか使いにくいです。
mbed (yotta だけど) とか使ってみた後だと余計にそう感じます。
ちなみに、ARTY Z7 なら余裕です。
f0054075_21234408.png
github 更新しました。

[PR]
by tom01h | 2018-05-20 22:10 | PCとか | Trackback | Comments(2)

メモリマップ BNN アクセラレータを小型化する

BNN アクセラレータはかなり高速なのですが、それにデータをくべる CPU が鈍足なので性能を生かしきれいていません。
回路の量はさほど気にはしていないのですが、メモリアクセス幅が 1024bit っていうのは、無駄遣いするのはちょっとなぁと思います。そんなわけで、アクセラレータを時分割動作に変更しようと思います。
具体的には、現状 32bit 幅の回路を 32個インスタンスしていますが、これを 8個に減らして 4サイクル繰り返し動作にします。メモリアクセス幅は 256bit になります。実際は、8サイクル動作(128bit)にしても大した性能低下はないと思っているのですが、将来 CPU が高速化することを夢見て…
f0054075_16510081.png
上が 32bit 分のアクティベーションを作る波形です。上から、クロック、BNNのリクエスト、データRAMアクセスリクエスト、ユニットビジーの負論理、BNN動作中、の信号です。まだスカスカです。
左から、最初に1個が BNN 初期化、3+3+4 の波が 9画素分の畳み込みとプーリング、それを4回繰り返した後にノーマライズとアクティベーションのちょっと長めの波が来ます。
この変更で、今までウェイト制御を気にせずに済ませていたメモリアクセス論理(ペリフェラルだけは気にしていたけど)にウェイト制御を追加しました。
セットアップも含めた1枚の画像を推論するプログラムの実行時間が 1637165 サイクルから 1639325 サイクルになりました。
ちなみに自由度は減りますが、カーネルサイズ3x3固定、入力チャンネル数32bitに固定したらこれくらいにはなります。
f0054075_17263859.png

[PR]
by tom01h | 2018-05-18 22:20 | PCとか | Trackback | Comments(0)