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 b
và c
.
Đ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
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. –
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. –
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