2013-03-24 35 views
6

Sử dụng công cụ căn chỉnh C++ 11 mới mà tôi muốn đảm bảo rằng một tập hợp các biến tạm thời (ngăn xếp) sẽ nằm trong một dòng bộ nhớ cache. Nỗ lực ngây thơ đầu tiên của tôi như sau:Biến ngăn xếp liên kết bộ nhớ cache

int main() { 
    alignas(64) int a; // 0x7fffc58aac80, properly aligned at 64 
    int b; // 0x7fffc58aac7c 
    int c; // 0x7fffc58aac78 
    return 0; 
} 

Ngốc tôi! Ngăn xếp không phân bổ các biến theo cách này, do đó a sẽ nằm trên các dòng bộ nhớ cache khác nhau hơn bc.

Điều này có nghĩa là chỉ cách để căn chỉnh đúng một số biến là thông qua tổng hợp?

struct alignas(64) Abc { 
    int x; 
    int y; 
    int z; 
}; 

int main() { 
    Abc foo; 
    // x 0x7fff40c2d3c0 (aligned at 64) 
    // y 0x7fff40c2d3c4 
    // z 0x7fff40c2d3c8 
    return 0; 
} 

Compiler: Clang 3.2

+8

Bạn có thực sự nghĩ rằng có tất cả các biến này trong cùng một dòng bộ nhớ cache sẽ cải thiện hiệu suất không? Tỷ lệ cược khá tốt là ngăn xếp nằm trong bộ nhớ cache. –

+0

Nó * có thể * có tác động nếu các biến này cần phải được chia sẻ giữa nhiều lõi, sao cho bất kỳ lõi nào muốn ghi vào các lõi này, cần sử dụng cả ba biến cùng một lúc. Nếu tất cả chúng đều nằm trong cùng một dòng bộ nhớ cache và truy cập vào các biến này là rất hiếm, lưu lượng kết hợp sẽ bị giảm. Tuy nhiên không có gì đảm bảo rằng dòng có thể bị vô hiệu hóa giữa việc đọc hai biến trong cùng một dòng. –

+1

Biên dịch hiện đại thậm chí không giữ các biến ngăn xếp ở một vị trí cố định (trừ khi bạn lấy địa chỉ của chúng, dĩ nhiên). Vì vậy, nếu 'a' và' b' chia sẻ một dòng bộ nhớ cache, sau khi ghi vào một trong hai có thể thay đổi. (Điều này là điển hình cho tối ưu hóa chuyển nhượng đơn lẻ) – MSalters

Trả lời

4

Để sắp xếp đúng một số biến bạn phải sử dụng một số tổng hợp, bởi vì cách bố trí cho các biến tự động không được định nghĩa. Tôi không thể tìm thấy bất cứ điều gì trong tiêu chuẩn C++ 11 nói rằng các biến với lưu trữ tự động phải được cấp phát trên ngăn xếp theo thứ tự chúng được xác định. Mục 5.9 của tiêu chuẩn khẳng định rằng chỉ có một vài loại so sánh con trỏ được xác định và so sánh giữa các biến với bộ nhớ tự động không nằm trong số các biến được liệt kê như được xác định.

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