Benchmark procesora. Początki...

0

Witam,
Jestem studentem i dostałem za zadanie na projekcie z Organizacji komputerów napisać program w C++ - Benchmark procesorów!
Wiedzę z C/C++ mam na poziomie podstawowym, no może podstawowy to jednak za skromnie powiedziane, ale patrząc na niektóre posty i wypowiedzi ludzi, to w porównaniu do wielu choćby na tym forum, moją wiedze mogę określić jako podstawową.

Nie chcę tu nikogo prosić o wklejenie kodu jakiegoś Benchamarka, bo nie chce iść na łatwiznę, jedynie proszę o jakieś wskazówki i porady.

Na początek myślę, że mój program powinien pobierać dane o procesorze - to jest mój pierwszy problem. W dalszej części będzie używał biblioteki, którą napisze kolega (takie mam wymagania).

Pozdrawiam

0

Kiedys (bardzo kiedys ;) ) pisałem taką aplikacje.
Wyglądało to mniej wiecej tak, że uruchamiam nowy wątek i w nim w pętli wykonuje jakies operacje arytmetyczne (na liczbach całkowitych i na zmiennoprzecinkowych), a w głównym wątku liczy czas. Pamiętam, że pobierało się tykniecia zegara od startu komputera.
Można też obliczać ile razy przejdzie pętle w zadanym czasie.

0

Problem jest taki, że ja to nie moge zrobić takiego prościutkiego benchmarka, na zasadzie dam jakies liczenie do zrobienia czy zabawe z liczbami pierwszymi itp itd... Prowadzący kazał mi przygotować program gotowy do kazdego typu procesorów... dwurdzeniowe, htt.. no musi to byc ciupke bardziej skomplikowane, no i nie wiem czy po prostu mam mu kazać dwie operacje na raz robić.. chorobcia bedzie ciezko!

0

No to facet chce cie wykończyć ;-( .Albo sprzedać ten program :-D
Kiedyś znalazłem taki kod pod Win32 do obliczania prędkości Procesora

EDIT : Kod podany przez - ' Szczawik ' na 4programmers.

(Jeśli może być Windows bo pewnie sobie życzy pod wszystkie istniejące systemy [glowa] .. ) :
Funkcja zwraca w MHz

#include <math.h>

int CheckCPUSpeed(){


  const int DelayTime = 500;

  DWORD TimerHi, TimerLo ;
  int PriorityClass, Priority ;

//Ustawienie priorytetu działania
PriorityClass = GetPriorityClass(GetCurrentProcess);
Priority = GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

//Dokonanie pomiaru
Sleep(10);
  asm{
  dw 310Fh // rdtsc
  mov TimerLo, eax
  mov TimerHi, edx
  }
Sleep(DelayTime);
  asm {
   dw 310Fh //rdtsc
  sub eax, TimerLo
  sbb edx, TimerHi
  mov TimerLo, eax
  mov TimerHi, edx
  }

//Przywrócenie priorytetu działania i zwrócenie wyniku
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
return (int)(floor((TimerLo / (1000.0 * DelayTime))));
}
0

Wiadomo, że nie ma jednoznacznego testu który określi który procek jest szybszy.
Najlepiej zrobić serie testów.
W tym tez taki, gdzie uruchamiasz kilka(nascie) wątków (z obliczeniami), zeby np. uzwglednic ze procek ma wiecej rdzeniu itd.

Powinny być też jakieś testy wykorzystujące SSE, 3DNow!...

0

@dzejo
dzięki za odp, zaraz sprawdzę ten kod:)

@TeWuX
tak właśnie sie obawiam że seria testów to dosyć długa powinna być... sporo różnych technologi mam do sprawdzenia.. ojoj ale bedzie roboty:0

0

Dzieki , dzięki , ;-) ;-) nigdy nie zajmowałem się tym tematem , ale
określ dokładniej co ma zawierać test procesora
pamięć , typ , itd , i czy prog ma chodzić pod Win32 ..???

Trochę informacji ...
Może ktoś coś jeszcze wyszpera w przepastnych archiwach X ...

0

Odnośnie platformy na jakiej ma działac to hmm... nie ustalałem z prowadzącym więc dla ułatwienia przyjmijmy Win32, ok!

A co ma zawierać test?
Wiesz temat to benchmark. I teraz chyba widz polega na tym, żeby przetestować pod kątem tych wszystkich instrukcji w nowszych i starszych procesorach, szczerze mówiąc sam jeszcze nie wiem ile ich jest...

