Bộ nhớ Cache làm việc như thế nào ? - Phần 2

Đây là cách mà bộ nhớ Cache làm việc . Bộ phận mang dữ liệu về - Fetch Unit - của CPU tìm kiếm những lệnh tiếp theo để thực hiện trong bộ nhớ Cache lệnh L1 .
Nó làm việc thế nào

Đây là cách mà bộ nhớ Cache làm việc . Bộ phận mang dữ liệu về - Fetch Unit - của CPU tìm kiếm những lệnh tiếp theo để thực hiện trong bộ nhớ Cache lệnh L1 . Nếu nó không có ở đó , nó sẽ tìm tìm kiếm trong bộ nhớ Cache L2 . Sau đó nếu không có , nó sẽ phải đi tới bộ nhớ RAM để mang lệnh về .

Chúng ta gọi “hit” khi CPU tải những lệnh hoặc dữ liệu yêu cầu từ bộ nhớ Cache , và gọi là “miss” nếu lệnh và dữ liệu yêu cầu không có trong Cache và CPU cần truy cập trực tiếp tới bộ nhớ RAM hệ thống .

Hiển nhiên khi bạn bật máy tính thì Cache hoàn toàn trống , do đó yêu cầu truy cập RAM hệ thống - điều đó Cache miss hoàn toàn không thể tránh được . Nhưng sau khi những lệnh đầu tiên được tải thì quá trình làm việc bắt đầu .

Khi CPU tải một lệnh vì một vị trí bộ nhớ nào đó , mạch điện gọi bộ phận điều khiển bộ nhớ Cache tải vào trong bộ nhớ Cache một khối nhỏ dữ liệu bên dưới vị trí hiện tại mà CPU vừa tải . Lúc đó thông thường luồng chương trình theo thứ tự sắp sẵn , vị trí bộ nhớ tiếp theo CPU sẽ yêu cầu sẽ có khả năng là vị trí bên dưới ngay đó của bộ nhớ đã được tải , dữ liệu tiếp theo sẽ có khả năng đã nằm bên trong bộ nhớ Cache , do đó CPU không cần ra bộ nhớ RAM hệ thống để lấy dữ liệu : nó đã được tải bên trong bộ nhớ Cache đi liền với CPU và có thể truy cập với tốc độ bằng tốc độ bên trong của CPU .

Tổng số dữ liệu được gọi theo hàng và thông thường có độ dài là 64-Byte .

Bên cạnh việc tải khối nhỏ dữ liệu , Bộ phận điều khiển bộ nhớ sẽ cố gắng phỏng đoán CPU sẽ yêu cầu cái gì tiếp theo . Mạch điện này gọi là PreFetcher – Mang về trước dữ liệu - , tải nhiều vị trí dữ liệu sau những 64-Byte đầu tiên từ bộ nhớ RAM vào bộ nhớ Cache . Nếu chương trình tiếp tục tải những lệnh và dữ liệu từ vị trí bộ nhớ theo thứ tự , những lệnh và dữ liệu mà CPU sẽ hỏi tiếp theo đã được sẵn sàng tải bên trong bộ nhớ Cache .

Do đó chúng ta có thể tóm tắt cách thức làm việc của bộ nhớ Cache như sau :

·        CPU yêu cầu Lệnh/Dữ liệu lưu trữ trong địa chỉ “a”

·        Khi đó nội dung từ địa chỉ “a” không có bên trong bộ nhớ Cache , CPU phải mang nó về trực tiếp từ bộ nhớ RAM .

·        Bộ phận điều khiển Cache tải một hàng ( thông thường 64-byte ) bắt đầu từ địa chỉ “a” vào bên trong bộ nhớ Cache . Điều đó nhiều hơn dữ liệu CPU đã yêu cầu , do đó nếu chương trình tiếp tục chạy tuần tự ( có nghĩa là yêu cầu địa chỉ a+1 ) Lệnh/Dữ liệu tiếp theo CPU sẽ yêu cầu đã được tải trong bộ nhớ Cache .

·        Mạch điện gọi là PreFetcher tải nhiều vị trí dữ liệu hơn sau dòng này , có nghĩa là bắt đầu những nội dung tải từ địa chỉ a+64 vào bộ nhớ Cache . Ví dụ , Pentium 4 có Prefetcher là 256-byte , do đó nó tải 256 byte tiếp theo sau dòng đã được tải bên trong bộ nhớ Cache .

