2011-12-12 20 views
5

Tôi đã chạy một số điểm chuẩn trên một số thuật toán và lược tả cách sử dụng bộ nhớ và hiệu quả của chúng (truy cập L1/L2/TLB và bỏ qua), và một số kết quả khá hấp dẫn đối với tôi.Khi L1 bỏ lỡ có rất nhiều khác biệt so với L2 truy cập ... TLB liên quan?

Xét một hệ thống phân cấp bộ nhớ cache bao gồm (L1 và L2 cache), nên không phải là số bộ nhớ cache L1 nhớ trùng với số lượng bộ nhớ cache L2 truy cập? Một trong những giải thích tôi tìm thấy sẽ là TLB liên quan: khi một địa chỉ ảo không được ánh xạ trong TLB, hệ thống sẽ tự động bỏ qua các tìm kiếm trong một số mức cache. Điều này có vẻ hợp pháp không?

Trả lời

6

Thứ nhất, phân cấp bộ đệm ẩn có thể không quá phổ biến như bạn giả định. Ví dụ, tôi không nghĩ rằng bất kỳ bộ vi xử lý hiện tại nào của Intel - không phải Nehalem, không phải Sandybridge, có thể là Nguyên tử - có L1 được bao gồm trong L2. (Nehalem và có lẽ Sandybridge làm, tuy nhiên, có cả L1 và L2 bao gồm trong L3; sử dụng thuật ngữ hiện tại của Intel, FLC và MLC trong LLC.)

Nhưng, điều này không nhất thiết phải quan trọng. Trong hầu hết các hệ thống phân cấp bộ nhớ cache nếu bạn có một bộ nhớ cache L1 bỏ lỡ, sau đó bỏ lỡ có lẽ sẽ được nhìn lên trong L2. Không quan trọng nếu nó có bao gồm hay không. Để làm khác, bạn sẽ phải có một cái gì đó mà nói với bạn rằng dữ liệu bạn quan tâm là (có lẽ) không phải trong L2, bạn không cần phải nhìn. Mặc dù tôi đã thiết kế các giao thức và loại bộ nhớ để thực hiện điều này - ví dụ: một loại bộ nhớ chỉ được lưu trong L1 chứ không phải L2, hữu ích cho những thứ như đồ họa, nơi bạn có được lợi ích khi kết hợp trong L1, nhưng nơi bạn liên tục quét qua một mảng lớn, vì vậy việc lưu vào bộ nhớ cache trong L2 không phải là ý tưởng hay . Bit Tôi không biết ai đang vận chuyển chúng vào lúc này.

Dù sao, đây là một số lý do tại sao số lượng bộ đệm cache L1 có thể không bằng số lượng truy cập bộ nhớ cache L2.

Bạn không biết bạn đang làm gì trên hệ thống - Tôi biết câu trả lời của tôi có thể áp dụng cho Intel x86 như Nehalem và Sandybridge, giám sát sự kiện hiệu suất EMON cho phép bạn đếm những thứ như bộ nhớ cache L1 và L2, v.v. Nó có lẽ cũng sẽ áp dụng cho bất kỳ bộ vi xử lý hiện đại nào có bộ đếm hiệu suất phần cứng cho bộ nhớ cache, chẳng hạn như bộ điều khiển trên ARM và Power.

Hầu hết các bộ vi xử lý hiện đại không dừng lại ở lần thiếu bộ nhớ cache đầu tiên, nhưng hãy tiếp tục cố gắng thực hiện thêm công việc. Điều này thường được gọi là thực thi đầu cơ. Hơn nữa, bộ vi xử lý có thể theo thứ tự hoặc out-of-order, nhưng mặc dù sau này có thể cho bạn sự khác biệt lớn hơn giữa số L1 và số lượng truy cập L2, nó không cần thiết - bạn có thể nhận được hành vi này ngay cả trong bộ xử lý đơn hàng.

Câu trả lời ngắn gọn: nhiều truy cập bộ nhớ đầu cơ này sẽ ở cùng một vị trí bộ nhớ. Họ sẽ bị đè bẹp và kết hợp.

