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

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

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

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

"Настройки DPL Prefetch и L2 Streaming Prefetch также можно изменить программно, написав утилиту драйвера устройства для изменения битов в IA32_MISC_ENABLE регистр - 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. Я попытался сделать это в модуле ядра... и убил машину.

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

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

4 ответа

Решение

Из справочника 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 (без знака int-процессор, u32 msr_no, u32 l, u32 h);

Вы можете включить или отключить аппаратные средства предварительной выборки, используя 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 смещение.

В 2014 году Intel опубликовала информацию об отключении ч / б предварительной выборки с 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 - Виш Вишванатан (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 для измерения точных задержек и восстанавливает их в исходное состояние при выходе.

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

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

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

Другие вопросы по тегам