2009-03-25 16 views
6

Có thể cho một hệ điều hành xác định xem một trang bộ nhớ có trong DRAM hay trong hoán đổi; ví dụ, chỉ cần cố gắng truy cập nó và nếu một lỗi trang xảy ra, nó không phải.Xác định xem vị trí bộ nhớ có trong bộ nhớ cache CPU

Tuy nhiên, điều tương tự có thể xảy ra với bộ nhớ cache CPU?

Có cách nào hiệu quả để biết liệu một vị trí bộ nhớ đã cho đã được tải vào một dòng bộ nhớ cache hay không hoặc biết khi nào nó thực hiện?

Trả lời

6

Nói chung, tôi không nghĩ điều này là có thể. Nó hoạt động với DRAM và pagefile vì đó là một tài nguyên được quản lý bởi hệ điều hành, bộ nhớ cache được quản lý bởi chính bản thân CPU.

Hệ điều hành có thể thực hiện một vòng lặp thời gian chặt chẽ của bộ nhớ đọc và thử xem nó có đủ nhanh để nằm trong bộ nhớ đệm hay không. Trên các hệ thống đa lõi/đa proc, có cache coherency protocols được sử dụng giữa các bộ xử lý để xác định khi nào chúng cần phải làm mất hiệu lực bộ nhớ cache của nhau, tôi cho rằng bạn có thể có một thiết bị tùy chỉnh có thể bẫy giao thức này mà hệ điều hành sẽ truy vấn.

Bạn đang cố gắng làm gì? Nếu bạn muốn ép buộc thứ gì đó vào bộ nhớ, bộ vi xử lý x86 hiện tại hỗ trợ tìm nạp trước bộ nhớ vào bộ nhớ đệm theo cách không chặn, ví dụ với Visual C++ bạn có thể sử dụng _mm_prefetch để tìm một dòng vào bộ đệm.

EDIT: Tôi chưa tự làm điều này, vì vậy hãy tự chịu rủi ro. Để xác định bộ nhớ cache bị thiếu cho lược tả, bạn có thể sử dụng một số sổ đăng ký kiến ​​trúc cụ thể. http://download.intel.com/design/processor/manuals/253669.pdf, Phụ lục A cung cấp "Hiệu suất điều chỉnh sự kiện". Điều này không thể được sử dụng để xác định nếu một địa chỉ riêng lẻ nằm trong bộ nhớ cache hoặc khi nó được tải trong bộ nhớ cache, nhưng có thể được sử dụng cho các số liệu thống kê tổng thể. Tôi tin rằng đây là những gì vTune (một hồ sơ hiện tượng cho cấp độ này) sử dụng.

+0

Cảm ơn bạn. Tôi quan tâm vì tôi đang đùa giỡn với việc viết hạt nhân. Tôi quan tâm đến dòng bộ nhớ cache profiling bỏ lỡ trên phần cứng thực tế. Tôi đã không nhận ra họ rất bất lợi trên các CPU hiện đại cho đến khi tôi thấy các slide của Herb Sutter: http://is.gd/oWwp –

+0

Có nhiều cách để cấu hình nó trong phần cứng, vtune. – Michael

+0

Rất nhiều CPU hiện đại có bộ đếm hiệu suất có thể cung cấp tất cả các loại thông tin, bao gồm cả số liệu thống kê liên quan đến bộ nhớ cache. – sigjuice

6

Nếu bạn tự mình xác định điều này thì hành động chạy chương trình của bạn có thể làm mất hiệu lực các dòng bộ nhớ cache có liên quan, do đó làm cho phép đo của bạn trở nên vô dụng.

Đây là một trong những trường hợp phản ánh nguyên tắc khoa học mà bạn không thể đo lường điều gì đó mà không ảnh hưởng đến thứ bạn đang đo.

+0

Vâng, rất dễ dàng để xác minh rằng một vị trí * là * trong bộ nhớ cache. Chỉ cần đọc từ nó, và thì đấy, nó sẽ nằm trong bộ đệm. ;) Bí quyết là thử nghiệm xem có gì đó không * trong bộ đệm không. :) – jalf

+1

Nếu bạn đảm bảo rằng mã của bạn đang chạy từ bộ nhớ không thể lưu trữ, hành động chỉ chạy một chương trình sẽ không ảnh hưởng đến bộ nhớ cache. –

+0

Điểm tốt. Vì vậy, về cơ bản tôi sẽ phải giải thích mọi thứ khác có thể xảy ra để biết liệu một bộ nhớ cache có tải bộ nhớ được đề cập đến hay không. –

1

X86 không biết làm thế nào để biết được địa chỉ IS trong bộ nhớ cache NHƯNG đây là làm thế nào để biết được địa chỉ WS trong bộ nhớ cache

rdtsc 
save timestamp 
mov eax,address 
rdtsc read timestamp counter 
calculate timestamp difference 
if < threshold then was in cache 

ngưỡng phải được xác định từ tài liệu hoặc theo kinh nghiệm

một số máy có bộ đếm truy cập bộ nhớ cache/bỏ lỡ sẽ phục vụ tốt như nhau