0

No to tu mamy problem , bo w aplikacjach C i C++ w czystym kodzie
nie mozna sprawdzić jak się wykonują ( czyt.jakie się wykonują) , pozostaje Asembler ,

to C czy Asembler ? czy mieszanka zapytaj prow.

Pisanie aplikacji nie jest uwarunkowane CPU , (mniej więcej)
to o czym piszesz wymaga większej wiedzy i ingerencji (wiedzy na temat) w Asm .

Odnośnie tematu Win to mam tylko taki pomysł na razie , uruchomic wątek
zablokować go ,
zmierzyć czas ,
wykonać tajemnicze instrukcje
zmierzyć czas ,
porównac czas przed i po .

Tyle ze w systemach wielozadaniowych jest to dosyć trudna sprawa ,
wyniki są trudne do ustalenia bo czas wykonania wątku określa system ,
zrobienie blokady zawiesza cały system (atom) do zakończenia procedur .
jakieś takie dziwne :|

Tylko właśnie te tajemnicze instrukcje ...
reszta jest w miare opisana ...

0

OK, jutro mam te zajęcia, więc pójdę zapytać prowadzącego - 7.30 :| Ale na zajęciach bazujemy na C++ a w zasadzie to stosujemy tylko ten język.

0

To się jeszcze zapytaj czy TAJEMNICZE INSTRUKCJE
Miedzy pomiarami czasu w programie
mają byc z bibliotek np.OpenGL czy Direct X 2D ,3D ,
czy chodzi o faktyczne instrukcje procesora ..

Na początek myślę, że mój program powinien pobierać dane o procesorze

??

0

Witam ponownie:)
na zajęciach nie miałem czasu pogadac z prowadzącym bo musiał jechać... zawieźć córkę do przedszkola:P

Dowiedziałem się jedynie, że:

Po pierwsze pomysł z pobieraniem danych procesora (czestotliwość, nazwa) chyba jest chybiony, ponieważ raz niepotrzebny, dwa ciezki do wykonania

Po drugie mam nie mierzyc czasu tylko takty procesora - RDTSC!
Używać języka C++ z wstawkami Asemblera.
Program ma działać pod Win

0

Acha , to wiem gdzie znalazłem kod :

imieniny
Tyle że trzeba przekonwertowywowywać (słowo którego nie ma) ;] z Delphi na C

0

Tak tak, już też to sobie znalazłem:P

Napiszę jeszcze maila do prowadzącego i podpytam Go o jakieś szczegóły...
Następnie trzeba będzie zabrać się do roboty:)

0
const int DelayTime = 500
Sleep(10);
  asm{
  dw 310Fh // rdtsc
  mov TimerLo, eax
  mov TimerHi, edx
  }
<b>Sleep(DelayTime);</b>   asm {
   dw 310Fh //rdtsc
  sub eax, TimerLo
  sbb edx, TimerHi
  mov TimerLo, eax
  mov TimerHi, edx
  }

Dwie ciekawostki z kodu - czemu DelayTime odmierza 500ms a nie pełną sekundę ?

Druga sprawa, ten kod działa zupełnie źle w przypadku procesorów obsługujących technologie oszczędzania poboru mocy - np. PowerNow! Na A64 chodzący z nominalną częstotliwością 1.8GHz realnie pracuje przy braku obciążenia z 1GHz. Funkcja Sleep przekazuje sterowanie do Windowsa do Idle Task, który wywołuje sterownik procesora a ten włącza tryb mniejszej czestotliwosci.
Tak więc zamiast Sleepa powinna być pętla mieląca w kółko przez 1s.

0

Kod trzeba okroić , i zamiast Sleep
mają być instrukcje testujące , końcówka bez przeliczenia na czętotliwość
pracy ,tak bym to widział , no i wątek powinien zostać jeśli to możliwe zablokowany przed
wywłaszczeniem przez system , przez nadanie odpowiedniego priorytetu (jest w kodzie)

Czy to wystarczy ?:

//Ustawienie priorytetu działania
...
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

instrukcja RDTCS jest podana jako ciąg bajtów :

  asm{
  dw 310Fh // rdtsc

(Kod podany przez - ' Szczawik ' )
Jak pobrać częstotliwość taktowania procesora

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