2008-09-15 12 views

Odpowiedz

0

Nie jestem pewien, dlaczego potrzebny jest do tego montaż. Jeśli korzystasz z komputera z systemem plików/proc, to działa:

> cat /proc/cpuinfo 

może dać ci to, czego potrzebujesz.

1

To była intencja rzeczy takich jak BogoMIPS, ale procesory są teraz dużo bardziej skomplikowane. Procesory Superskallar mogą wydawać wiele instrukcji na zegar, czyniąc każdy pomiar w oparciu o liczenie cykli zegara, aby wykonać blok instrukcji wysoce niedokładnych.

Częstotliwości procesora są również zmienne w zależności od oferowanego obciążenia i/lub temperatury. Fakt, że procesor pracuje obecnie z częstotliwością 800 MHz, nie oznacza, że ​​zawsze będzie działał z częstotliwością 800 MHz, może to w razie potrzeby zwiększać lub zmniejszać przepustowość.

Jeśli naprawdę potrzebujesz znać częstotliwość taktowania, powinna ona zostać przekazana jako parametr. EEPROM na płycie będzie dostarczał częstotliwość podstawową, a jeśli zegar będzie się różnić, będziesz musiał odczytać rejestry stanu zasilania procesora (lub wykonać wywołanie systemu operacyjnego), aby dowiedzieć się częstotliwości w tej chwili.

Przy tym wszystkim, mogą istnieć inne sposoby osiągnięcia tego, co próbujesz zrobić. Na przykład, jeśli chcesz wykonać precyzyjne pomiary czasu, w jakim zajmuje dana ścieżka kodowa, procesor prawdopodobnie ma liczniki wydajności działające z ustaloną częstotliwością, która jest lepszą miarą czasu na zegarze niż odczyt rejestru zliczającego.

15

Procesory Intel po Core Duo obsługują dwa rejestry specyficzne dla modelu o nazwie IA32_MPERF i IA32_APERF.
MPERF liczy z maksymalną częstotliwością, jaką obsługuje procesor, a APERF zlicza aktualną częstotliwość.

Rzeczywista częstotliwość jest dana przez:

freq = max_frequency * APERF/MPERF

Można je odczytać z tego przepływu

; read MPERF 
mov ecx, 0xe7 
rdmsr 
mov mperf_var_lo, eax 
mov mperf_var_hi, edx 

; read APERF 
mov ecx, 0xe8 
rdmsr 
mov aperf_var_lo, eax 
mov aperf_var_hi, edx 

jednak pamiętać, że rdmsr jest uprzywilejowana instrukcja i może działać tylko w ringu 0.

Nie wiem, czy system operacyjny zapewnia interfejs do ich odczytu, ale ich głównym zastosowaniem jest zarządzanie energią, więc może nie zapewnić taki interfejs.

+0

fajne!Jak sprawiłeś, że równanie było tak miłe? –

+3

Użyłem tej strony do przekonwertowania kodu LaTeX na GIF: http://en.wikibooks.org/wiki/LaTeX/Mathematics. Składnia LaTeX dla matematyki jest opisana tutaj: http://pl.wikibooks.org/wiki/LaTeX/Mathematics. –

+1

Ups, pierwsza strona powinna być http://texify.com/. –

6

będę data sobie z różnymi szczegółami w tej odpowiedzi, ale co do cholery ...

musiałem rozwiązać ten problem rok temu na komputerach z systemem Windows, więc miałem do czynienia z serii Intel x86 procesory takie jak 486, Pentium i tak dalej. Standardowym algorytmem w tej sytuacji było wykonanie długiej serii instrukcji DIVide, ponieważ są to zazwyczaj najbardziej powiązane z CPU pojedyncze instrukcje w zestawie Intela. Tak więc pobieranie z pamięci i inne problemy architektoniczne nie mają istotnego wpływu na czas wykonywania instrukcji - kolejka pobierania wstępnego jest zawsze pełna, a sama instrukcja nie dotyka żadnej innej pamięci.

Czas ten byłby używany z zegarem o najwyższej rozdzielczości, do której można uzyskać dostęp w środowisku, w którym się znajdujesz. (W moim przypadku pracowałem w pobliżu czasu rozruchu na kompatybilnym komputerze, więc bezpośrednio programowałem układy czasowe na płyta główna.Niezalecane w prawdziwym systemie operacyjnym, zazwyczaj jest tam odpowiedni interfejs API do wywoływania tych dni).

Głównym problemem, z jakim masz do czynienia, są różne typy procesorów. W tym czasie pojawili się Intel, AMD i niektórzy mniejsi producenci, tacy jak Cyrix produkujący procesory x86. Każdy model miał swoją własną charakterystykę działania w stosunku do instrukcji DIV. Moja funkcja synchronizacji czasu po prostu zwróci liczbę cykli zegarowych wykonanych przez pewną ustaloną liczbę instrukcji DIV wykonanych w ciasnej pętli.

