Size: a a a

IT KPI C/C++ ХВ (не UB)

2021 March 01

q

qwerty in IT KPI C/C++ ХВ (не UB)
ну да, согласен
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
И вот когда проц хочет подгрузить кэш линию в кэш, то для каждой кэш линии есть только один сэт в который она может попасть
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
Это из адреса определяется
источник

q

qwerty in IT KPI C/C++ ХВ (не UB)
да, ибо кэш представляется как хеш-таблица
источник

q

qwerty in IT KPI C/C++ ХВ (не UB)
E1 (не бот) Hephaestus
И вот когда проц хочет подгрузить кэш линию в кэш, то для каждой кэш линии есть только один сэт в который она может попасть
и этот сет по сути и является ключом
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
qwerty
и этот сет по сути и является ключом
Почти)
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
Адрес делят на части
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
Первые Н бит это тег, следующие М бит это номер сета, остальные это уже внутренний адрес в кэш линии
источник

q

qwerty in IT KPI C/C++ ХВ (не UB)
да, это ясно тоже
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
qwerty
char a[N][N];

for (std::size_t i = 0; i < N; ++i)
   for (std::size_t j = 0; j < N; ++j)
        a[i][j] = 0


for (std::size_t i = 0; i < N; ++i)
   for (std::size_t j = 0; j < N; ++j)
        a[j][i]
= 0

Какой варик быстрее и почему? (Понятно, что они обе константные операции и на bit O нотацию смотреть не будем)
Крч, с точки зрения тактов
И если во втором варике выбрать шаг который будет изменять адрес так, что сет будет оставаться тем же
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
То новые данные будут вытеснять старые из сэта
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
Ну и так как второй пример у нас постоянно подгружает новые кэш линии
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
E1 (не бот) Hephaestus
И если во втором варике выбрать шаг который будет изменять адрес так, что сет будет оставаться тем же
То в такой ситуации старые не будут долго оставаться в кэше
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
И их нужно будет подгружать по новой
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
Из л2
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
Поэтому кол-во тактов прыгает то времени доступа к л2
источник

q

qwerty in IT KPI C/C++ ХВ (не UB)
окей, ну это звучит логично
источник

q

qwerty in IT KPI C/C++ ХВ (не UB)
получается он не при каждом обращении к л2 подгружает все по новой
источник

q

qwerty in IT KPI C/C++ ХВ (не UB)
а через несколкько обращений
источник

EH

E1 (не бот) Hephaest... in IT KPI C/C++ ХВ (не UB)
qwerty
а через несколкько обращений
Да
источник