Насколько я могу судить, аппаратные префетеры будут, по крайней мере, обнаруживать и извлекать постоянные шаги через память. Кроме того, он может отслеживать шаблоны доступа к данным, что бы это ни значило. Что заставило меня задаться вопросом: ли предварительные данные аппаратного обеспечения когда-либо основывают свои решения на реальных данных, хранящихся в памяти, или на основе поведения, которое демонстрирует программа?
Причина, о которой я прошу, заключается в том, что иногда я использую "неродные" указатели в качестве указателей. Простым примером этого будет предопределенный массив данных и небольшие целые числа, индексирующие этот массив вместо указателей. Если мне нужно хранить много таких "указателей", экономия памяти может быстро складываться и, в свою очередь, косвенно улучшать производительность кеша, используя меньшую память.
Но для всех, кого я знаю, это может помешать работе аппаратных префишеров. Или нет!
Я могу, конечно, представить, реалистичный или нет, блок предварительной выборки, который анализирует строки кэша, которые входят в кеш-память L1 для собственных указателей-указателей и запускает их в L2 или какую-то такую вещь. В этом случае мой умный трюк с сохранением памяти внезапно кажется менее решительным.
Итак, что делают современные аппаратные prefetchers? Могут ли они быть отключены "неродными" указателями?