Kiến trúc máy tính: đo thật
Đo chi phí thật của phần cứng CPU bằng C/C++ trong container Linux: dự đoán nhánh, đường ống, SIMD, phân tầng cache, TLB, ILP, atomic. Mỗi phần một phép đo thật, một lần đo hớ, một sơ đồ.
4/45 phần đã đăng
Giải thuật
1
Dự đoán nhánh: đoán được vs ngẫu nhiên
Ví dụ kinh điển: xử lý mảng đã sắp xếp nhanh hơn mảng ngẫu nhiên vì CPU đoán nhánh đúng hơn. Đo ra: đúng — nhưng chỉ khi có một nhánh THẬT (buộc tắt if-conversion), sắp xếp nhanh 2,2 lần. Ở -O2 mặc định, g++ tự bỏ nhánh (vector hóa/conditional-select) nên hiệu ứng biến mất hoàn toàn, và code không nhánh còn nhanh hơn cả bản sắp xếp. Đo thật.
03/09/2026
· 9 phút đọc
2
Chi phí đoán sai nhánh
Đoán sai một nhánh chỉ chậm đi một chút? Đo ra: quét tỉ lệ nhánh được lấy từ 0% đến 100%, thời gian vẽ thành một hình chuông đỉnh ở 50% — nhánh đoán được (0% hoặc 100%) tốn 0,24–0,45 ns còn nhánh 50/50 tốn 2,38 ns. Từ đó suy ra phạt mỗi lần đoán sai ~3,86 ns, tức khoảng 12 chu kỳ CPU — đúng cỡ một lần xả pipeline. Đo thật.
03/09/2026
· 8 phút đọc
3
Đường ống lệnh và stall
Cùng số phép tính thì cùng thời gian? Đo ra: cộng dồn một mảng bằng một biến tích lũy tốn 0,569 ns mỗi phép cộng, nhưng dùng 8 biến độc lập rồi gộp cuối chỉ tốn 0,085 ns — nhanh 6,7 lần dù y hệt số phép cộng. Khác biệt là đồ thị phụ thuộc: chuỗi phụ thuộc phải chờ từng bước, còn các phép độc lập chạy song song trong một lõi (ILP). Đo thật.
03/09/2026
· 8 phút đọc
4
SIMD và vector hóa tự động
Trình biên dịch -O2 tự vector hóa hết mọi vòng lặp số? Đo ra: một kernel tính từng phần tử độc lập nhanh 3,9 lần khi vector hóa (NEON 128-bit gói 4 float mỗi lệnh), nhưng một vòng có phụ thuộc — y[i] cần y[i-1] — thì không vector hóa được, vector và scalar bằng nhau y hệt. SIMD nhanh N lần chỉ khi vòng vector hóa được và compute-bound. Đo thật.
03/09/2026
· 8 phút đọc
Còn 41 phần nữa sẽ lần lượt được đăng.