シストリックアレイを作ってみよう②【浮動小数点乗算回路はどこまで速くなるか?】
背景
シストリックアレイの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
動作可能最大周波数
グラフ化すると
web pythonでプロット。
--pipeline_stages=5、あたりがピークですね。
乗算も"*"ではなくてビット単位で分解すれば、パイプライン化されて、速くなるのでしょうか?
所感
シストリックアレイ、Systolic arrayで乗算回路を使用する目的で、こんなことやってみました。
一つ前のSystolic arrayのNote記事ですが、Pythonコードでのモデルは完成しています。PEをVerilogに置き換えば、コアは完成。5段パイプラインの乗算器ならば、PEのレジスタAとレジスタBを5つ以上持てば、パイプラインをフルに動かすことが可能になるでしょう。
今は仕事は、(AIのおかげで)速い。
(FP16の計算誤差の原因がねえ・・・)