Cách dễ nhất để giải quyết vấn đề này là làm cho các đối tượng đủ lớn để chúng không thể chia sẻ đường dẫn. Sử dụng gcc bạn có thể thiết lập sự liên kết của các lớp (tôi giả định đối tượng của bạn có kích thước nhỏ sau đó một cacheline kể từ khi bạn bị tranh chấp):
class foo {} __attribute__((aligned(2 * CL)));
Bạn cần phải chèn Cachelinesize chính xác cho kiến trúc của bạn cho CL
tất nhiên (hoặc đặt nó vào một macro một d sử dụng có). Tôi đã sử dụng gấp đôi kích thước của một dòng bộ nhớ cache, bởi vì từ những gì tôi nhớ new
không đảm bảo rằng nó sẽ thực sự đảm bảo sự liên kết được bảo tồn. Vì đối tượng không được bảo đảm bắt đầu ở đầu của một đường dẫn, bạn vẫn có thể nhận được các phần của các đối tượng khác nhau trong cùng một đường dẫn (đó là kết thúc của một đối tượng và bắt đầu một đối tượng khác). Nếu sắp xếp luôn được giữ nguyên, __attribute__((aligned(CL)))
sẽ ổn. Tất nhiên điều này sẽ cần bạn thay đổi cấu trúc của bạn và lãng phí rất nhiều không gian.
Bạn cũng có thể tự viết new
của mình (xem here để biết cách thực hiện) dựa trên memalign
. Đối với một loại giải pháp thanh toán nhiều hơn, bạn cũng có thể sử dụng trực tiếp memalign
và đặt một đối tượng bên trong không gian được phân bổ bằng cách sử dụng vị trí mới. Tất nhiên nó làm cho mã sử dụng những đối tượng ít đẹp hơn.
Dòng bộ nhớ cache thường là 64 byte. Bạn phải có một số lớp học khá nhỏ, và do đó phải thực hiện rất nhiều phân bổ động khá nhỏ? –
Một số là nhỏ, nhưng hầu hết là chồng chéo (trong một dòng bộ đệm). – jk4736
Bạn có phân bổ các cá thể riêng lẻ hoặc trong một mảng không? – dasblinkenlight