Jak wyłączyć pamięci podręczne L1 i L2 procesora?

10

Czy można wyłączyć pamięć podręczną L1 i / lub L2 w systemie Ubuntu 14.04 (najlepiej w języku wyższego poziomu, takim jak Python)? Jeśli tak to jak?

Ponadto, czy wyłączenie pamięci podręcznej różni się znacznie między różnymi architekturami? Jeśli tak, bardziej interesuje mnie ARM Cortex-A15.

EDYTOWAĆ

Podczas badania, jak wyłączyć pamięć podręczną, dowiedziałem się o pliku „drop_caches” w / proc / sys / vm / z dokumentacji kernel.org

„Zapisanie tego spowoduje, że jądro będzie upuszczać czyste pamięci podręczne, a także obiekty płytowe, takie jak dentries i i-węzły. Można je odzyskać.”

...

„Ten plik nie jest środkiem do kontrolowania wzrostu różnych pamięci podręcznych jądra (i-węzły, dentries, pagecache itp.). Obiekty te są automatycznie odzyskiwane przez jądro, gdy pamięć jest potrzebna gdzie indziej w systemie.”

Nie wydaje mi się, że tego szukam, ponieważ nie tylko nie wydaje się, aby wyłączało pamięć podręczną, myślałem, że pamięć wirtualna znajduje się w systemie operacyjnym, a nie w sprzęcie. Moim celem jest wyłączenie pamięci podręcznej, aby żądanej pamięci szukać w innym miejscu, na przykład w pamięci RAM.

EDYTOWAĆ

Aby to wyjaśnić, rozumiem, co wyłączenie systemu pamięci podręcznej może zrobić w systemie. Jest to jednak powszechna technika stosowana w aplikacjach kosmicznych w celu zwiększenia niezawodności w aplikacjach o kluczowym znaczeniu dla bezpieczeństwa. Oto niektóre zasoby dokumentujące to zjawisko:

Ograniczanie wbudowanych programów powodowanych przez promieniowanie awarii dzięki pamięci podręcznej

Wytyczne dotyczące testowania mikroprocesorów w zakresie promieniowania naziemnego w środowisku promieniowania kosmicznego

Istnieją nawet książki na ten temat:

Efekty promieniowania jonizującego w elektronice: od wspomnień do rejestratorów

AustinTronics
źródło
Jeśli próbujesz robić rzeczy takie jak wyłączanie pamięci podręcznej, robisz programowanie osadzone, jeśli robisz programowanie osadzone, prawdopodobnie powinieneś używać języka osadzonego (C), a ja nie użyłbym systemu operacyjnego. Poza tym wyłączenie pamięci podręcznej znacznie spowolni twój system.
Sam
Mam inne sposoby na przyspieszenie systemu bez pamięci podręcznej, ale nie mogę powiedzieć, jak skuteczne są te metody, dopóki nie wyłączę pamięci podręcznej i nie uruchomię testów porównawczych. Jestem bardzo świadomy, że C lub montaż jest preferowanym wyborem dla aplikacji osadzonych. Jednak dzieje się kilka rzeczy na wysokim poziomie, które mają sens w Pythonie. Byłoby po prostu wygodniej, gdyby Python obsługiwał coś takiego jak wyłączenie pamięci podręcznej dla mojej konkretnej aplikacji. Jeśli chodzi o zdejmowanie systemu operacyjnego, niestety dla mnie nie ma opcji bare-metal.
AustinTronics

Odpowiedzi:

2

Nie możesz tego zrobić bezpośrednio w Pythonie, ponieważ potrzebujesz do tego modułu jądra (i praw root do załadowania tego modułu).

Zobacz http://lxr.free-electrons.com/source/arch/arm/mm/cache-v7.S#L21, aby dowiedzieć się, co trzeba zrobić, aby unieważnić pamięć podręczną L1 (unieważnij, nie wyłącz).

Różne architektury procesorów (np. X86 vs ARM) wymagają innego kodu asemblera (instrukcji procesora), aby wyłączyć pamięć podręczną. Nie jestem pewien, czy jądro Linuksa ma jakąkolwiek możliwość wyłączenia pamięci podręcznej L1 / L2 / L3 / L4 i jeśli tak, uważam, że byłby używany wewnętrznie przez krótki okres czasu, ponieważ procesor jest wolny bez tych skrzynek.

Zobacz Czy istnieje sposób na wyłączenie pamięci podręcznej procesora (L1 / L2) w systemie Linux? link, w jaki sposób można wyłączyć pamięć podręczną w systemie x86 / x64 (należy zmienić rejestr cr0). W celu sprawdzenia ARM zachowanie wyłączonej pamięci podręcznej .

Nie jestem pewien, czy w pełni rozumiesz, co robią pamięci podręczne procesora. Czy możesz wyjaśnić, dlaczego chcesz obniżyć wydajność swojego systemu?

tehnicaorg
źródło
Aplikacja jest wbudowanym systemem obliczeniowym o wysokiej wydajności dla przemysłu lotniczego. Czas działania jest ważniejszy dla mojej aplikacji niż wydajność. Wiem, że to brzmi dziwnie, ale zjawisko to jest dobrze udokumentowane.
AustinTronics
Jak możesz mieć „wydajną” aplikację bez pamięci podręcznej procesora? Co pamięci podręczne mają wspólnego z czasem pracy?
tehnicaorg,
2
Jestem programistą w dziale badań i rozwoju, robimy wiele szalonych rzeczy. Przepraszam, jeśli wydaje mi się, że pomijam informacje lub jestem niejasny w moich odpowiedziach, ale nie mogę uzyskać tyle, ile bym chciał, ponieważ są to informacje o prawości. Jeśli jesteś zainteresowany tym, co pamięć podręczna ma wspólnego z czasem pracy w aplikacjach kosmicznych, oto publicznie dostępny artykuł JPL . Oto też artykuł na ten temat.
AustinTronics,
1
Jak na ironię, wyłączenie pamięci podręcznej L1 ma dziś sens!
Pierścień Ø
4

Możesz to zrobić za pomocą małego kodu ASM, patrz rozdział 11 Przewodnika po programowaniu Intel System

11.5.3 Zapobieganie buforowaniu

Aby wyłączyć pamięci podręczne L1, L2 i L3 po ich włączeniu i otrzymaniu zapełnienia pamięci podręcznej, wykonaj następujące czynności: 1. Przejdź do trybu pamięci podręcznej bez zapełniania. (Ustaw flagę CD w rejestrze kontrolnym CR0 na 1, a flagę NW na 0. 2. Opróżnij wszystkie pamięci podręczne za pomocą instrukcji WBINVD. 3. Wyłącz MTRR i ustaw domyślny typ pamięci na niebuforowany lub ustaw wszystkie MTRR dla typu pamięci niebuforowanej (patrz omówienie dyskusji na temat pola TYPE i flagi E w rozdziale 11.11.2.1, „IA32_MTRR_DEF_TYPE MSR”).

Nie znam modułu Python, który to implementuje.

Gajusz
źródło