Altifigence Academy

19 / 20 · Thực hành

Dự án tổng kết: mô hình kiểm chứng N×N chia khối

Kết hợp N, K tùy ý với đệm và tạm dừng, rồi so với tham chiếu độc lập.

Lắp ráp mô hình hoàn chỉnh

Dự án tổng kết chấp nhận A kích thước M×K và B kích thước K×P trên lưới N×N. Mỗi khối không gian bắt đầu trống, toán hạng đệm là số 0 hợp lệ, phép lưu được che theo tọa độ. Chỉ một công việc chiếm khối, và tạm dừng toàn cục giữ thời gian logic. Lượng tử hóa đầu ra vẫn là kiểm tra riêng sau tổng rộng.

Lưu thành capstone-lab.mjs và chạy node capstone-lab.mjs. Không cần gói. Đầu vào là dữ liệu số nguyên nhỏ trong phạm vi chính xác của JavaScript Number; phạm vi lớn hơn cần BigInt và kiểm tra độ rộng rõ ràng. Chương trình kiểm tra mô hình số học/lịch Node độc lập với thực thi RTL hay DDS.

javascript
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');

Hàm golden chỉ biết số học ma trận. Solver dịch token có thẻ độc lập, kiểm tra số hạng có thứ tự và che phép lưu. Với N=2, bốn khối mất hai mươi cạnh advance. Tạm dừng cạnh vật lý một và hai trong mỗi khối thêm tám lần tạm dừng, tổng hai mươi tám cạnh vật lý. Không tính khởi tạo, nạp bộ nhớ và truyền đầu ra tuần tự.

Nộp log, vết k đã nhận của một khối, phân tích độ rộng có dấu và thiết kế lớp bao kết quả valid/ready. Giữ quy ước cạnh khi chuyển sang RTL. Bắt đầu với N=1,K=1 và 2×2 trước khi mở rộng. Thêm lượng tử hóa, giữ tổng riêng hoặc bộ đệm kép từng tính năng một với kiểm tra rõ ràng mới.

Ba kích thước lưới kiểm tra các cách ánh xạ khác nhau: N=1 lặp lại các tích vô hướng không làm lệch thời điểm đầu vào, N=2 kiểm tra bốn khối có đệm, còn N=3 dùng một khối hoàn chỉnh. Tất cả phải cho cùng một ma trận toán học. Khởi tạo C bằng null phân biệt số 0 hợp lệ với đầu ra chưa được chuyển giao và phát hiện các lần lưu trùng lặp. Số công việc suy ra từ khối là duy nhất ở đây; RTL thực phải xác định độ rộng thẻ và chính sách tái sử dụng. Để mở rộng, thử M=2,K=3,P=1 với giá trị kỳ vọng tính tay. Lưới bên trong vẫn vuông còn ma trận đầu ra là hình chữ nhật. Kiểm tra mỗi khối nhận đủ K số hạng và ngăn các lần lưu ngoài phạm vi.

Tự thử

Với ví dụ 3×3 có N=3 và tạm dừng cạnh vật lý một, hai, tìm số cạnh advance và vật lý. Nếu phép đo gồm một cạnh clear trước đó thì sao?

Đọc giải thích

Có bảy cạnh advance và chín cạnh vật lý trong khoảng tính toán kể cả hai tạm dừng. Tính thêm một cạnh clear trước đó cho mười; vẫn không tính nạp và truyền đầu ra.

Lesson files

capstone-lab.mjs ↓

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.