Nếu chương trình thường chạy tuần tự thì CPU không bao giờ cần lấy dữ liệu trực tiếp từ bộ nhớ RAM về - ngoại trừ việc tải lệnh đầu tiên - những lệnh và dữ liệu CPU yêu cầu sẽ thường nằm trong bộ nhớ Cache trước khi CPU hỏi tới chúng .

Tuy nhiên những chương trình lại không chạy như vậy , chúng sẽ thường nhảy từ vị trí bộ nhớ này tới vị trí bộ nhớ khác . Thách thức lớn nhất của Bộ phận điều khiển Cache chính là cố gắng phỏng đoán CPU sẽ nhảy tới địa chỉ nào , để tải nội dung của địa chỉ đó vào bên trong bộ nhớ Cache trước khi CPU yêu cầu nó để tránh trường hợp CPU phải đi tới bộ nhớ RAM của hệ thống , vì điều đó làm chậm hiệu suất làm việc của toàn bộ hệ thống . Nhiệm vụ này được gọi là Dự đoán rẽ nhánh và những CPU mới đều có đặc điểm này .

Những CPU hiện đại có tỉ lệ “hit” ít nhất là 80% , có nghĩa là ít nhất 80% thời gian CPU không cần truy cập trực tiếp tới bộ nhớ RAM của hệ thống và thay thế vào truy cập tới bộ nhớ Cache .

Tổ chức của bộ nhớ Cache

 

\"/\"Bộ nhớ Cache được chia thành nhiều hàng bên trong , mỗi hàng chứa 16 tới 128 Byte tuỳ thuộc vào kiểu CPU . Những CPU chính hiện thời bộ nhớ Cache được tổ chức thành những hàng 64-Byte , do đó chúng ta sẽ xem sét bộ nhớ Cache dùng những hàng 64-Byte làm ví dụ trong mục này .

Do đó bộ nhớ Cache L2 512KB được chia thành 8.192 hàng . Nên nhớ rằng 1KB=210 hoặc 1024 Byte chứ không phải là 1.000 Byte , do đó chúng ta có phép toán 524.288 / 64 = 8.192 . Chúng ta sẽ xem xét CPU Single-Core với 512KB Cache L2 làm ví dụ . Trong hình này chúng ta minh hoạ tổ chức bên trong của bộ nhớ Cache .

Bộ nhớ Cache có thể làm việc với 03 cấu hình khác nhau : Ánh xạ trực tiếp , Liên kết đầy đủ và Liên kết tập hợp . Cấu hình Liên kết tập hợp được dùng hầu hết hiện nay , nhưng chúng ta sẽ tìm hiểm cả ba cấu hình làm việc như thế nào

 

 Ánh xạ trực tiếp

Ánh xạ trực tiếp là cách đơn giản nhất để tạo thành bộ nhớ Cache . Trong cấu hình này bộ nhớ RAM chính được chia thành cùng với số hàng có bên trong bộ nhớ Cache . Nếu bạn có 1GB RAM , thì 1GB này sẽ được chia thành 8.192 khối ( chúng ta dùng với ví dụ đã đề cập trước đó ) , mỗi khối với dung lượng 128KB . Nếu hệ thống của bạn có 512MB RAM nó cũng vẫn được chia thành 8.192 khối , và mối khối lúc đó có 64KB . Chúng ta xem hình minh hoạ

 

 \"\"

Hình 8 : Ánh xạ trực tiếp làm việc như thế nào

 

Điều thuận lợi chính của Ánh xạ trực tiếp đó chính là cách cấu hình dễ thực hiện nhất .

Khi CPU yêu cầu địa chỉ từ bộ nhớ RAM ( ví dụ địa chỉ 1.000 ) , Bộ phận điều khiển Cache sẽ tải hàng ( 64 byte ) từ bộ nhớ RAM và lưu trữ hàng này trong bộ nhớ Cache ( có nghĩa là từ địa chỉ 1.000 tới 1.063 ) . Do đó nếu CPU lại hỏi nội dung của địa chỉ này hoặc một số địa chỉ tiếp theo sau địa chỉ đó ( có nghĩa là bất kì địa chỉ nào từ 1000 tới 1063 ) chúng sẽ đã có bên trong bộ nhớ Cache .

