Bài viết mới nhất

Tổng 1741 bài
Giải thuật 03/09/2026 8 phút

Cùng phép nhân, khi 3,2 chu kỳ khi 0,4: sao lại thế?

Mỗi lệnh CPU có một chi phí cố định? Đo trên host ARM: cùng một phép nhân tốn 3,2 chu kỳ khi nằm trong chuỗi phụ thuộc, nhưng chỉ 0,4 chu kỳ khi các phép độc lập — chênh 8 lần. Mỗi lệnh có HAI con số: độ trễ và thông lượng. Bất ngờ hơn: cả phép chia số thực cũng chồng được ~8 lần, dù tôi tưởng bộ chia làm từng cái một.

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

Atomic 'lock-free' vẫn chậm 27 lần khi đông luồng — và không hề nhanh hơn mutex

Tưởng atomic là lock-free nên luôn rẻ, và luôn nhanh hơn mutex? Tôi đo: fetch_add trên một atomic chung 1,6ns khi một luồng nhưng 44ns khi tám luồng — đắt theo số luồng vì cùng nảy một dòng cache; CAS-loop tệ nhất (119ns); còn per-thread nhanh 96 lần. Lock-free nói về ngữ nghĩa, không về chi phí.

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

Thêm phép tính vào vòng lặp mà không chậm hơn: vì sao?

Vòng lặp duyệt mảng lớn nhanh chậm do số phép tính? Đo trên host ARM bằng STREAM: copy (không phép tính), add, triad (nhân+cộng) đều đạt ~65-92 GB/s như nhau — nút cổ chai là băng thông bộ nhớ, không phải phép tính. Và một luồng đã đạt ~85% đỉnh, hai luồng bão hòa ~95 GB/s: trên lõi Apple này một core gần như dùng hết băng thông, khác hẳn server x86.

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

Cùng một mảng, chạm cách này nhanh hơn cách kia 424 lần

Truy cập bộ nhớ có một tốc độ cố định? Đo trên host ARM cùng một mảng 256MB, cùng số lần chạm: duyệt tuần tự tốn 0,24 ns mỗi phần tử (33 GB/s), nhưng đuổi con trỏ ngẫu nhiên tốn 101,7 ns — chênh 424 lần. Và ngẫu nhiên độc lập (nhờ song song mức bộ nhớ) chỉ 3,3 ns, nhanh 31 lần đuổi con trỏ. Ba trần khác nhau, chọn bởi cách bạn truy cập.

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

Mỗi luồng một biến riêng mà vẫn chậm gấp 2,6 lần?

Mỗi luồng ghi biến riêng của nó thì chạy song song thoải mái? Đo trên host ARM: tám luồng, mỗi luồng tăng một bộ đếm riêng, nhưng nếu tám bộ đếm nằm chung một dòng cache thì chậm gấp 2,6 lần so với khi mỗi bộ đếm được đệm ra dòng riêng — dù các biến hoàn toàn độc lập về logic. Đây là false sharing: dòng cache ping-pong giữa các lõi. Ghi thường không atomic vẫn trả giá.