Jak programowo wyłączyć wstępne ustawianie sprzętu?

Chciałbym programowo wyłączyć wstępne ustawianie sprzętu.

Z optymalizacji wydajności aplikacji na mikroarchitekturze Intel® Core™ przy użyciu zaimplementowanych sprzętowo Prefetcherów oraz Jak wybrać między Hardware I Software Prefetch na 32-bitowej architekturze Intel® , Muszę zaktualizować MSR, aby wyłączyć wstępne ustawianie sprzętu.

Oto odpowiedni fragment:

" Ustawienia Prefetch DPL i L2 Streaming Prefetch mogą również być zmieniane programowo zapisując narzędzie sterownika urządzenia do zmiany bitów w IA32_MISC_ENABLE rejestr - MSR 0x1A0. Takie narzędzie oferuje możliwość włączenia lub wyłączenia prefetch mechanizmy bez konieczności przestoju serwera.

Poniższa tabela pokazuje bity w IA32_MISC_ENABLE MSR, które muszą zostać zmienione, aby kontrolować Prefetch strumieniowy DPL i 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"

Próbowałem użyć http://etallen.com/msr.html ale to nie zadziałało. Próbowałem też używanie wrmsr W asm/msr.h bezpośrednio, ale to segfaults. Próbowałem to zrobić w module jądra ... i zabił maszynę.

BTW-używam kernela 2.6.18-92.el5 i ma MSR połączone w jądrze:

$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...
Author: Cœur, 2009-04-23

4 answers

From the Intel reference:
Ta instrukcja musi być wykonywana na poziomie uprawnień 0 lub w trybie adresu rzeczywistego; w przeciwnym razie zostanie wygenerowany ogólny wyjątek #GP (0). Podanie zastrzeżonego lub nie wdrożonego adresu MSR w ECX spowoduje również ogólny wyjątek ochrony.

...
Instrukcja CPUID powinna być używana do określenia, czy MSR są obsługiwane (EDX[5]=1) przed użyciem tej instrukcji.

Więc twoja wina może być związana z procesorem, który nie obsługa MSRs lub użycie niewłaściwego adresu MSR.

Istnieje wiele przykładów użycia MSR w źródle jądra:

W źródle jądra, dla pojedynczego procesora, demonstruje wyłączenie prefetch dla Xeon W arch/i386/kernel/cpu/intel.c, w funkcji:

static void _ _ cpuinit Intel_errata_workarounds (struct cpuinfo_x86 *c)

Argumentami funkcji rdmsr są numer msr, wskaźnik do niskiego 32-bitowego słowa i wskaźnik do wysokiego 32-bitowego słowa.
Wrmsr argumentami funkcji są numer msr, niska 32-bitowa wartość słowa i wysoka 32-bitowa wartość słowa.

systemy wielordzeniowe lub smp muszą przekazać struct procesora jako pierwszy argument:
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);

 13
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-24 09:22:26

Możesz włączyć lub wyłączyć prefetchery sprzętowe za pomocą msr-tools http://www.kernel.org/pub/linux/utils/cpu/msr-tools/.

Poniżej znajduje się konfigurator sprzętowy (wyłączając bit 9):

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

Następujące wyłącza sprzętowy prefetcher (włączając bit 9):

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

Programowo możesz to zrobić jako root otwierając /dev/cpu/<cpunumber>/msr i użycie pswrite do zapisu do msr "plik" w offsecie 0x1a0.

 27
Author: Carlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 07:40:12

W 2014 roku Intel opublikował informacje o wyłączaniu prefetchera h / W z 0x1a4 msr (1A4 msr) dla Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell, Broadwell (i prawdopodobnie nowszych rdzeni). Link został znaleziony przez bholanath tutaj :

Https://software.intel.com/en-us/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors{[3]Vish Viswanathan (Intel), 24 września 2014

Ten artykuł przedstawia ustawienia MSR, które mogą być używane do sterowania różnymi prefetcherami h/W, które są dostępne na procesorach Intel opartych na następujących mikroarchitekturach: Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell i Broadwell.

Wyżej wymienione procesory obsługują 4 typy prefetcherów h/W do wstępnego ustawiania danych. Istnieją 2 prefetchery związane z L1-data cache (znany również jako DCU prefetcher DCU, DCU IP prefetcher) i 2 prefetchery w tym celu należy użyć funkcji prefetcher, a następnie użyć funkcji prefetcher.

Na każdym rdzeniu znajduje się rejestr specyficzny dla modelu (MSR) o adresie 0x1a4, który może być użyty do sterowania tymi 4 prefetcherami. Bity 0-3 w tym rejestrze mogą być użyte do włączenia lub wyłączenia tych prefetcherów. Pozostałe bity tego MSR są zastrzeżone.

Są lokalne dla każdego rdzenia CPU i mogą być zmieniane przez roota za pomocą sterownika jądra msr. Są one wykorzystywane przez Intel do pomiaru opóźnienia pamięci w NUMA za pomocą narzędzia Intel MLC:

Na przykład narzędzie sprawdzające opóźnienie pamięci Intel ( http://www.intel.com/software/mlc ) modyfikuje prefetchery poprzez zapis do MSR 0x1a4 w celu zmierzenia dokładnych opóźnień i przywraca je do pierwotnego stanu przy wyjściu.

 4
Author: osgx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:19

Dodaję tutaj odpowiedź, ponieważ poprzednie mogą nie dotyczyć wszystkich procesorów Intela.

Dla mojego procesora Intel Xeon 5650 (06_2ch family) instrukcja Rozdział 35 Określa, że bity 10 do 8 rejestru IA32_MISC_ENABLE pod adresem 0x1a0 są zarezerwowane. Domyślam się, że oznacza to, że nie mogę włączyć i wyłączyć prefetcher trhough MSR.

Zgodnie z odpowiedzią pracownika Intela TUTAJ : "Intel nie ujawnił, jak wyłączyć prefetchery na procesory z Nehalem.Musisz wyłączyć prefetchery za pomocą opcji w BIOSie."

 2
Author: Manuel Selva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 07:17:32