Насколько я могу судить, аппаратные предварительные считыватели будут, по крайней мере, обнаруживать и получать постоянные шаги через память. Кроме того, он может monitor data access patterns, что бы это ни значило. Что привело меня к удивлению, ли предварительные данные аппаратного обеспечения когда-либо основывали свои решения на фактических данных, хранящихся в памяти, или на основе поведения, которое демонстрирует программа?Могут ли «неродные» указатели повредить производительность кеша?
Причина, по которой я прошу, состоит в том, что иногда я использую «неродные» указатели в качестве указателей. Простым примером этого будет предопределенный массив данных и небольшие целые числа, индексирующие этот массив вместо указателей. Если мне нужно хранить много таких «указателей», экономия в памяти может быстро складываться и, в свою очередь, косвенно улучшать производительность кеша, используя меньше памяти.
Но, насколько я знаю, это может помешать работе аппаратных префишеров. Или нет!
Я могу себе представить, реалистичный или нет, блок предварительной выборки, который анализирует строки кэша, которые входят в кеш-память L1 для собственных указателей-указателей и запускает их выборку в L2 или какую-то такую вещь. В этом случае мой умный трюк экономии памяти внезапно кажется менее решительным.
Итак, что делают современные аппаратные prefetchers, действительно? Могут ли они быть сработаны «неродными» указателями?
Я может звучать глупо, но то, что это не родной указатель? – Alex
В этом вопросе «родной» указатель должен быть значением, которое хранит адрес памяти в буквальном смысле. '0x1234' будет указывать на память на' 0x1234'. «Неродный» указатель будет значением, которое косвенно относится к памяти. '0x1234' в этом контексте может ссылаться на память на' some_array [0x1234] 'или что-то более сложное, например' array = some_map [0x1234 >> 8]; pointer = array [0x1234 & 0xff] '. – porgarmingduod