2012-01-13 43 views
6

Có thể tạo một cách rõ ràng các đối tượng tĩnh trong bộ nhớ cache CPU hay không, để đảm bảo rằng các đối tượng đó luôn ở trong bộ nhớ đệm, vì vậy không có hiệu suất nào được thực hiện từ việc đưa tất cả các cách vào RAM hoặc bộ nhớ ảo - bộ nhớ ảo hdd?Phân bổ bộ nhớ tĩnh trong bộ nhớ cache CPU trong c/C++: có thể không?

Tôi đặc biệt quan tâm đến việc nhắm mục tiêu bộ nhớ cache chia sẻ L3 lớn, không có ý định nhắm mục tiêu L1, L2, hướng dẫn hoặc bất kỳ bộ nhớ cache nào khác, chỉ là bộ nhớ lớn nhất trên bộ nhớ.

Và chỉ cần làm rõ để phân biệt từ chủ đề khác mà tôi đã tìm kiếm trước khi gửi bài này, tôi không quan tâm đến việc tư nhân hóa toàn bộ bộ nhớ cache, chỉ là một nhỏ, vài lớp giá trị của khu vực.

+2

Tôi nghĩ tốt nhất bạn có thể làm là sử dụng [__builtin_prefetch macro của GCC] (http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html). Bộ nhớ cache IIRC không thể định địa chỉ theo mã, CPU tự quản lý nó (ít nhất là trên x86). –

+1

Loại bộ xử lý nào? Một số kiến ​​trúc có hướng dẫn đưa ra gợi ý bộ nhớ cache hoặc hướng dẫn tìm nạp trước bộ nhớ cache trước khi dữ liệu là cần thiết. – TJD

+1

Anwer ngắn: không bạn không thể. Điều duy nhất bạn có thể làm là giữ cho địa phương tham chiếu chặt chẽ. Đừng nhảy vào bộ nhớ, nhưng cố gắng truy cập dữ liệu gần với dữ liệu đã được truy cập bởi thao tác trước đó. Ngoài ra: việc giữ cho dữ liệu của bạn được căn chỉnh trên các ranh giới bộ nhớ cache có thể giúp bạn tránh được việc tìm nạp bộ nhớ cache khác. BTW bộ nhớ cache * khe * không cần phải liên tiếp. Trên x86, có IIRC bốn khe L1 và hàng trăm hoặc hàng nghìn khe cắm L2. (mà bạn phải chia sẻ với các quy trình khác trên máy đa xử lý). – wildplasser

Trả lời

12

Không. Bộ nhớ cache không có địa chỉ, do đó bạn không thể phân bổ các đối tượng trong đó.

Điều bạn có vẻ muốn hỏi là: Có không gian được cấp phát trong bộ nhớ ảo, tôi có thể đảm bảo rằng tôi luôn nhận được lần truy cập bộ nhớ cache không?

Đây là một câu hỏi phức tạp hơn, và câu trả lời là: một phần.

Bạn chắc chắn có thể tránh bị hoán đổi ra đĩa, bằng cách sử dụng API quản lý bộ nhớ của hệ điều hành (ví dụ: mlock()) để đánh dấu khu vực là không thể đánh số trang. Hoặc phân bổ từ "nhóm không phải phân trang" để bắt đầu.

Tôi không tin rằng có API tương tự để ghim bộ nhớ vào bộ đệm CPU. Ngay cả khi bạn có thể dự trữ bộ nhớ cache CPU cho khối đó, bạn không thể tránh được bộ nhớ cache bị mất. Nếu lõi khác ghi vào bộ nhớ, quyền sở hữu S be được chuyển, và bạn S suffer bị thiếu bộ nhớ cache và truyền bus liên quan (có thể đến bộ nhớ chính, có thể vào bộ nhớ đệm của lõi khác).

Như Mathew đề cập trong nhận xét của mình, bạn cũng có thể buộc lỗi bộ nhớ cache xảy ra song song với công việc hữu ích khác trong đường dẫn, để dữ liệu nằm trong bộ nhớ cache khi bạn cần.

1

Bạn có thể chạy một chuỗi khác lặp lại dữ liệu và đưa nó vào bộ đệm L3.

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