Связаны ли ошибки кэша с тем, используем ли мы кучу памяти? - PullRequest
0 голосов
/ 24 ноября 2018

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

Я предлагаю и хотел бы спросить о следующем.Я говорю, что это:

template <typename T>
struct {
    T* a;
    T* b;
    T* c;
};

более уязвимо для ошибок кэша, чем это:

template <typename T>
struct {
    T a;
    T b;
    T c;
};

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

Обоснование: Из моих рабочих эмуляторов (я написал эмулятор PowerPC, включая MMU): память тянется по страницам или блокам.Если вы разместите все в стеке, у компилятора будет больше шансов получить все в непрерывном фрагменте памяти, что означает, что при вытягивании одной страницы / блока будет содержаться вся ваша структура / класс (при условии, что вы не используете гигантские структуры /классы), и, следовательно, у вас будет меньше пропусков кеша.

Я не совсем понимаю строки кеша в современных процессорах, когда люди упоминают о них (и я не знаю, относится ли это просто к таблице страницпройти процесс на нескольких уровнях кеша).Некоторые люди сказали мне, что мой аргумент неверен для этого, и я не понял, что они имели в виду.Может кто-нибудь сказать мне, является ли мой аргумент правильным / неправильным и является ли он неправильным по определенной причине в архитектурах x86 / x64?

1 Ответ

0 голосов
/ 24 ноября 2018

В стеке или в куче вы получите ошибки кеша.Так что нет, речь идет не о минимизации выделения кучи.

Вопрос в том, как процессор может максимально использовать информацию из кэша и предсказать, куда вы хотите перейти.Вот почему vector лучше, чем список, потому что вы просматриваете свои данные предсказуемым образом (по сравнению со списком или картой).

Итак, вопрос в том, является ли ваш struct aструктура скажем 3 float, которые выделяются в куче, или массивы float?Если это первое, то плохо, используйте сами данные, а не указатели, если это последнее, хорошо, у вас есть локальность, если вы зацикливаетесь на каждом массиве.

3 основных правила: локальность, локальность, локальность.

Затем идет целое обсуждение массивов структур (AoS), структур массивов (SoA, обычно лучше, когда не все записи полезны для вычислений) и массивов структур массивов (AoSoA, с векторизованным кодом,последние массивы будут упакованы как числа с плавающей запятой / целые числа ...).

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