19 / 20 · Praktikum
Proyek akhir: model verifikasi N×N dengan pembagian tile
Gabungkan N dan K sembarang dengan padding dan jeda, lalu bandingkan dengan acuan independen.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Rangkai model lengkap
Proyek akhir menerima A berbentuk M×K dan B berbentuk K×P pada kisi N×N. Setiap tile spasial dimulai kosong, operand padding berupa nol valid, dan penulisan diberi mask berdasarkan koordinat. Hanya satu pekerjaan menempati tile, dan jeda global menahan waktu logis. Kuantisasi keluaran tetap menjadi pengujian terpisah setelah jumlah lebar.
Simpan ini sebagai capstone-lab.mjs dan jalankan node capstone-lab.mjs. Tidak diperlukan paket. Masukan berupa fixture bilangan bulat kecil dalam rentang tepat Number JavaScript; rentang lebih besar memerlukan BigInt dan pemeriksaan lebar eksplisit. Ini memeriksa model aritmetika/jadwal Node secara independen dari eksekusi RTL atau DDS.
import assert from 'node:assert/strict';
function golden(A,B){return A.map(r=>B[0].map((_,j)=>
r.reduce((s,a,k)=>s+a*B[k][j],0)));}
function solve(A,B,N,pauses=new Set()){
const M=A.length,K=A[0].length,P=B[0].length;
assert.ok(N>=1&&Number.isInteger(N)&&K>=1);assert.equal(B.length,K);
assert.ok(A.every(r=>r.length===K)&&B.every(r=>r.length===P));
const C=Array.from({length:M},()=>Array(P).fill(null));
let advances=0,physical=0;
for(let r0=0;r0<M;r0+=N)for(let c0=0;c0<P;c0+=N){
const job=r0*P+c0;
let g=Array.from({length:N},()=>Array.from({length:N},()=>
({a:null,b:null,acc:0,count:0})));
const token=(value,k)=>({value,k,job});let t=0,p=0;
while(t<K+2*N-2){
if(pauses.has(p)){p++;continue;}
const next=g.map(r=>r.map(pe=>({...pe})));
for(let i=0;i<N;i++)for(let j=0;j<N;j++){
const ka=t-i,kb=t-j;
const a=j?g[i][j-1].a:(ka>=0&&ka<K?
token(r0+i<M?A[r0+i][ka]:0,ka):null);
const b=i?g[i-1][j].b:(kb>=0&&kb<K?
token(c0+j<P?B[kb][c0+j]:0,kb):null);
const pe=next[i][j];pe.a=a;pe.b=b;
if(a&&b){assert.equal(a.job,b.job);assert.equal(a.k,b.k);
assert.equal(a.k,pe.count);pe.acc+=a.value*b.value;pe.count++;}}
g=next;t++;p++;
}
for(let i=0;i<N;i++)for(let j=0;j<N;j++){
assert.equal(g[i][j].count,K);
if(r0+i<M&&c0+j<P){assert.equal(C[r0+i][c0+j],null);
C[r0+i][c0+j]=g[i][j].acc;}}
advances+=t;physical+=p;
}
return {C,advances,physical};
}
const A=[[1,2,3],[4,5,6],[7,8,9]],B=[[1,0,2],[0,1,0],[2,0,1]];
for(const N of [1,2,3])assert.deepEqual(
solve(A,B,N,new Set([1,2])).C,golden(A,B));
const run=solve(A,B,2,new Set([1,2]));
assert.deepEqual(run.C,[[7,2,5],[16,5,14],[25,8,23]]);
assert.equal(run.advances,20);assert.equal(run.physical,28);
assert.deepEqual(solve([[2,-1],[0,3]],[[4,5],[-2,1]],2).C,
[[10,9],[-6,3]]);
assert.deepEqual(solve([[-128]],[[-128]],1).C,[[16384]]);
console.log('Capstone lab passed');Fungsi acuan hanya mengetahui aritmetika matriks. Penyelesai secara independen menggeser token bertag, memeriksa suku berurutan, dan memberi mask penulisan. Untuk N=2, empat tile membutuhkan dua puluh tepi advance. Jeda pada tepi fisik satu dan dua di setiap tile menambahkan delapan jeda, sehingga total dua puluh delapan tepi fisik. Inisialisasi, pemuatan memori, dan transfer keluaran serial tidak termasuk.
Serahkan log, jejak k yang dikonsumsi untuk satu tile, analisis lebar bertanda, dan desain pembungkus hasil valid/ready. Pertahankan kontrak tepi saat menerjemahkannya ke RTL. Mulai dengan N=1,K=1 dan 2×2 sebelum memperbesar. Tambahkan kuantisasi, jumlah parsial yang dipertahankan, atau penyangga ganda satu per satu dengan pemeriksaan eksplisit baru.
Ketiga ukuran kisi menguji pemetaan berbeda: N=1 mengulang hasil kali titik tanpa penggeseran jadwal, N=2 menguji empat tile dengan padding, dan N=3 menggunakan satu tile lengkap. Semuanya harus menghasilkan matriks matematis yang sama. Inisialisasi C dengan null membedakan nol valid dari keluaran yang belum dikirim dan mendeteksi penulisan duplikat. Nomor job yang diturunkan dari tile unik di sini; RTL nyata harus mendefinisikan lebar tag serta kebijakan penggunaan ulangnya. Sebagai perluasan, coba M=2,K=3,P=1 dengan nilai harapan yang dihitung manual. Kisi internal tetap persegi sementara matriks keluaran persegi panjang. Periksa bahwa setiap tile mengonsumsi K penuh dan menekan penulisan di luar rentang.
Coba sendiri
Untuk contoh 3×3 dengan N=3 dan jeda pada tepi fisik satu dan dua, cari jumlah tepi advance dan fisik. Bagaimana jika pengukuran mencakup satu tepi clear sebelumnya?
Baca penjelasan
Ada tujuh tepi advance dan sembilan tepi fisik interval komputasi termasuk dua jeda. Menyertakan satu tepi clear sebelumnya menghasilkan sepuluh; pemuatan dan transfer keluaran tetap tidak termasuk.