2014-05-15 15 views
5

Tôi đang thực hiện một số phép đo hiệu suất bộ nhớ cache và tôi cần đảm bảo bộ đệm trống trong dữ liệu "hữu ích" trước khi định thời gian.Làm thế nào để xóa cache L1, L2 và L3?

Giả sử bộ nhớ cache L3 là 10MB, nó đủ để tạo vectơ 10M/4 = 2.500.000 nổi, lặp qua toàn bộ vectơ này, tổng các số và làm trống toàn bộ bộ nhớ cache của bất kỳ dữ liệu nào trong đó trước khi lặp qua vector?

+0

Nếu bạn muốn xóa bộ nhớ cache, chỉ kéo một loạt dữ liệu qua đó không liên quan đến dữ liệu thử nghiệm của bạn. – Mysticial

+0

@Micicial hey Mystical, ý tưởng vector của tôi có được sự chấp thuận của bạn không? 2.500.000 có đủ không?Tôi không chắc chắn vì bộ nhớ cache kết hợp. – user997112

+0

Vâng, chỉ cần 'memset()' bất kỳ bộ nhớ tiếp giáp lớn nào. Một số bộ xử lý có bộ đệm L3 băm. Vì vậy, nó có thể là một đoạn của bộ nhớ tiếp giáp đó là chính xác kích thước của bộ nhớ cache sẽ không đủ do va chạm. Nhưng tôi muốn nói kéo một vài trăm MB mặc dù là đủ. – Mysticial

Trả lời

3

Có, điều đó là đủ để xóa bộ nhớ cache L3 dữ liệu hữu ích.

Tôi đã thực hiện các loại phép đo tương tự và được xác minh chéo bằng cách sử dụng bộ nhớ cache của Intel để xác minh rằng tôi phải chịu số lượng bộ nhớ cache bị thiếu trong các thử nghiệm của mình là L3.

Nếu bạn muốn chắc chắn, bạn cũng nên sử dụng bộ đếm. Cụ thể, bạn có thể đo bộ nhớ cache cấp cao nhất bằng cách sử dụng Event select 2EH, Umask 41H trong hầu hết các kiến ​​trúc của Intel.

Xem Intel Manual để biết chi tiết về các bộ đếm này.

+0

Hi @ merlin2011, bạn có thể đăng bài kiểm tra bạn đã thực hiện trên một số trang web và cho tôi liên kết để xem không? Tôi đã cố gắng để thực hiện các thử nghiệm tương tự để chứng minh rằng bộ nhớ cache L3 đã thực sự làm sạch, nhưng tôi không thể làm điều đó. – Draxent

2

Tùy thuộc vào mức độ điên rồ mà bạn đang cố gắng đạt được sự bảo đảm của mình.

x86_64 Bộ đệm L3 được lập chỉ mục vật lý và trong khi đoạn 10MiB tuyến tính trong không gian ảo gần như chắc chắn sẽ tiếp giáp với máy ghi nhớ nhẹ, nó không được đảm bảo. Ví dụ:

Sandy và Ivy Bridge có bộ đệm L3 trong 2MiB lát với độ liên kết 16 chiều (128kiB stride), vì vậy bạn có thể đảm bảo mức độ phù hợp thực tế bằng cách thực hiện cuộc gọi MAP_HUGETLBmmap().

Ngoài ra, vì mỗi lát (ít nhất trên Sandy/Ivy Bridge mới nhất) được gắn vào một lõi khác và lát một địa chỉ vật lý được xác định bởi một băm của một số bit địa chỉ thấp/trung bình, bạn có thể phải tạo một mảng lớn hơn một chút so với kích thước của L3 để chống lại sự chồng chéo không đồng đều tối thiểu.

Tại thời điểm này, chà mảng của bạn một vài lần tuyến tính nên làm các trick.

0

Một tùy chọn khác là sử dụng hướng dẫn hủy bỏ bộ nhớ cache chuyên dụng mà một số ISA cung cấp. x86 cho ví dụ có wbinvd cho mục đích này (hoặc clflush cho một dòng).

http://x86.renejeschke.de/html/file_module_x86_id_325.html

Một vấn đề là nó đòi hỏi quyền ring-0. Một số khác là nó không đảm bảo rằng các tuôn ra được hoàn thành trước khi bất kỳ điểm nào serialization, vì vậy nó không tốt, đủ để đảm bảo hệ thống không biến động, nhưng nó có thể đủ cho benchmark miễn là bạn có thể ngăn chặn sự WBS tiếp theo từ ăn uống tăng băng thông bộ nhớ của bạn.

Nếu bạn có thể vượt qua những vấn đề này, nó có thể là một giải pháp tốt hơn trong một số trường hợp vì đi qua một số cấu trúc dữ liệu lớn chỉ để đảm bảo bộ nhớ cache bị xóa. Một số CPU có thể quyết định để tránh bộ nhớ đệm lấy về họ tin rằng sẽ không được tái sử dụng trong tương lai (có một số giấy tờ về các tùy chọn này, và ít nhất một số tuyên bố rằng nó thực hiện trong CPU thực)

Các vấn đề liên quan