Ok, przepraszam o mojej pierwszej odpowiedzi. Później przeczytałam twoje komentarze poniżej twojego pytania, więc teraz zdaję sobie sprawę, że chcesz opróżnić INSTRUCTION CACHE, aby uruchomić swój program (lub jego części) z pamięci podręcznej, tak aby podczas testowania jego wydajności, również testowałeś początkowy czas ładowania z pamięci głównej do pamięci podręcznej instrukcji. Czy musisz również przepłukać wszelkie dane, które twój kod wykorzysta w pamięci głównej, tak aby dane i kod były świeżymi ładunkami?
Zanim cokolwiek innego, chciałbym wspomnieć, że sama pamięć główna jest również formą pamięci podręcznej, z dysku twardego (albo program na dysku, lub zamiana miejsca na dysku) jest najniższa, najwolniejszy miejsce Twojego programu instrukcje mogą pochodzić od. To powiedziawszy, kiedy pierwszy raz wykonujesz procedurę, jeśli nie została ona wcześniej wczytana do głównej pamięci z dysku, ponieważ znajduje się w pobliżu innego kodu, który już został wykonany, wtedy jego instrukcje procesora będą musiały być najpierw załadowane z dysku. To zajmuje rząd wielkości lub dłużej, niż ładowanie z pamięci głównej do pamięci podręcznej. Następnie, gdy zostanie załadowany do pamięci głównej, trwa gdzieś o rząd wielkości dłuższy, aby załadować z pamięci głównej do pamięci podręcznej, niż ładowanie z pamięci podręcznej do modułu pobierania instrukcji procesora. Jeśli więc chcesz przetestować zimny start swojego kodu, musisz zdecydować, co oznacza zimny start ... wyciągając go z dysku lub wyciągając go z pamięci głównej. Nie znam żadnego polecenia, aby "przepłukać" instrukcje/dane z pamięci głównej, aby zamienić przestrzeń, więc wypłukanie jej do głównej pamięci jest o tyle, ile możesz zrobić (o czym wiem), ale pamiętaj że twoje wyniki testu mogą się różnić od pierwszego uruchomienia (kiedy może być ściągnięcie dysku) do kolejnych serii, nawet jeśli opróżnisz pamięć podręczną instrukcji.
Teraz, jak można by przepłukać pamięć podręczną instrukcji, aby upewnić się, że ich własny kod zostanie przepuszczony do pamięci głównej?
Gdybym musiał to zrobić (bardzo dziwna rzecz do zrobienia w mojej opinii), prawdopodobnie zacznę od znalezienia długości & przybliżonego umieszczenia moich funkcji w pamięci. Ponieważ używam Linuksa, wydaję polecenie "objdump -d {myprogram}> myprogram.dump.txt", a następnie otworzę plik myprogram.dump.txt w edytorze i wyszukuję funkcje, które chcę spłukać i dowiedzieć się, ile czasu zajmuje odejmowanie adresu końcowego od adresu początkowego za pomocą kalkulatora heksadecymalnego. Zapisałbym rozmiary każdego z nich. Później dodałem wywołania cacheflush() w moim kodzie, podając adres każdej funkcji, którą chcę wypróżnić jako "addr" i długość, którą znalazłem jako "nbytes" i ICACHE. Dla bezpieczeństwa pewnie kusiłabym trochę & dodać około 10% do rozmiaru, na wypadek, gdyby zrobiłem kilka poprawek do kodu i zapomniałem dostosować nbytes. Chciałbym wywołać funkcję cacheflush() w ten sposób dla każdej funkcji, którą chcę przepłukać. Następnie, jeśli muszę przepłukać dane również, jeśli używają danych globalnych/statycznych, mogę je również przepłukać (DCACHE), ale jeśli są to dane stosu lub sterty, to naprawdę nic realistycznego, co mogę (lub powinienem zrobić), aby spłukać to z pamięci podręcznej. Próba zrobienia tego byłaby ćwiczeniem głupoty, ponieważ tworzyłby warunek, który nigdy nie byłby bardzo rzadki w normalnej realizacji. Zakładając, że używasz Linuksa ...
#include <asm/cachectl.h>
int cacheflush(char *addr, int nbytes, int cache);
...where cache is one of:
ICACHE Flush the instruction cache.
DCACHE Write back to memory and invalidate the affected valid cache lines.
BCACHE Same as (ICACHE|DCACHE).
BTW, jest to praca domowa dla klasy?
Dlaczego potrzeba * * opróżnić pamięć podręczną? –
jest to wymóg mojego projektu, który wymaga obliczenia czasu potrzebnego do mojej logiki, dlatego muszę opróżnić pamięć podręczną. –
Możliwy duplikat http://stackoverflow.com/questions/1756825/cpu-cache-flush – Tudor