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 10 phút

Cùng lượng cache, trải mỏng ra 1024 trang chậm 15 lần

Chỉ cache mới quyết định tốc độ truy cập bộ nhớ? Đo ra: cùng ~128KB dòng cache chạm y hệt nhau, nhưng dữ liệu trải rộng trên 1024 trang chậm gấp 15 lần so với gói gọn trong ~16 trang — 14 ns so với 0,9 ns. Thủ phạm là TLB: bộ nhớ đệm dịch địa chỉ ảo sang vật lý. Trải nhiều trang hơn TLB chứa được thì mỗi truy cập trả thêm một lần đi bảng trang.

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

Hạ memory_order cho nhanh: mẹo x86 đem nhầm sang ARM

seq_cst đắt hơn relaxed nhiều, cứ hạ memory_order là code nhanh? Đo trên host ARM: relaxed và seq_cst chênh nhau đúng 0 ns — cả một luồng lẫn tám luồng — vì thứ tự nằm sẵn trong lệnh ldar/stlr/ldadd. Cái thật sự đắt là tính atomic (RMW gấp 7 lần ghi thường) và nhất là tranh chấp: tám luồng đập chung một atomic chậm gấp 60 lần tám ô riêng.

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.

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

Lõi CPU tám cổng ngồi chơi 474/475 thời gian: vì sao?

Lõi CPU rộng 8 thì cái gì cũng nhanh? Đo trên host ARM: một chuỗi phép phụ thuộc — mỗi phép chờ kết quả phép trước — chạy đúng tốc độ độ trễ, và cái lõi tám cổng ấy hoàn toàn vô dụng. Độ trễ mỗi phép chênh nhau khủng khiếp: cộng 1 chu kỳ, nhân 3, chia 7,5, nạp từ RAM theo con trỏ tới 475 chu kỳ. Đường tới hạn là trần cứng không lõi nào phá được.

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

Bung vòng lặp 8 lần mà không nhanh hơn một tí nào?

Bung vòng lặp (unroll) luôn làm code nhanh hơn vì cắt chi phí vòng? Đo trên host ARM: bung một vòng cộng mảng 1x/2x/4x/8x với một biến tích lũy cho thời gian y hệt nhau — 0,2136 ns mỗi phần tử, không đổi, vì lõi out-of-order đã giấu hết chi phí vòng. Cái thật sự giúp là phá chuỗi phụ thuộc bằng nhiều biến độc lập (3,5 lần), còn khi memory-bound thì unroll vô ích. Và -O3 tự vector hóa còn nhanh hơn bung tay.