Es hängt davon ab, wie verrückt Sie versuchen, Ihre Garantie zu erhalten.
x86_64 L3-Cache ist physikalisch indexiert, und während ein 10MiB-Chunk, der im virtuellen Raum linear ist, fast physisch zusammenhängend auf einem leicht geladenen Computer ist, ist dies nicht garantiert.
Sandy und Ivy Bridge, zum Beispiel, haben L3-Cache in 2MiB Scheiben mit 16-Wege-Assoziativität (128kiB Schritt), so dass Sie physische Abdeckung, indem Sie einen MAP_HUGETLB
mmap()
Anruf unter der Annahme, Standard 2-4MiB große Seiten garantieren.
Da jeder Slice (zumindest bei einer neuen Sandy/Ivy Bridge) an einen anderen Core angehängt ist und der Slice, auf dem sich eine gegebene physikalische Adresse befindet, durch einen Hash einiger Adressbits niedriger/mittlerer Ordnung bestimmt wird, Sie müssen möglicherweise ein Array etwas größer als die Größe von L3, um für geringfügig ungleichmäßige Überlappung zu begegnen.
An dieser Stelle sollte das Scrubben Ihres Arrays einige Male linear erfolgen.
Wenn Sie den Cache löschen möchten, einfach ziehen Sie eine Reihe von Daten durch, die nichts mit Ihren Testdaten zu tun haben. – Mysticial
@Mysticial hey Mystical, tut das mein Vektor Idee bekommt Ihre Zustimmung? Wären 2.500.000 genug?Ich war mir wegen der Cache-Assoziativität nicht sicher. – user997112
Ja, nur 'memset()' irgendeinen großen zusammenhängenden Stück Speicher. Einige Prozessoren haben einen Hash-L3-Cache. Es ist also möglich, dass ein Teil des zusammenhängenden Speichers, der genau der Größe des Caches entspricht, aufgrund von Kollisionen nicht ausreicht. Aber ich würde sagen, ein paar hundert MB zu ziehen, sollte ausreichen. – Mysticial