Сколько из «большого» объект попадает в кеш?

Если у меня есть объект, который содержит несколько больших векторов, если я получаю доступ к одному из членов векторных данных, означает ли это, что другие векторы (к которым у меня нет доступа) также попадают в кеш (возможно, по правилу пространственной локальности кода)?

Так что, если бы я имел:

class A{
float p;
int x[10000];
int y[10000];
};

и я только доступ p в определенном фрагменте кода, будет доступ к A::p загрязняют кеш больше, чем

class B{
float p;
int x[10000];
double y;
};

так как B меньше из-за наличия только одного большого массива.

Мой инстинкт заключается в том, что загружаются только часто принимаемые строки кэша, а не весь объект.

1

Решение

Как упоминалось в других ответах, подсистема памяти не знает о структуре памяти ваших объектов. Он видит только доступ к памяти по соответствующему адресу. В результате в кеш всегда будет загружаться один и тот же объем данных, независимо от размера ваших объектов.

Что касается вопроса о том, сколько данных загружается, это зависит от архитектуры. В простой системе будет загружена только соответствующая кешлайн. Современные процессоры x86 также имеют механизм предварительной выборки. Этот механизм пытается определить, какие адреса памяти вам, скорее всего, понадобятся далее, а также будет извлекать эти строки кэша заранее. По этой причине последовательный доступ намного быстрее (на несколько порядков), чем произвольный доступ, потому что здесь средство предварительной выборки всегда будет выбирать правильные данные.

Редактировать:
Но опять же: это не имеет никакого отношения к размеру вашего класса, но зависит только от шаблона доступа (который, конечно, может зависеть от макета памяти вашего класса).

2

Другие решения

Машина знает ничего такого о макете вашего класса, поэтому размер класса не имеет значения. Знает только, какая у тебя память на самом деле доступ, т. е. ваш шаблон доступа. Информация о расположении класса, вероятно, даже не будет существовать в памяти, как только код скомпилирован, так что машина не сможет понять его.

2

Загружается строка кеша, соответствующая адресу, который вы читаете, независимо от объекта.

Это зависит от вашей платформы. Для строки кэша 64 байта (так 8 или 16 целых чисел), в зависимости от выравнивания, читая любой из x[0...15] приведет только к тем элементам, загруженным в кеш.

Чтение элемента x[16] загрузит его и последующие элементы в другую строку кэша.

В зависимости от общего размера кэша, чтение, скажем x[9000], может привести к конфликту кэша, и ранее заполненная строка будет очищена, чтобы освободить место для новых элементов.

1
По вопросам рекламы [email protected]