13/17 Độ trễ và băng thông Các chương

DDR5-6000 nhanh mà CPU vẫn phải chờ?

DDR5-6000 truyền dữ liệu rất nhanh. Vì sao CPU vẫn phải chờ RAM?

Ở bài trước, CPU tìm dữ liệu trong cache trước. Không có thì nó phải xuống RAM.

Giả sử máy đang dùng:

DDR5-6000

Con số 6000 rất lớn. Nhưng CPU hỏi RAM xong vẫn không nhận được dữ liệu ngay.

Chuyện gì xảy ra trong khoảng thời gian đó?

DDR5-6000 không chạy ở 6000 MHz

Một thanh DDR5-6000 có xung khoảng 3000 MHz, tức ba tỷ chu kỳ mỗi giây.

DDR là Double Data Rate: trong một chu kỳ, RAM truyền dữ liệu hai lần.

1 chu kỳ · 2 lần truyền
Xung bộ nhớ khoảng 3000 MHz, mỗi chu kỳ truyền dữ liệu hai lần — đó là con số 6000 trong tên DDR5-6000.

Ba tỷ chu kỳ, mỗi chu kỳ hai lần truyền, thành sáu tỷ lần truyền mỗi giây. Đó là con số trong cái tên. Trên bảng thông số, nó còn được ghi là 6000 MT/s.

Tên gọi dừng ở đây. Phần còn lại là chuyện xảy ra khi CPU thật sự cần dữ liệu.

CPU hỏi RAM

CPU gửi địa chỉ sang bộ nhớ:

CPU                     RAM


 └──── cần dữ liệu ────►

RAM chưa thể gửi gì về ngay. Ở các bài trước, ta đã thấy DRAM chia thành bank, hàng và cột, và muốn đọc thì phải mở cả một hàng vào row buffer.

Vậy nên trước khi có byte đầu tiên, RAM còn phải đi hết chặng này:

bank

hàng

cột

Rồi dữ liệu mới bắt đầu chạy về:

CPU yêu cầu


[ RAM tìm và mở dữ liệu ]


████ ████ ████ ████ ───► CPU

Khoảng đầu tiên là lúc CPU đứng yên. Nó có tên: độ trễ (latency).

Thử đọc một lần

Một lần CPU đọc RAM
RAM CHUẨN BỊ
DỮ LIỆU VỀ

Bấm Đọc dữ liệu và để ý CPU đứng yên bao lâu trước khi dữ liệu bắt đầu về.

DDR5-6000 nói về đoạn phía sau, đoạn dữ liệu đang chạy. Đường truyền nhanh hơn không làm đoạn phía trước ngắn lại.

Nếu dữ liệu đã ở đúng hàng thì sao?

DRAM không đóng mọi thứ lại sau mỗi lần đọc. Hàng vừa mở vẫn đang nằm trong row buffer, nên lần đọc tiếp theo trúng hàng đó thì khỏi mở lại.

Còn nếu ô cần đọc nằm ở hàng khác, bank phải đóng hàng đang mở rồi mở hàng mới, trước khi chọn cột.

Cùng một thanh RAM, hai lần đọc khác nhau
hàng 1 hàng 2 hàng 3

Cùng hàng

chọn
dữ liệu về

Hàng khác

đóng hàng
mở hàng
chọn
dữ liệu về

Hàng 2 đang mở. Thử đọc một ô trong hàng đó, rồi thử đọc một ô ở hàng khác.

Cùng một thanh RAM, cùng một con số in trên vỏ hộp, mà hai lần đọc mất thời gian khác nhau.

Đọc một ít và đọc rất nhiều khác nhau ở đâu?

Quay lại mô phỏng ở trên, đổi Lượng dữ liệu sang 4 KB rồi đọc lại.

Với 64 byte, đoạn chờ chiếm gần hết:

[       chờ       ]██

Với 4 KB, đoạn truyền dài hẳn ra:

[ chờ ]████████████████████████████████████►

Lúc này thanh RAM chuyển được càng nhiều dữ liệu mỗi giây thì càng sớm xong — đổi giữa DDR5-4800 và DDR5-6000 trong mô phỏng là thấy. Lượng dữ liệu chuyển được trong một khoảng thời gian gọi là băng thông (bandwidth).

Một chương trình liên tục cần những mẩu nhỏ ở các chỗ khác nhau sẽ gặp lại khoảng chờ rất nhiều lần:

A

chờ

        B

        chờ

                C

                chờ

Một chương trình đọc cả một vùng dài thì ngược lại:

████████████████████████████████████████►

Cùng một thanh RAM, hai chương trình đó cảm nhận nó khác hẳn nhau.

Và đây là lý do cache quan trọng

CPU chạy nhanh hơn RAM rất nhiều. Mỗi lần cần một giá trị nhỏ mà đều phải xuống DRAM:

CPU → RAM → chờ → dữ liệu

thì nhân CPU cứ bị chặn lại bởi những khoảng chờ ấy.

Cache giữ sẵn bản sao ở ngay cạnh nhân:

CPU → cache → dữ liệu

Không phải chuyến nào cũng phải đi hết đường xuống RAM. Đó là lý do bài trước CPU cần L1, L2 và L3 dù trong máy đã có hàng chục gigabyte RAM.

Đến đây, ta đã đi từ một ô nhớ tới cả hệ thống:

CPU

cache

RAM

bank

hàng

ô nhớ

Nhưng RAM có một hạn chế rất rõ. Rút điện:

RAM → dữ liệu biến mất
SSD → dữ liệu vẫn còn

Trong khi cả hai đều là chip.

Vì sao một loại phải có điện liên tục mới nhớ được, còn loại kia thì không?