15 / 20 · 実習
実習:バックプレッシャーとリセット
全体停止、結果保持、中断ジョブのリセットを実行します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
論理時間を一体として止める
学習用アレイは全体のadvanceを使います。境界スケジューラとすべてのPEは、次の論理ステップの束が利用可能なときだけ動きます。無効に予定されたレーンに実オペランドは不要です。一方のストリームだけ進めるとスキューが崩れます。リンクを独立にストールさせるには、基本構成を超える追加バッファと対応規則が必要です。
出力は別のvalid/ready契約を使います。結果が準備できたら、valid&&readyのエッジで正確に1回転送するまでvalid、データ、jobを安定して保持します。簡単なラッパは古い結果が未引き渡しの間、新しいジョブを始めません。十分な結果記憶領域があれば、消費側のreadyは計算を止める必要はありません。
stall-lab.mjsとして保存し、node stall-lab.mjsを実行します。2項のPEと結果レジスタをモデル化し、パッケージ不要でStall/reset lab passedと表示します。
import assert from 'node:assert/strict';
let s;
function reset(){s={step:0,acc:0,valid:false,data:0,job:7};}
const pairs=[[-2,3],[4,-5]];
function tick({advance=true,ready=false,rst=false}={}){
if(rst){reset();return null;}
if(s.valid){if(!ready)return null;
const out={data:s.data,job:s.job};s.valid=false;return out;}
if(advance&&s.step<pairs.length){
const [a,b]=pairs[s.step];s.acc+=a*b;s.step++;
if(s.step===pairs.length){s.data=s.acc;s.valid=true;}}
return null;
}
reset();tick();assert.equal(s.acc,-6);
const held={...s};tick({advance:false});assert.deepEqual(s,held);
tick();assert.equal(s.data,-26);assert.equal(s.valid,true);
const blocked={...s};tick({ready:false});tick({ready:false});
assert.deepEqual(s,blocked);
assert.deepEqual(tick({ready:true}),{data:-26,job:7});
assert.equal(tick({ready:true}),null);
reset();tick();tick({rst:true,advance:false});
assert.deepEqual(s,{step:0,acc:0,valid:false,data:0,job:7});
tick();tick();assert.equal(s.data,-26);
console.log('Stall/reset lab passed');検査を解釈する
停止は最初の和−6とスケジュール位置を保持します。2項目で−26になります。出力がブロックされた2エッジは結果を保持し、readyのエッジで1回転送します。未完了ジョブ中のリセットはアキュムレータ、位置、結果validをクリアするため、回復時はジョブを最初から始めます。
4ステップの2×2スケジュールに全体停止を2回加えると、advanceは4エッジ、物理的には6エッジです。結果と消費したkの一覧はストールなし実行と一致しなければなりません。論理的な完了式は変わりません。
これは同期制御の参照モデルです。物理的なリセット同期とクロックドメイン交差には別の設計が必要です。リセットで中断したジョブを成功完了として報告してはいけません。再開前に上流バッファをクリアします。モデルの成功はRTL、インストール済みアプリ、ハードウェアの受け入れ確認を示しません。
自分で考えてみましょう
3エッジでvalid=1、ready=0を保持し、その後readyを上げます。どの信号を保持し、転送は何回ですか。待機中にリセットが来るとどうなりますか。
解説を見る
データ、job、validを保持します。待機中の転送は0、readyエッジで1件です。リセットは未引き渡しvalidを破棄し、そのジョブを成功として引き渡してはいけません。取り消し通知には別の状態契約が必要です。