Więc to, co zrobiłem, to zebranie pewnych ustawień czasowych (nieprzetworzonych wartości zwracanych z tej funkcji) z rzeczywistych komputerów PC z każdym modelem procesora, który chciałem, i zapisanie ich w arkuszu kalkulacyjnym w stosunku do znanej szybkości procesora i typu procesora. Właściwie to miałem narzędzie z wiersza poleceń, które było tylko cienką powłoką wokół mojej funkcji pomiaru czasu, i wziąłbym dysk do sklepów komputerowych i uzyskałem synchronizację poza modelami wyświetlacza! (Pracowałem wówczas dla bardzo małej firmy).

Stosując te surowe czasy, mogę wykreślić teoretyczny wykres taktowania co powinienem dostać do jakiejkolwiek znanej prędkości danego procesora.

Tu był podstęp: Zawsze nienawidziłem, gdy chcesz uruchomić narzędzie i byłoby ogłosić, że CPU wynosiła 99,8 Mhz lub cokolwiek. Wyraźnie było to 100 Mhz i był tylko mały błąd zaokrąglenia w pomiarze. W moim arkuszu kalkulacyjnym zarejestrowałem rzeczywiste prędkości, które zostały sprzedane przez każdego producenta procesora. Następnie użyłbym wykresu faktycznych czasów, by oszacować przewidywane czasy dla dowolnej znanej prędkości. Ale zbudowałbym tabelę punktów wzdłuż linii, gdzie czasy powinny zaokrąglić się do następnej prędkości.

Innymi słowy, jeśli 100 tyknięć do zrobienia, wszystkie powtarzające się dzielenia oznaczały 500 MHz, a 200 znaków oznaczało 250 MHz, to zbudowałbym tabelę, która mówi, że wszystko poniżej 150 było 500 MHz, a wszystko powyżej 250. Mhz. (Zakładając, że były to jedyne dwie prędkości dostępne od tego sprzedawcy chipów). To było miłe, ponieważ nawet jeśli jakiś dziwny fragment oprogramowania na PC wyrzucił mój czas, wynik końcowy często byłby martwy.

Oczywiście teraz, w tych dniach podkręcania, dynamiczny zegar przyspiesza do zarządzania zasilaniem i innych podobnych sztuczek, taki system byłby znacznie mniej praktyczne. Przynajmniej musisz zrobić coś, aby upewnić się, że procesor był w swojej najwyższej dynamicznie wybranej prędkości najpierw przed uruchomieniem funkcji pomiaru czasu.

OK, wrócę teraz do wynoszenia dzieci z mojego trawnika.

+2

Powiedziałbym, że prędkość 99,8 może być dokładna, * celują * dla 100MHz, ale brakowało. Nie oczekujesz od nich odkładania chipów systemowych, które są trochę poza czasem tak, jakbyś chciał zegarki na rękę. –

+1

Zgadzam się. Nie tylko masz teorię celu, ale także masz czynniki, które wymagają zmiany poziomu w komputerze. Płyty główne faktycznie pobierają zmienną ilość napięcia. Procesor "100 MHz" również może być w rzeczywistości procesorem 25 MHz z mnożnikiem 4x lub 33 MHz z mnożnikiem 3x. –

0

Szybkie google na AMD i Intel pokazuje, że CPUID powinien dać ci dostęp do maksymalnej częstotliwości procesora.

+0

Myślę, że będzie on jedynie identyfikował model procesora. –

1

"lmbench" dostarcza algorytm częstotliwości procesora przenośny dla różnych architektur.

Wykonuje kilka różnych pętli, a prędkość zegara procesora jest największym wspólnym dzielnikiem częstotliwości wykonawczych różnych pętli.

ta metoda powinna zawsze działać, gdy jesteśmy w stanie uzyskać pętle z liczbą cykli, które są względnie pierwsze.

http://www.bitmover.com/lmbench/

4

Jednym ze sposobów na x86 Intel CPU od Pentium byłoby użyć dwóch pobieranie próbek z instrukcją RDTSC z pętli opóźniającej o znanym czasie ścianie, np

#include <stdio.h> 
#include <stdint.h> 
#include <unistd.h> 

uint64_t rdtsc(void) { 
    uint64_t result; 
    __asm__ __volatile__ ("rdtsc" : "=A" (result)); 
    return result; 
} 

int main(void) { 
    uint64_t ts0, ts1;  
    ts0 = rdtsc(); 
    sleep(1); 
    ts1 = rdtsc();  
    printf("clock frequency = %llu\n", ts1 - ts0); 
    return 0; 
} 

(na 32-bitowym platformy z GCC)

