У меня следующий вопрос, не могли бы вы помочь мне с этим:
У меня есть следующие массивы целых чисел (размер 1024), и я пытаюсь найти общие элементы, присутствующие во всех массивах (вместе с положением, в котором был найден общий элемент):
Array1: 15, 89, 100, 167, 202, ...
Array2: 16, 89, 109, 178,179, 202, ...
Array3: 15, 89, 100, 178, 189, 202, ...
Array4: 17, 89, 109, 167, 178, 202, ...
Array5: 7, 89, 100, 178, 179, 180, 202, ...
Теперь общими элементами вместе с их положением в соответствующих массивах являются:
Array1: 89(2), 202(5), ...
Array2: 89(2), 202(6), ...
Array3: 89(2), 202(6), ...
Array4: 89(2), 202(6), ...
Array5: 89(2), 202(7), ...
Можно ли хранить эти массивы в кеше L1, пока они пересекаются? Я написал простой код C ++, который помещает общий элемент и его положение как std :: pair в std :: vector. Является ли этот код правильным для сохранения элементов в кеше L1 или я должен изменить свой код … если да, то, пожалуйста, предложите.
Ваши данные будут оставаться в кэше до тех пор, пока процессор будет нуждаться в этом или процессор должен будет поместить другие данные в кэш.
Мой лучший совет — держать данные близко друг к другу и выполнять доступ ко всем вашим данным вместе. Например: ввести все данные, обработать все данные, вывести все данные. В худшем случае: ввести некоторые данные, обработать некоторые данные, вывести некоторые данные, повторить для всех данных.
Вы можете захотеть использовать массивы вместо векторов, потому что векторы динамически распределяют память и могут выделяться в разное время. Если размер массивов не меняется, используйте массивы.
Изменить 1:
Вот несколько хороших ссылок, описывающих оптимизацию кэша:
Оптимизация кэша процессора
Эффективное использование кэш-памяти
Первая ссылка имеет хорошие диаграммы, объясняющие, как работает кеш.
Вам также следует поискать «оптимизация кэша данных». Вот еще несколько ссылок:
Хранение массивов в кеше L1
Низкий уровень оптимизации языка C
Расположение данных
EETimes — Оптимизация для производительности кеша