Как программно отключить предварительную выборку аппаратного обеспечения?
Я хотел бы программно отключить предварительную выборку аппаратного обеспечения.
От Оптимизация производительности приложений на микроархитектуре Intel® Core ™ с использованием аппаратно-реализованных префетов и
Как выбрать предварительную выборку оборудования и программного обеспечения на 32-битной архитектуре Intel®,
Мне нужно обновить MSR, чтобы отключить предварительную выборку аппаратного обеспечения.
Вот соответствующий фрагмент:
"Параметры предварительной выборки DPL Prefetch и L2 Streaming Prefetch также могут быть изменены программно путем написания утилиты драйвера устройства для изменения бит в IA32_MISC_ENABLE
register - 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 для измерения точных латентностей и восстановления их в исходное состояние при выходе.