Выделите статическую память в кеш процессора в c / c ++: возможно ли это? - PullRequest
6 голосов
/ 13 января 2012

Возможно ли явное создание статических объектов в кеше ЦП, например, чтобы эти объекты всегда оставались в кеше, чтобы не происходило никакого снижения производительности при попадании в ОЗУ или, не дай бог, в виртуальную память hdd?

Я особенно заинтересован в нацеливании на большой общий кэш L3, не нацеливаясь на L1, L2, инструкцию или любой другой кеш, только на самый большой встроенный элемент памяти.

И чтобы уточнить отличия от других тем, которые я искал перед публикацией, я не заинтересован в приватизации всего кэша, всего лишь небольшого количества классов в регионе.

Ответы [ 2 ]

12 голосов
/ 13 января 2012

Нет.Кэш не адресуем, поэтому вы не можете размещать в нем объекты.

Похоже, вы хотели спросить: Выделив пространство в виртуальной памяти, могу ли я убедиться, что всегда получаю попадания в кеш?

Это более сложный вопрос, и ответ на него: частично.

Вы определенно можете избежать обмена на диск, используя API управления памятью вашей ОС (например, mlock()), чтобы пометить регион как нестраничный.Или выделите из «невыгружаемого пула» для начала.

Я не верю, что есть подобный API для закрепления памяти в кэше процессора.Даже если бы вы могли зарезервировать кэш-память процессора для этого блока, вы не можете избежать промахов кэша.Если другое ядро ​​запишет в память, владение будет перенесено, и вы будете страдать от пропуска кэша и связанной с ним передачи шины (возможно, в основную память, возможно, в кэш другого ядра).

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

1 голос
/ 23 августа 2012

Вы можете запустить другой поток, который перебирает данные и переносит их в кэш L3.

...