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
...
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);
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
.
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 :
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.
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."
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