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

Thêm một hàm không bao giờ chạy, benchmark của tôi đổi 4% — thủ phạm là căn lề mã

Căn lề mã cho tốc độ ổn định, cứ tăng -falign-loops là tốt? Tôi đo và thấy tác động nhỏ (~2%) và thất thường trên ARM. Quan trọng hơn: căn lề mã chính là nguồn nhiễu benchmark khét tiếng — giữ hot loop y hệt, chỉ chèn một hàm chết để dịch địa chỉ, thời gian đổi ~4%, còn lớn hơn cả việc cố ý chỉnh căn lề.

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

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.