2009-11-18 9 views
43

Я заинтересован в принуждении кэш-памяти процессора в Windows (для сравнения, я хочу эмулировать запуск без данных в кэше процессора), предпочтительно базовую реализацию C или вызов Win32.Как я могу сделать кеш-память процессора в x86 Windows?

Есть ли известный способ сделать это с помощью системного вызова или даже что-то такое же, как это делает большой memcpy?

Платформа Intel i686 (P4 и выше все в порядке).

ответ

49

К счастью, есть более чем один способ явно очистить кэши.

Инструкция «wbinvd» записывает содержимое измененного кеша и помещает кеши пустым. Он выполняет цикл шины, чтобы сделать внешние кеши для очистки своих данных. К сожалению, это привилегированное обучение. Но если можно запустить тестовую программу под чем-то вроде DOS, это путь. Это имеет то преимущество, что размер кэша «OS» очень мал.

Кроме того, существует инструкция «invd», которая делает недействительными тайники без, сбрасывая их обратно в основную память. Это нарушает согласованность основной памяти и кеша, поэтому вам нужно позаботиться об этом самостоятельно. Не рекомендуется.

Для целей бенчмаркинга наиболее простым решением является копирование большого блока памяти в область, отмеченную WC (объединение записи) вместо WB. Область отображаемой памяти видеокарты является хорошим кандидатом, или вы можете пометить регион как WC самостоятельно через регистры MTRR.

Вы можете найти некоторые ресурсы о бенчмаркинга короткие процедуры на Test programs for measuring clock cycles and performance monitoring.

+1

О, я стою правильно, аккуратно, я не знал об этой инструкции. – Falaina

+1

Инструкция wbinvd требует порядка 2000-5000 тактов для завершения! Большинство инструкций занимает в среднем 2-5. – unixman83

7

Есть инструкции по сборке x86, чтобы заставить ЦП зафрезить определенные строки кеша (например, CLFLUSH), но они довольно неясны. CLFLUSH, в частности, удаляет только выбранный адрес из кеша L1.

что-то такое же подлый, как говорят, крупная memcopy?

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

+1

«убедитесь, что на флеши CPU все уровни кэша.» Неверно, как я уже говорил, современный коммерческий процессор, особенно при абстрагировании операционной системой, может (и, вероятно, делать) иметь очень сложные стратегии кеширования. – marr75

+4

Я считаю, что вы путаете кеш процессора с другими кэшами уровня ОС. OS практически не говорит о том, что процессор будет кэшировать или не кэшировать, потому что эти решения должны выполняться так быстро, нет времени для прерываний ядра или чего-либо подобного. Кэш ЦП реализован исключительно в кремнии. – intgr

+1

Переключатель контекста действительно позволяет запускать другие процессы и тем самым загрязнять кеш. Но это нормальная часть поведения ОС - это будет происходить с или без эталона, поэтому имеет смысл включить это в ваши тайминги в любом случае. – intgr

2

К сожалению, нет способа явно сбросить кеш. Ниже перечислены некоторые из ваших вариантов:

1.) Выбросите кеш, выполнив очень большие операции с памятью между итерациями кода, который вы сравниваете.

2.) Включить кеш отключить в x86 Control Registers и сравнить это. Вероятно, это также приведет к отключению кэша команд, что может и не быть тем, что вы хотите.

3.) Внесите часть кода в ваш бенчмаркинг (если это возможно) с помощью Non-Temporal instructions. Хотя, это всего лишь подсказки процессору об использовании кеша, он по-прежнему свободен делать то, что он хочет.

1, вероятно, самый простой и достаточный для ваших целей.

Редактировать: К сожалению, я исправлюсь есть инструкция о признании недействительной кэш x86 см ответ drhirsch в

+1

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

+0

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

+2

Вы можете легко сделать это в Windows 95,98, ME. И даже для современных оконных вариантов вы можете реализовать его в кольце 0 с помощью драйвера. – hirschhornsalz

 Смежные вопросы

  • Нет связанных вопросов^_^