Vấn đề xảy ra nếu CPU cần hai địa chỉ mà có ánh xạ trên cùng một hàng trong bộ nhớ Cache , thì Cache “miss” sẽ xảy ra ( vấn đề này gọi là tranh chấp hoặc xung đột ) .Một ví dụ tiếp theo nếu CPU yêu cầu địa chỉ 1000 và sau đó yêu cầu địa chỉ là 2000 thì Cache “miss” sẽ xảy ra bởi vì hai địa chỉ đó có cùng một khối ( 128KB đầu tiên ) . Do đó Bộ phận điều khiển Cache sẽ tải hàng từ địa chỉ 2000 và lưu trữ nó trong hàng đầu tiên của bộ nhớ Cache , nói đã xoá sạch nội dung trước , khi mà chúng ta ví dụ hàng từ địa chỉ 1000.

Vấn đề tiếp theo . Nếu chương trình có vòng lặp có chiều dài hơn 64-byte , thì sẽ xảy ra Cache “mis” cho toàn bộ khoảng thời gian lặp .

 Ví dụ , nếu vòng lặp đi từ địa chỉ 1000 tới địa chỉ 1100 , CPU sẽ phải tải tất cả những lệnh trực tiếp từ bộ nhớ RAM trong toàn bộ thời gian chu trình lặp . Điều đó sẽ xảy ra vì Cache sẽ có nội dung từ địa chỉ 1000 cho tới 1063 và khi CPU yêu cầu nội dung từ địa chỉ 1100 nó sẽ phải đi tới bộ nhớ RAM , và Bộ phận điều khiển Cache sẽ phải tải từ địa chỉ 1100 tới 1163 . Khi CPU hỏi lại địa chỉ 1000 , nó sẽ phải đi lại tới bộ nhớ RAM , bởi vì Cache không có nội dung từ địa chỉ 1000 . Nếu vòng lặp thực hiện 1000 lần thì CPU sẽ phải đi tới bộ nhớ RAM 1000 lần .

 Đó là nguyên nhân tại sao Cache Ánh xạ trực tiếp là cấu hình Cache hiệu quả tồi nhất và không được dùng trong lĩnh vực PC nữa .

Tổ chức của bộ nhớ Cache

 Liên kết đầy đủ

 Cấu hình Liên kết đầy đủ là không phải là liên kết cố định giữa những hàng của bộ nhớ Cache và vị trí của bộ nhớ RAM hệ thống . Bộ phận điều khiển Cache có thể lưu trữ bất kì địa chỉ nào . Những vấn đề như đã đề cập trước đó đối với cấu hình Ánh xạ trực tiếp sẽ không xảy ra . Cấu hình này đem lại hiệu quả cao nhất , có nghĩa là tỉ lệ Cache “hit” cao nhất .

 Những lại có một vấn đề xảy ra đo là mạch điều khiển vô cùng phức tạp , để theo vết những vị trí bộ nhớ được tải bên trong bộ nhớ Cache . Và đó là nguyên nhân tại sao lại dùng giải pháp ghép - được gọi là Liên kết tập hợp – và được dùng hầu hết hiện nay .

 Liên kết tập hợp n-đường ( n- way )

 Trong cấu hình này bộ nhớ Cache được chia thành vài khối ( những tập hợp ) , mỗi khối bao gồm “n” hàng .

Do đó Cache Liên kết tập hợp 4-đường sẽ bao gồm chứa 2.048 khối ( 8.192 hàng / 4 ) .  Liên kết tập hợp 2 - đường thì bộ nhớ Cache sẽ có 4.096 khối , mỗi khối gồm hai hàng . Liên kết tập hợp 16-đường bộ nhớ Cache sẽ có 512 khối , mỗi khối chứa 16 hàng . Ở đây chúng ta tiếp tục ví dụ này với bộ nhớ Cache L2 512KB chia thành 8.192 đường , mỗi đường có độ dài 64-byte . Tất nhiên phụ thuộc vào CPU mà số khối sẽ khác nhau

 

\"\"

 

Hình 9 : Cấu hình bộ nhớ Cache L2 512KB với 04 đường liên kết

