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

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

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

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

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

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

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. Я попытался сделать это в модуле ядра... и убил машину.

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

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

Ответ 1

От справки 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-системы должны передать структуру cpu в качестве первого аргумента:
void rdmsr_on_cpu (unsigned int cpu, u32 msr_no, u32 * l, u32 * h);
void wrmsr_on_cpu (unsigned int cpu, u32 msr_no, u32 l, u32 h);

Ответ 2

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

Ниже приведена аппаратная предварительная программа (путем снятия бит бит 9):

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

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

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

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

Ответ 3

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

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

В соответствии с ответом от сотрудника Intel здесь: "Intel не раскрывает, как отключить префетеры на процессорах от Nehalem onward.You", ll необходимо отключить prefetchers используя варианты в BIOS. "

Ответ 4

В 2014 году Intel опубликовала информацию о отключении prefetcher h/w с 0x1a4 msr (1a4 msr) для 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 - Vish Viswanathan (Intel), 24 сентября 2014 г.

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

Вышеупомянутые процессоры поддерживают 4 типа h/w prefetchers для предварительной выборки данных. Существует 2 префишеры, связанные с кэшем L1-данных (также известный как предварительный выбор DCU DCU, предварительный набор DCU IP) и 2 префишеры, связанные с кэшем L2 (предварительный выборщик L2, предварительный выборщик L2 с соседними кэшами).

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

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

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