Является ли TLB включительно? - PullRequest
2 голосов
/ 12 апреля 2020

Включает ли иерархия TLB современный процессор x86 (например, Skylake или, возможно, другие озера)?

Например, prefetchtn переносит данные в кэш уровня n + 1, а также соответствующую запись TLB в DTLB. Будет ли оно также содержаться в STLB?

1 Ответ

5 голосов
/ 12 апреля 2020

AFAIK, в TLB 2-го уровня семейства Intel SnB - кэш-память жертвы для iTLB и dTLB первого уровня. (Я не могу найти источник для этого и IDK, где я читал его изначально. Так что возьмите это с крошкой соли . Первоначально я думал, что это общеизвестный факт, но это могло быть ошибочным заблуждением, которое я изобрел!)

Я думал, что это было где-то задокументировано в Руководстве по оптимизации Intel , но, похоже, это не так.

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

Так, например, если вы сохраняете код и данные на одной странице, вы можете получить пропуск iTLB при выполнении кода, а затем промах dTLB, который также пропускает в STLB и выполняет другую страницу, если этот код загружает данные с той же страницы. (По этой причине мы не храним данные только для чтения на той же странице, что и код на x86; он не имеет преимущества в размере кода и тратит впустую зону покрытия iTLB + dTLB, имея одну и ту же страницу в обоих TLB.)


Но, возможно, я ошибаюсь; Трэвис (@BeeOnRope) предложил использовать предварительную выборку данных, чтобы снизить стоимость пропуска iTLB; он предполагает, что обходчик заполняет запись в STLB и dTLB. (В Core 2 (?) И более поздних версиях программная предварительная выборка TLB-miss может вызвать обход вместо отказа.)

Я думаю, что предварительная выборка L2, вероятно, будет очень эффективной для кода, который в противном случае скучаю по DRAM. Да, вы не нагреваете ITLB или L1I, но вы нагреваете L2 и STLB, поэтому вы берете что-то вроде дюжины циклов для первого выполнения.

Это будет работать для ДЕВЯТЬ STLB; на самом деле он не должен быть включительно , просто не является эксклюзивным или кэшем жертвы. (Например, кеш L2 - это NINE по сравнению с кешем L1i и кешем L1d. Они извлекаются через него, но строки могут быть удалены из L2 без принудительного вытеснения из любого кеша L1.)


Дополнительные сведения со ссылками на источник :


Core 2 был другим: https://www.realworldtech.com/nehalem/8/ говорит, что имеет крошечный L1dTLB с 16 записями используется только для нагрузок и использует DTLB L2 для хранилищ, а также загрузки L1dTLB-miss.

Nehalem изменил это (DTLB с 64 записями) вместе с реорганизацией иерархии памяти к тому, что все еще используется на клиенте (несерверные) микросхемы: большие совместно используемые LL C и 256 тыс. частных L2. (И, конечно же, обычный 32-килограммовый L1i / d) Какой метод отображения кэша используется в процессоре Intel Core i7?

...