Sự kiện hiệu suất "Xóa bộ nhớ cache L1" có thể là [*] đếm số hướng dẫn (đầu cơ) đã bỏ qua bộ đệm L1. Mà sau đó phân bổ một cấu trúc dữ liệu phần cứng, được gọi là Intel một bộ đệm điền, tại một số nơi khác một đăng ký xử lý tình trạng bỏ lỡ. Bộ nhớ cache sau đó sẽ bị xóa vào cùng một dòng bộ nhớ cache sẽ bỏ lỡ bộ nhớ cache L1 nhưng nhấn bộ đệm lấp đầy, và sẽ bị đè bẹp. Chỉ một trong số họ, thường là người đầu tiên sẽ được gửi đến L2 và được tính là truy cập L2.)

Nhân tiện, có thể có sự kiện hiệu suất cho điều này: Squashed_Cache_Misses.

([*] Nhân tiện, khi tôi nói "có thể" ở đây, ý tôi là "Trên các máy tôi đã giúp thiết kế". Chắc chắn là tôi có thể kiểm tra định nghĩa, xem RTL, nhưng tôi sẽ sẽ vô cùng ngạc nhiên nếu không.)

Ví dụ: hãy tưởng tượng rằng bạn đang truy cập byte A [0], A [1], A [2], ... A [63], A [64], ...

Nếu địa chỉ của A [0] là bằng không modulo 64, sau đó A [0] .. A [63] sẽ nằm trong cùng một dòng bộ nhớ cache, trên một máy có các dòng bộ nhớ cache 64 byte. Nếu mã sử dụng chúng rất đơn giản, có thể tất cả chúng đều có thể được phát hành một cách có chủ ý. QED: 64 truy cập bộ nhớ đầu cơ, 64 L1 cache nhớ, nhưng chỉ có một bộ nhớ L2 truy cập.

(.. Bằng cách này, tôi không mong đợi các con số để được khá nên sạch sẽ Bạn có thể không được chính xác 64 L1 truy cập mỗi truy cập L2)

Một số chi tiết khả năng:

Nếu số lượng L2 truy cập lớn hơn số lượng bộ nhớ cache L1 bỏ qua (tôi hầu như không bao giờ nhìn thấy nó, nhưng có thể) bạn có thể có một mẫu truy cập bộ nhớ gây nhầm lẫn với trình tìm nạp trước phần cứng. Trình tìm nạp trước phần cứng cố gắng dự đoán các dòng bộ nhớ cache bạn sẽ cần. Nếu trình tìm nạp trước dự đoán nặng, nó có thể tìm nạp các dòng bộ nhớ cache mà bạn không thực sự cần. Thông thường có một hiệu suất không bao giờ đếm Prefetches_from_L2 hoặc Prefetches_from_Memory.

Một số máy có thể hủy truy cập đầu cơ đã gây ra lỗi bộ nhớ cache L1, trước khi chúng được gửi đến L2. Tuy nhiên, tôi không biết Intel làm điều này.

+0

Chồng chất trên: bạn có thể xem một sự kiện bộ đếm hiệu suất như L1_DCACHE_MISSES_RETIRED. Có thể là các hướng dẫn sai đường dẫn có thể đã kích hoạt bộ đệm ẩn L1 và/hoặc L2 - vì vậy bạn có thể không bao giờ thấy bộ nhớ cache L2 "đã nghỉ hưu". –

1

Chính sách ghi của bộ đệm dữ liệu xác định liệu lần truy cập cửa hàng có ghi dữ liệu của nó chỉ trên bộ nhớ cache đó (ghi lại hoặc sao chép ngược lại) hay ở cấp độ phân cấp bộ nhớ cache sau (ghi đè). Do đó, một cửa hàng truy cập vào bộ nhớ cache L1-D ghi đè, cũng ghi dữ liệu của nó vào bộ đệm L2.

Đây có thể là một nguồn khác của các truy cập L2 không đến từ bộ nhớ cache L1 bị thiếu.