Можно ли создать вектор в стеке? - PullRequest
0 голосов
/ 03 мая 2019

По причинам оптимизации я хочу, чтобы мой вектор существовал в кеше, и наличие его в стеке значительно увеличивает вероятность этого. Можно ли создать вектор в стеке? Я полностью готов перестроить свой собственный вариант std::vector, если необходимо, чтобы он сработал. Мне также удобно использовать встроенную сборку, если необходимо.

Ответы [ 3 ]

4 голосов
/ 03 мая 2019

Наличие [вектора] в стеке значительно увеличивает шансы [его содержимое находится в кэше]. "

Это предположение. Кэш может загрузить обе данные из стекаи куча. Кешу все равно, откуда исходит исходная физическая память. Это и есть цель Кэша. Все хвалят Кэш. На самом деле, нет даже сильной корреляции между тем, где находится память с программной точки зрения.(автоматическое хранение вместо бесплатного хранилища) и где оно физически расположено (кэш, ОЗУ, диск и т. д.).

В связи с оптимизацией я хочу [...]

Полагаю, вам нужно более быстрое программное обеспечение. Чтобы сделать это, вам нужно установить, что именно делает его слишком медленным на ваш вкус. Для этого есть инструменты, профилировщик - один из них . КогдаВы устранили все свои узкие места и у вас осталось слишком медленное программное обеспечение, и вы можете быть уверены, что столкнулись с проблемой производительности ориентированной на данные . Это когда вы спрашиваете себя: как я могу предсказуемо обработать память для моего ЦП кеша и предсказания ветвления ЦП , чтобы помочь мне ?

1 голос
/ 04 мая 2019

Кэш ЦП не знает и не заботится, используете ли вы стек или кучную память, он работает с необработанными адресами памяти, разделенными на строки кэша (например, 64 байта).Кроме того, подсистема виртуальной памяти работает на страницах (например, 4 КБ), что также может быть источником замедления.Таким образом, важно , чтобы оставаться в или около одной и той же области памяти , т. Е. Путем повторного использования памяти.

Да, стековая память часто является безопасной ставкой, когда онадоходит до кеширования, так как вершина стека обычно "горячая", то есть уже кешируется.Но стек не предназначен для хранения больших объектов или объектов динамического размера, так как это приведет к перемещению вершины из горячей зоны и отмене цели.

std::vector может быть дружественным к кешу.Просто убедитесь, что reserve памяти заранее, таким образом вы избежите дорогостоящих перераспределений и перемещения данных, и используете распределитель памяти, дружественный к кешу, такой как jemalloc (встроенный в BSD) или ptmalloc (встроенный вLinux).И конечно же, профиль, профиль, профиль.

0 голосов
/ 04 мая 2019

Если вы хотите, чтобы ваш вектор жил в стеке, вам не нужно повторно реализовывать вектор, а просто «предоставить» новый распределитель, который использует стек вместо кучи.

Вы можете посмотретьна это , чтобы получить представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...