Как программно отключить аппаратную предварительную выборку? - PullRequest
45 голосов
/ 24 апреля 2009

Я бы хотел программно отключить аппаратную предварительную выборку.

С Оптимизация производительности приложений на микроархитектуре Intel® Core ™ с использованием аппаратных средств предварительной выборки и Как выбрать аппаратную и программную предварительную выборку в 32-разрядной архитектуре Intel® , Мне нужно обновить MSR, чтобы отключить аппаратную предварительную выборку.

Вот соответствующий фрагмент:

"Настройки предварительной выборки DPL и L2 Streaming Prefetch также могут быть изменены программно написав утилиту драйвера устройства для изменения битов в IA32_MISC_ENABLE зарегистрироваться - MSR 0x1A0. Такая утилита предлагает возможность включить или отключить предварительную выборку механизмы, не требующие простоя сервера.

В таблице ниже показаны биты в IA32_MISC_ENABLE MSR, которые необходимо изменить, чтобы управлять DPL и L2 Streaming Prefetch:

Prefetcher Type MSR (0x1A0) Bit Value 
DPL (Hardware Prefetch) Bit 9 0 = Enable 1 = Disable 
L2 Streamer (Adjacent Cache Line Prefetch) Bit 19 0 = Enable 1 = Disable"

Я пытался использовать http://etallen.com/msr.html, но это не сработало. Я также пытался использовать wrmsr в asm/msr.h напрямую, но это segfaults. Я попытался сделать это в модуле ядра ... и убил машину.

Кстати - я использую ядро ​​2.6.18-92.el5, и в нем MSR связано в ядре:

$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...

Ответы [ 4 ]

26 голосов
/ 25 апреля 2009

Вы можете включить или отключить аппаратные средства предварительной выборки, используя msr-tools http://www.kernel.org/pub/linux/utils/cpu/msr-tools/.

Следующее включает аппаратный предварительный выбор (сбросив бит 9):

[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2089 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2089

Следующее отключает аппаратную предварительную выборку (включив бит 9):

[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2289 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2289

Программно, вы можете сделать это как root, открыв /dev/cpu/<cpunumber>/msr и использование pwrite для записи в «файл» msr со смещением 0x1a0.

11 голосов
/ 24 апреля 2009

Из справочника Intel:
Эта инструкция должна быть выполнена на уровне привилегий 0 или в режиме реального адреса; в противном случае будет сгенерировано исключение общей защиты #GP (0). Указание зарезервированного или не реализованного адреса MSR в ECX также вызовет общее исключение защиты.

...
Инструкция CPUID должна использоваться, чтобы определить, поддерживаются ли MSR (EDX [5] = 1) перед использованием этой инструкции.

Таким образом, ваша ошибка может быть связана с процессором, который не поддерживает MSR или использует неправильный адрес MSR.

Существует множество примеров использования MSR в исходном коде ядра:

В исходном коде ядра для одного процессора он демонстрирует отключение предварительной выборки для Xeon в файле arch / i386 / kernel / cpu / intel.c в функции:

static void __cpuinit Intel_errata_workarounds (struct cpuinfo_x86 * c)

Аргументами функции rdmsr являются номер msr, указатель на старшее 32-битное слово и указатель на старшее 32-битное слово.
Аргументами функции wrmsr являются номер msr, младшее 32-битное слово и старшее 32-битное слово.

многоядерные или smp системы должны передавать структуру процессора в качестве первого аргумента:
void rdmsr_on_cpu (ЦП без знака, u32 msr_no, u32 * l, u32 * h);
void wrmsr_on_cpu (ЦП без знака, u32 msr_no, u32 l, u32 h);

3 голосов
/ 29 января 2017

В 2014 году Intel опубликовала информацию об отключении ч / б предварительной выборки с 0x1a4 мс (1a4 мс) для Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell, Broadwell (и, возможно, более новых ядер). Ссылка была найдена bholanath здесь :

https://software.intel.com/en-us/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors Раскрытие управления предварительным сборщиком H / W на некоторых процессорах Intel - Виш Вишванатан (Intel), 24 сентября 2014 г.

В этой статье раскрывается настройка MSR, которая может использоваться для управления различными ч / б-устройствами предварительной выборки, доступными на процессорах Intel на основе следующих микроархитектур: Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell и Broadwell.

Вышеупомянутые процессоры поддерживают 4 типа ч / б предварительных выборок для предварительной выборки данных. Имеется 2 средства предварительной выборки, связанные с кэшем данных L1 (также известный как DCU предварительный модуль DCU, предварительный модуль IP DCU ) и 2 средства предварительной выборки, связанные с кэшем L2 (аппаратный модуль предварительного выбора L2, средство предварительной выборки смежной линии L2) .

На каждом ядре имеется регистр, зависящий от модели (MSR) с адресом 0x1A4, который можно использовать для управления этими 4 устройствами предварительной выборки. Биты 0-3 в этом регистре могут использоваться для включения или отключения этих предварительных сборщиков. Другие биты этого MSR зарезервированы.

Они локальны для каждого ядра процессора и могут быть изменены пользователем root с помощью драйвера ядра msr linux. Они используются Intel для измерения задержки памяти в NUMA с помощью инструмента Intel MLC:

Например, средство Intel Memory Latency Checker (http://www.intel.com/software/mlc)) изменяет средства предварительной выборки посредством записи в MSR 0x1a4 для измерения точных задержек и восстанавливает их в исходное состояние при выходе.

2 голосов
/ 27 января 2014

Я добавляю здесь ответ, потому что предыдущие могут быть применимы не ко всем процессорам Intel.

Для моего процессора Intel Xeon 5650 (семейство 06_2CH) глава руководства 35 определяет, что зарезервированы биты 10–8 регистра IA32_MISC_ENABLE по адресу 0x1A0. Я предполагаю, что это означает, что я не могу включить или выключить предварительную выборку через MSR.

Согласно ответу сотрудника Intel здесь : «Intel не раскрыла, как отключить предварительные выборки на процессорах начиная с Nehalem. Вам нужно отключить предварительные выборки, используя параметры в BIOS».

...