RDTSC jest dostępny w pierścieniu 3, jeśli ustawiono flagę TSC w CR4, co jest powszechne, ale nie jest gwarantowane. Jedną z wad tej metody jest to, że jest ona podatna na zmiany w skalowaniu częstotliwości wpływające na wynik, jeśli wystąpią w opóźnieniu. Aby złagodzić sytuację, można wykonać kod, który utrzymuje procesor zajętości i stale odpytywać czas systemowy, aby sprawdzić, czy upłynął okres opóźnienia, aby utrzymać procesor w stanie najwyższej częstotliwości.

+0

RDTSC zlicza "cykle odniesienia" na nowoczesnych procesorach, a nie na taktach rdzeniowych. To określi "znamionową"/maksymalną podtrzymywaną częstotliwość taktowania na większości nowoczesnych procesorów, a nie aktualne zegary. Może to być tym, czego naprawdę chcesz, z wyjątkiem przetaktowanych systemów, które działają na stałe z różną szybkością. –

2

używam następujący (pseudo) Algorytm:

basetime=time(); /* time returns seconds */ 

while (time()==basetime); 
stclk=rdtsc(); /* rdtsc is an assembly instruction */ 

basetime=time(); 
while (time()==basetime 
endclk=rdtsc(); 

nclks=encdclk-stclk; 

W tym momencie można założyć, że już określona częstotliwość zegara ale choć wydaje się poprawna może ulec poprawie.

Wszystkie komputery zawierają urządzenie PIT (programowalny interwał czasowy), które zawiera liczniki, które są używane (używane) do portów szeregowych i zegar systemowy. Zasilano go częstotliwością 1193182 Hz. Licznik zegara systemowego ustawiono na najwyższą wartość odliczania (65536), co daje częstotliwość taktowania zegara systemowego 1193182/65536 => 18,2065 Hz lub raz 54,925 milisekund.

Liczba odcisków potrzebnych do zwiększenia zegara do następnej sekundy będzie zatem zależna. Zazwyczaj wymagane jest 18 cykli, a czasami 19. Można to wykonać, wykonując dwukrotnie powyższy algorytm i zapisując wyniki. Te dwa wyniki będą równoznaczne z dwiema 18 sekwencjami kleszczowymi lub jedną 18 i jedną 19. Dwa 19 z rzędu nie wystąpią. Więc biorąc mniejszy z dwóch wyników, otrzymasz 18 sekund na sekundę. Dostosuj ten wynik, mnożąc przez 18.2065 i dzieląc przez 18,0 lub używając arytmetycznej liczby całkowitej, pomnóż przez 182065, dodaj 90000 i podziel przez 180000. 90000 to połowa z 180000 i jest tam zaokrąglanie. Jeśli wybierzesz obliczenia na trasie całkowitej, upewnij się, że używasz mnożenia i podziału 64-bitowego.

Będziesz miał teraz prędkość zegara procesora xw Hz, która może być konwertowana na kHz ((x + 500)/1000) lub MHz ((x + 5000000)/1000000). 500 i 500000 to odpowiednio połowa z 1000 i 1000000 i są tam zaokrąglenia. Aby obliczyć MHz, nie należy przekraczać wartości kHz, ponieważ mogą pojawić się problemy z zaokrąglaniem. Użyj wartości Hz i drugiego algorytmu.

0

Jedną z opcji jest do wykrywania częstotliwości procesora, poprzez uruchomienie kodu ze znanymi instrukcji na pętli

Funkcjonalność ta jest zawarta w 7zip, od około v9.20 myślę.

> 7z b 
7-Zip 9.38 beta Copyright (c) 1999-2014 Igor Pavlov 2015-01-03 

CPU Freq: 4266 4000 4266 4000 2723 4129 3261 3644 3362 

Ostateczna liczba ma być prawidłowe (i na moim komputerze i wielu innych, znalazłem, że jest to całkiem poprawne - test przebiega bardzo szybko więc turbo może nie kopać, a serwery ustawione w Balanced/tryby oszczędzania energii najprawdopodobniej dać odczyty około 1GHz)

kod źródłowy jest na GitHub (Dziennik źródłem jest pobieranie z 7-zip.org)

z najbardziej znacząca część istoty:

#define YY1 sum += val; sum ^= val; 
#define YY3 YY1 YY1 YY1 YY1 
#define YY5 YY3 YY3 YY3 YY3 
#define YY7 YY5 YY5 YY5 YY5 
static const UInt32 kNumFreqCommands = 128; 

EXTERN_C_BEGIN 

static UInt32 CountCpuFreq(UInt32 sum, UInt32 num, UInt32 val) 
{ 
    for (UInt32 i = 0; i < num; i++) 
    { 
    YY7 
    } 
    return sum; 
} 

EXTERN_C_END