見出し画像

シストリックアレイを作ってみよう②【浮動小数点乗算回路はどこまで速くなるか?】

背景

シストリックアレイのPE内で使用予定のFP16乗算回路。
以前の乗算回路の設計

dslxを使えば、どこまでクロック数を上げられるの?
確かめてみよう

dslxコード

// FP16 乗算関数
pub fn fp16_multiply(a: bits[16], b: bits[16]) -> bits[16] {
    // ----------------------------
    // 1. ビットフィールドの分解
    // ----------------------------
    let exp_a = a[10:15];  // Exponent (bits[5])
    let exp_b = b[10:15];  // Exponent (bits[5])
    let frac_a_raw: bits[10] = a[0:10];  // 下位 10 ビットをスライス
    let frac_b_raw: bits[10] = b[0:10];  // 下位 10 ビットをスライス
    let sign_a: bits[1] = a[15:16];  // 上位1ビットをスライス
    let sign_b: bits[1] = b[15:16];  // 上位1ビットをスライス

以下略

細かいバグはあるのですが、
とりあえずほぼ動作します。

--pipeline_stages=1~10
まで変化させて最大動作周波数を見る。

結果

FPGA: GW5AST-LV138PG484AC1/I0
動作可能最大周波数

--pipeline_stages=
1: 55.093MHz
2: 65.841MHz
3: 89.141MHz
4: 149.170MHz
5: 181.576MHz
8: 168.880MHz
10: 167.958MHz

GowinEDA

グラフ化すると

web pythonでプロット。
--pipeline_stages=5、あたりがピークですね。
乗算も"*"ではなくてビット単位で分解すれば、パイプライン化されて、速くなるのでしょうか?

所感

シストリックアレイ、Systolic arrayで乗算回路を使用する目的で、こんなことやってみました。
一つ前のSystolic arrayのNote記事ですが、Pythonコードでのモデルは完成しています。PEをVerilogに置き換えば、コアは完成。5段パイプラインの乗算器ならば、PEのレジスタAとレジスタBを5つ以上持てば、パイプラインをフルに動かすことが可能になるでしょう。
今は仕事は、(AIのおかげで)速い。

(FP16の計算誤差の原因がねえ・・・)

いいなと思ったら応援しよう!