Sau đó bộ nhớ RAM chính được chia thành cùng số khối có trong bộ nhớ Cache . Với ví dụ 512KB Cache với 04 đường liên kết thì bộ nhớ RAM chính được chia thành 2.048 khối , cùng với số khối có trong bộ nhớ Cache . Mỗi khối bộ nhớ được liên kết như là Ánh xạ trực tiếp trong bộ nhớ Cache . Với bộ nhớ RAM là 1GB , bộ nhớ được chia thành 2.048 khối , mỗi khối chứa 512KB , như hình dưới đây .

 

 

 
 
 
\"\"
Hình 10 : Cấu hình bộ nhớ Cache L2 512KB với 04 đường liên kết

 Như bạn thấy việc Ánh xạ cũng tương tự như những gì đã xảy ra với cấu hình Cache Ánh xạ trực tiếp , nhưng chỉ có điều khác là mỗi khối bộ nhớ bây giờ có nhiều hơn một hàng trong bộ nhớ Cache . Mỗi hàng có thể giữ nội dung bất kì địa chỉ nào bên trong khối được Ánh xạ . Với bộ nhớ Cache có 04 đường liên kết ( 4-way ) thì mỗi khối bộ nhớ RAM được Ánh xạ bằng 04 dòng trong bộ nhớ Cache .

 Cấu hình kiểu như vậy gần với những vấn đề đã đề cập bằng bộ nhớ Cache Ánh xạ trực tiếp ( cả hai vấn đề xung độ và vấn đề vòng lặp chúng tôi đã mô tả ở phần trước) . Tại cùng một thời điểm Cache Liên kết tập hợp dễ dàng thực hiện hơn so với Cache Liên kết đầy đủ , như vậy mạch Logic sẽ đơn giản hơn .

Tấy nhiên vẫn còn một số hạn chế trong mỗi khối của bộ nhớ sử dụng với mỗi khối của bộ nhớ RAM . Ví dụ như cấu hình 4-way , sau khi cả 04 hàng của một khối Cache được dùng , thì Bộ phận điều khiển Cache sẽ phải giải phóng một hàng trong đó để lưu trữ lệnh tiếp theo tải từ cùng một khối nhớ RAM .

Khi tăng số liên kết ví dụ từ 4-way lên 8-way , chúng ta sẽ có nhiều hàng sẵn trong một khối Cache , nhưng nếu chúng ta giữ cùng một số lượng bộ nhớ Cache thì kích thước của mỗi khối bộ nhớ RAM , được đại diện trong bộ nhớ Cache , tăng lên . Tiếp tục ví dụ từ 4-way lên 8-way thì sẽ làm cho bộ nhớ RAM 1GB chia thành 1.024 khối , mỗi khối với dung lượng 1MB .

Có rất nhiều vấn đề tranh luận về việc làm thế nào để cân bằng giữa số đường liên kết và kích thước khối của bộ nhớ và cũng chưa có câu trả lời cuối cùng . Intel và AMD dùng cấu hình khác nhau , chúng ta sẽ xem tiếp trong những mục sau .

Như vậy vấn đề gì xảy ra nếu bạn có bộ nhớ Cache lớn hơn ? Hãy quay lại ví dụ trên , nếu tăng bộ nhớ Cache L2 từ 512MB tới 1MB ( chỉ có một cách là thay thế CPU khác ) , điều gì sẽ xảy ra khi bạn có 16.384 hàng , mỗi hàng 64-byte trong bộ nhớ Cache , nó sẽ cho chúng ta 4.096 liên kết ( mỗi liên kết gồm 04 hàng ) . Với bộ nhớ RAM 1GB sẽ được chia thành 4.96 khối , mỗi khối có dung lượng 256KB . Khi mà kích thước của khối nhớ RAM giảm đi thì đồng nghĩa với việc tăng cơ hội những dữ liệu được yêu cầu sẽ được nằm trong bộ nhớ Cache – hay nói một cách khác tăng kích thước bộ nhớ Cache thì Cache “miss” giảm đi .

 Tuy nhiên tăng bộ nhớ Cache đôi khi lại không đảm bảo việc tăng hiệu suất làm việc .Tăng kích thước bộ nhớ Cache đảm bảo rằng có nhiều dữ liệu sẽ được có trong Cache , nhưng câu hỏi là CPU có sử dụng những dữ liệu phụ hay không .

