Giải thuật 03/09/2026 9 phút

8 con trỏ, vài chục byte, mà chậm gấp 4 lần: conflict miss

Dữ liệu nhỏ hơn cache thì luôn nằm trong cache? Đo ra: chỉ 8 con trỏ — vài chục byte dữ liệu thật — cũng chậm gấp 3-4 lần nếu chúng cách nhau đúng 64KB (lũy thừa 2), vì tất cả dồn vào cùng một tập cache và đá nhau ra (conflict miss). Cách nhau một số không lũy thừa 2 thì phẳng lì. Và ngưỡng conflict lộ luôn số way của cache.

Giải thuật 03/09/2026 7 phút

Đảo byte tôi tự viết bằng shift/mask nhanh ngang builtin — vì gcc nhận ra tôi đang làm gì

Phải dùng builtin/intrinsics mới nhanh, viết C tay luôn chậm? Tôi đo và thấy đúng nửa: builtin thắng rõ ở phép C không có cách viết tự nhiên (popcount nhanh 1,8 lần), nhưng nhiều phép compiler tự nhận mẫu — đảo byte viết tay bằng shift/mask cũng ra đúng một lệnh rev, bằng builtin. Đo trước khi cho rằng viết tay là chậm.

Giải thuật 03/09/2026 8 phút

SIMD nhanh gấp 4 lần — hoặc gấp 0, tùy vòng lặp

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.

Giải thuật 03/09/2026 8 phút

Cùng số phép cộng, tách 8 biến ra nhanh gấp 6,7 lần

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).

Giải thuật 03/09/2026 9 phút

Một cú đoán sai nhánh đốt 12 chu kỳ: đo cái giá đó

Đ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.