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

RAM chậm trăm ns, sao vòng lặp vẫn chạy vèo vèo?

Chạm bộ nhớ RAM thì luôn tốn cả trăm nanô giây? Đo trên host ARM: duyệt một mảng 256 MB theo thứ tự tuần tự chỉ tốn 0,24 ns mỗi phần tử — kể cả duyệt lùi cũng vậy — vì bộ nạp trước đoán và kéo dòng cache về trước. Cùng mảng ấy, truy cập ngẫu nhiên tốn 101 ns, chênh 420 lần. Bộ nạp trước theo kịp cả bước đều rất lớn, chỉ chịu thua kiểu ngẫu nhiên.

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

Đếm bit 1: vòng lặp 32 nhịp hay một lệnh CPU?

Đếm số bit 1 phải lặp qua từng bit? Đo trên host ARM: đếm bit bằng vòng 32 lần tốn 7,83 ns mỗi số, nhưng lệnh phần cứng __builtin_popcount chỉ 0,25 ns — nhanh 31 lần, và còn nhanh gấp đôi cả mẹo tay Kernighan lẫn bảng tra. Bất ngờ hơn: trình biên dịch không tự nhận ra vòng đếm bit để thay bằng lệnh CNT — phải gọi builtin mới có.

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

Bấm giờ một cái cờ rồi tin luôn: cách đo ngây thơ cho con số sai 25.000 lần

Tưởng bật/tắt cờ rồi bấm giờ một lần là biết nó đáng giá? Tôi đo kiểu ngây thơ (vứt kết quả): ra 0,041 ns vì khử mã chết xóa cả vòng — sai ~25.000 lần và báo scalar bằng vector. Đo đúng cách (volatile sink + warmup + min) mới lộ sự thật: vector hóa ở workload này thực ra CHẬM 1,18 lần. Phương pháp quyết định con số có nói thật.

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

Căn lề dữ liệu đã lỗi thời? Một cú SIGBUS nói không

Căn lề là chuyện cũ, CPU nay đọc lệch thoải mái? Đo trên host ARM: đọc lệch mà vẫn nằm trong một dòng cache thì nhanh y hệt căn lề — hoàn toàn miễn phí. Nhưng bắc cầu hai dòng cache thì tốn: L1 chậm thêm 33%, RAM chậm gấp 2,2 lần vì phải nạp hai dòng. Và một atomic vắt qua ranh giới dòng thì không chậm — nó Bus Error, chương trình chết ngay.

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

Bảng tra sẵn: mẹo tối ưu kinh điển đã hết thời?

Tính sẵn kết quả vào bảng tra luôn nhanh hơn tính lại lúc chạy? Đo trên host ARM: một hàm băm 4 phép tính lại chỉ tốn 0,330 ns, còn tra bảng thì tùy kích thước — bảng 4KB trong L1 nhanh 0,284 ns, nhưng bảng 1MB (L2) chậm 1,5 lần và bảng 64MB (RAM) chậm 7,6 lần so với tính lại. Trên CPU hiện đại, chạm bộ nhớ xa đắt hơn tính vài phép rẻ — nên châm ngôn cũ đã lật.

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

Một lệnh mỗi chu kỳ? Lõi này nuốt 7,5 lệnh

CPU chạy một lệnh mỗi chu kỳ, thời gian tỉ lệ số lệnh? Đo trên host ARM: một chuỗi phép cộng phụ thuộc chạy đúng 1 lệnh mỗi chu kỳ, nhưng cho lõi mười chuỗi độc lập thì nó nuốt tới ~7,5 phép cộng mỗi chu kỳ — cùng một lõi, cùng loại lệnh. Thêm việc độc lập gần như miễn phí cho tới khi lấp hết cổng thực thi, rồi bão hòa. IPC vượt xa 1.