Ví dụ , CPU Single-Core với bộ nhớ Cache L2 là 4MB . Nếu CPU chỉ dùng 1MB mà không dùng nhiều tới 3MB khác ( có nghĩa là hầu hết mọi truy cập những lệnh chỉ trong 1MB và 3MB khác CPU không gọi những lệnh trong Cache nhiều ) , thì CPU sẽ làm việc với hiệu suất tương tự như những CPU với 2MB Cache thậm trí chỉ như 1MB Cache .

 Cấu hình bộ nhớ Cache trong những CPU hiện thời

 Bên dưới là bảng tham khảo bao gồm những tính năng kỹ thuật của bộ nhớ Cache trong những CPU có sẵn trên thị trường hiện nay

 

CPU

Cache lệnh L1

Cache dữ liệu L1

Cache L2

Athlon 64

64 KB
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2
Đường dữ liệu 128-bit với Fetch Unit

64 KB
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2

512 KB hoặc 1 MB
16-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với Cache dữ liệu L1
Đường dữ liệu 128-bit với Cache lệnh L1

Athlon 64 FX

64 KB / lõi
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2
Đường dữ liệu 128-bit với Fetch Unit

64 KB / lõi

2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2

1 MB / lõi
16-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với Cache dữ liệu L1
Đường dữ liệu 128-bit với Cache lệnh L1

Athlon 64 X2

64 KB / lõi
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2
Đường dữ liệu 128-bit với Fetch Unit

64 KB / lõi
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2

512 KB hoặc 1 MB / lõi
16-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với Cache dữ liệu L1
Đường dữ liệu 128-bit với Cache lệnh L1

Sempron (sockets 754 và AM2)

64 KB
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2
Đường dữ liệu 128-bit với Fetch Unit

64 KB
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2

128 KB hoặc 256 KB
16-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với Cache dữ liệu L1
Đường dữ liệu 128-bit với Cache lệnh L1

Opteron

64 KB / lõi
2-way
Đường dữ liệu 128-bit với L2
Đường dữ liệu 128-bit với Fetch Unit

64 KB / lõi
2-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với L2

1 MB / lõi
16-way
Mỗi hàng 64-byte
Đường dữ liệu 128-bit với Cache dữ liệu L1
Đường dữ liệu 128-bit với Cache lệnh L1

Pentium 4

N/A *

8 KB
4-way
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với L2

256 KB, 512 MB hoặc 1 MB
8-way
Mỗi hàng 128-byte
Đường dữ liệu 64-bit với Fetch Unit
Đường dữ liệu 256-bit với Cache dữ liệu L1

Pentium D

N/A *

16 KB
4-way
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với L2

1 MB hoặc 2 MB / lõi
8-way
Mỗi hàng 128-byte
Đường dữ liệu 64-bit với Fetch Unit
Đường dữ liệu 256-bit với Cache dữ liệu L1

Core 2 Duo

32 KB
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với Fetch Unit

32 KB
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với L2

2 MB hoặc 4 MB
8-way
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với Cache dữ liệu L1

Pentium Dual Core

32 KB
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với Fetch Unit

32 KB
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với L2

1 MB
8-way
Mỗi hàng 64-byte
Đường dữ liệu 256-bit với Cache dữ liệu L1

 

*   Những bộ vi xử lí này có 150KB Trace Cache . Cache này được nằm giữa Bộ phận giải mã và Bộ phận thực hiện lệnh ( Execution Unit ) .Như vậy Bộ phận mang lệnh về , Fetch Unit , sẽ lấy dữ liệu trực tiếp từ bộ nhớ Cache L2 .

 
Bảng trên không đề cập tới những bộ vi xử lí Xeon và Celeron bởi vì có một vài phiên bản Xeon và Celeron dựa trên những cấu trúc khác nhau .

Những Celeron và Xeon dựa trên vi cấu trúc Netburst ( có nghĩa là dựa trên Pentium 4 ) sẽ có cùng tính năng kỹ thuật chính như Pentium 4 với số lượng bộ nhớ Cache L2 khác nhau .

Những Celeron và Xeon dựa trên vi cấu trúc Core ( có nghĩa là dựa trên Core 2 Duo ) cũng sẽ có những tính năng kỹ thuật chính như Core 2 Duo những với số lượng bộ nhớ Cache khác nhau .

\"\"