Pytanie toeretyczne dot procesora

0

Witam! Mam pytanie teoretyczne, mianowicie: załóżmy, że mam ilość bajtów zajętych przez rozkaz procesora. Jak z tego wyciągnąć "ilość cykli na bajt"?

0

Policzyć ilość cykli, policzyć ilość bajtów i podzielić :]

Cykle można mierzyć wbudowanym w procesor licznikiem cykli (przynajmniej x86 tak mają, chyba od Pentiumów czy gdzieś w tych okolicach), a bajty np ręcznie.

0

A jakieś wskazówki, jak to zrobić, z czego skorzystać? (może być C/C++/Python/ cokolwiek)

1
  1. Ilość cykli na bajt to jakaś bezsensowna metryka, no ale
  2. Jeśli chcesz zmierzyć to musisz mieć ilość cykli i ilość bajtów
  3. Ilość cykli możesz uzyskać instrukcją RDTSC: http://en.wikipedia.org/wiki/Time_Stamp_Counter
  4. Żeby zmierzyć ilość "wykonanych bajtów" musiałbyś pomiędzy każdym miejscem, z i/ lub do którego jest skok wrzucić zliczanie bajtów do specjalnego licznika
  5. Mając liczbę taktów i bajtów wiadomo co zrobić

Dodam, że co najmniej od czasów Pentium Plain (czyli pierwszego Pentiuma) procesor nie wykonuje instrukcji bezpośrednio. Intstrukcje lecą do dekodera, a zdekodowane mikrooperacje siedzą sobie w malutkiej pamięci podręcznej. W (niektórych wersjach?) Pentium 4 oraz we wszystkich procesorach Intel Core iX chyba od serii 2000 (Sandy Bridge) jest sobie Trace Cache czyli właśnie pamięć podręczna na mikrooperacje, ale ta pamięć jest już dość duża, na tyle, żeby dekoder mógł siedzieć bezczynnie przez zdecydowaną większość czasu (dzięki czemu pobór prądu jest mniejszy).
Mikrooperacje mają zupełnie inną postać niż opkody asemblerowe. Zwykle jedna instrukcja asemblerowa jest zamieniana ja jedną lub więcej mikrooperacji, ale czasem jest tak, że np dwie instrukcje asemblerowe są łączone w jedną mikrooperację (np CMP + JMP). To powinno cię przekonać, że metryka przez ciebie podana jest bez sensu.

Najbardziej dokładną metodą sprawdzenia metryki ilość taktów / ilość bajtów jest po prostu odpalenie symulatora procesora. Np bierzesz symulator układów scalonych oraz projekt jakiegoś procesora i odpalasz kod na tym symulatorze. Dokładna symulacja jest pewnie setki razy wolniejsza niż wykonywanie wprost, no ale czego się nie robi dla nauki :]

Dodam jeszcze, że (przynajmniej nowoczesne) procesory mają dodatkowe układy do debugowania układu, ale z pewnych (oczywistych? :) ) względów te układy są zablokowane w wersjach konsumenckich. Być może te układy mogłyby ułatwić twoje zadanie, no ale i tak nie masz do nich dostępu :]

2

Nowoczesne procesory mają wiele dekoderów instrukcji, cache, są w stanie wykonywać parę instrukcji na raz. Dodatkowo na systemach wielozadaniowych planista może w każdej chwili stwierdzić że chce nas przełączyć i nasz pomiar będzie niedokładny.
W nowoczesnych procesorach to jak długo wykonywać się będzie dana instrukcja zależy bardziej od instrukcji nieopodal niż od niej samej. Jeżeli procesor ma dany adres w cache to odwołanie do pamięci będzie dużo szybsze. Jeżeli instrukcje obok były instrukcjami prostymi niezwiązanymi z aktualną, to zapewne była ona wykonywana jeszcze zanim tamte się zakończyły. I tak dalej...
Dlatego obecnie raczej nie podaje się ilości taktów maszynowych przypadających na daną instrukcję bo jest za dużo niewiadomych i próby oszacowania ilości taktów są skazane na porażkę.

0
Wibowit napisał(a):

Najbardziej dokładną metodą sprawdzenia metryki ilość taktów / ilość bajtów jest po prostu odpalenie symulatora procesora. Np bierzesz symulator układów scalonych oraz projekt jakiegoś procesora i odpalasz kod na tym symulatorze. Dokładna symulacja jest pewnie setki razy wolniejsza niż wykonywanie wprost, no ale czego się nie robi dla nauki :]

Żaden producent nie da ci planów współczesnego procesora, tak byś mógł sobie symulować co się wewnątrz dzieje.
Zostaje ci tylko możliwość napisania emulatora na podstawie dokumentacji, ale prawie na pewno będzie miał zupełnie inną charakterystykę wydajności, i jedyne co zmierzysz to swój własny kod, a nie prawdziwy procesor.

0

Jak się dostanę na odpowiednie stanowisko to będę miał dostęp :P

0
Azarien napisał(a):

Żaden producent nie da ci planów współczesnego procesora, tak byś mógł sobie symulować co się wewnątrz dzieje.
Zostaje ci tylko możliwość napisania emulatora na podstawie dokumentacji, ale prawie na pewno będzie miał zupełnie inną charakterystykę wydajności, i jedyne co zmierzysz to swój własny kod, a nie prawdziwy procesor.

Nawet zakładając dostęp do takich planów emulacja takiego procesora byłaby problematyczna jako że to bardzo skomplikowany układ. Tutaj jest emulacja MOS 6502: http://visual6502.org/JSSim/index.html - mimo że uruchamiam ją na moim dwurdzeniowym E5200 to nie jest to zbyt duża prędkość.
Poza tym, nawet posiadając procesor zemulowany nadal pozostają wszystkie charakterystyki cache, przewidywania skoków, wielu dekoderów instrukcji i innych technik przyśpieszających wykonanie które będą skutecznie utrudniać wykonanie jakichkolwiek pomiarów. Wszystko zależy od tego jak dobrze procesor przewidzi co będzie chciał wykonać nasz kod oraz od naszego kodu. Nawet pojęcie cyklu może być ciężkie do określenia gdy jest parę dekoderów instrukcji które są niezależne od siebie.
Więc temat jest bardzo skomplikowany, a skoro inżynierowie Intela dali sobie spokój z określaniem tego to zapewne jest to znak że po prostu było to zbyt trudne.

0

Więc temat jest bardzo skomplikowany

Skoro temat jest skomplikowany, to należy opisać go w sposób skomplikowany: Jest M dekoderów. Każdy dekoder ma N faz. Instrukcja xxx wymaga dostępu do pamięci. Instrukcja xxy nie wymaga. Instrukcja xxx trwa 3 cykle, instrukcja xxy 2 cykle plus odczyt słowa z pamięci. Charakterystyka RAM opisana w rozdziale 666.

Pytanie tylko, na co to komu...

1 użytkowników online, w tym zalogowanych: 0, gości: 1