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.