Tùy thuộc vào mức độ điên rồ mà bạn đang cố gắng đạt được sự bảo đảm của mình.
x86_64 Bộ đệm L3 được lập chỉ mục vật lý và trong khi đoạn 10MiB tuyến tính trong không gian ảo gần như chắc chắn sẽ tiếp giáp với máy ghi nhớ nhẹ, nó không được đảm bảo. Ví dụ:
Sandy và Ivy Bridge có bộ đệm L3 trong 2MiB lát với độ liên kết 16 chiều (128kiB stride), vì vậy bạn có thể đảm bảo mức độ phù hợp thực tế bằng cách thực hiện cuộc gọi MAP_HUGETLB
mmap()
.
Ngoài ra, vì mỗi lát (ít nhất trên Sandy/Ivy Bridge mới nhất) được gắn vào một lõi khác và lát một địa chỉ vật lý được xác định bởi một băm của một số bit địa chỉ thấp/trung bình, bạn có thể phải tạo một mảng lớn hơn một chút so với kích thước của L3 để chống lại sự chồng chéo không đồng đều tối thiểu.
Tại thời điểm này, chà mảng của bạn một vài lần tuyến tính nên làm các trick.
Nếu bạn muốn xóa bộ nhớ cache, chỉ kéo một loạt dữ liệu qua đó không liên quan đến dữ liệu thử nghiệm của bạn. – Mysticial
@Micicial hey Mystical, ý tưởng vector của tôi có được sự chấp thuận của bạn không? 2.500.000 có đủ không?Tôi không chắc chắn vì bộ nhớ cache kết hợp. –
user997112
Vâng, chỉ cần 'memset()' bất kỳ bộ nhớ tiếp giáp lớn nào. Một số bộ xử lý có bộ đệm L3 băm. Vì vậy, nó có thể là một đoạn của bộ nhớ tiếp giáp đó là chính xác kích thước của bộ nhớ cache sẽ không đủ do va chạm. Nhưng tôi muốn nói kéo một vài trăm MB mặc dù là đủ. – Mysticial