Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

amb00

Benchmark procesora w c++

Rekomendowane odpowiedzi

Siema

 

Chciałbym pokazać Wam mój program sprawdzający szybkość procesora i chciałbym abyście go ocenili. Od razu chcę zaznaczyć, że program sprawdza tylko jeden rdzeń procesora. Program wyznacza 90 numer ciągu Fibonacciego i powtarza tę operację 9999999 razy. Następnie pokazuje czas w sekundach jak szybko to trwało. Program napisałem po to aby można było porównać każdą platformę sprzętową bez względu architekturę procesora czy system operacyjny (o ile na danym sprzęcie uda się uruchomić kompilator od c++). Program jest banalnie prosty w obsłudze. Wystarczy go uruchomić i czekać na wynik.

#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
int main()
{
clock_t x,y;
unsigned long long a = 0, b = 1;
cout<<"CPU benchmark is working..."<<endl;
x=clock();
for (int j=0;j<=9999999;j++)
{
    for(int i=0;i<90;i++)
    {
           b += a;
           a = b-a;
    }
    a = 0, b = 1;
}
y=clock();
cout<<"Time is: "<<(long double)(y-x)/CLOCKS_PER_SEC<<" seconds."<<endl;
cin.get();
return 0;
}

http://przeklej.org/file/ntGENY/CPU.benchmark.exe

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Testowałeś swój program na większej ilości kompilatorów? ;)

 

GCC 5.1 na -O2 bądź -O3 wykonuje świetną robotę, a mianowicie... kompletnie wywala zagnieżdżone for'y (bo w końcu zmienne a i b nie są do niczego używane) i robi plik wykonywalny który zawsze wypisuje "CPU benchmark is working... Time is: 0 seconds."

 

Aby zapobiec agresywnym optymalizacjom operacji na tych zmiennych zadeklaruj je jako volatile.

 

Na Twoim miejscu użyłbym rzeczy z biblioteki <chrono> do pomiaru czasu, gdyż zapewnia ona dużo precyzyjniejsze narzędzia.

 

Nie używasz nigdzie cstdlib, ponadto w źródłach c++ powinno się preferować zapis <ctime> zamiast <time.h>.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Użyłem tylko jednego kompilatora, dzięki za uwagi :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie ważne który GCC - optymalizacje zawsze wywalają martwy kod jak w przykładzie u góry

aby temu zapobiec wystarczy gdzieś pod koniec

 

cout << a << " " << b << endl;

 

druga sprawa - jak się włączy kompilacja dla SSE(2), AVX(2, 512) w przypadku -march=native to program dostanie takiego speeda, że zakłamie wyniki

 

program jest za prosty - tylko dodawanie i odejmowanie - a gdzie mnożenie, dzielenie itp?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dopiero się uczę programowania, nie pomyślałem o tych rzeczach. Następnym razem spróbuje lepiej to zrobić ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zrobiłem ulepszoną wersję, która testuje oprócz procesora testuje pamięć ram i pamięć masową. Od razu mówię, że mam wątpliwości czy zrobiłem to tak jak należy. Testu CPU jeszcze nie zmieniałem.

#include<iostream>
#include<fstream>
#include<time.h>
using namespace std;
double CPU()
{
   clock_t x,y;
   unsigned long long a = 0, b = 1;
   x=clock();
   for (int j=0;j<=9999999;j++)
   {
   for(int i=0;i<90;i++)
   {
   b += a;
   a = b-a;
   }
   }
   y=clock();
   return (double)(y-x)/CLOCKS_PER_SEC;
   }

double HDD()
   {
   clock_t x,y; string xx;
   x=clock();
   fstream file;
   file.open("AMBbenchmark_temp.file.txt");
   for (int i=0; i<=10000000; i++)
   {
   file<<"xxxxxxxxxxxxxxxxxxxxxxx";
   getline(file, xx);
   }
   file.close();
   y=clock();
   return (double)(y-x)/CLOCKS_PER_SEC;
   }
double RAM()
   {
   clock_t x,y;
   int *t;
   x=clock();
   for (int i=0; i<10000; i++)
   {
   t=new int [99999];
   for (int i=0; i<99999; i++)
   {
       t[i]=i;
       t[i]++;
   }
   delete [] t;
   }
   y=clock();
   return (double)(y-x)/CLOCKS_PER_SEC;
   }
int main()
   {
   cout<<"AMBbenchmark v1.0 beta."<<endl<<endl;
   cout<<"Time processor (one core) is: "<<CPU()<<" seconds."<<endl;
   cout<<"Time storage is: "<<HDD()<<" seconds."<<endl;
   cout<<"Time Random-access memory is: "<<RAM()<<" seconds."<<endl<<endl;
   cout<<"Test was done."<<endl<<"Press any key to close program."<<endl;
   cin.get();
   return 0;
   }

http://przeklej.org/file/ZM6e4b/AMBbenchmark.exe

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak na początek ujdzie ale warto przemyśleć co tak na prawdę się testuje.

CPU

Bardzo proste operacje, daj coś ciekawszego (jakaś numeryka iteracyjna), żeby procesor się pomęczył choć trochę.

 

HDD

Dlaczego zapisujesz po 23B? Skąd pewność, że testujesz sam dysk, a nie pamięć podręczną, czy bufor systemowy? W wyniku powinna też być podana ilość danych zapisanych i odczytanych.

 

RAM

Alokacja 400kB to zbyt wielki wysiłek nie jest. Problem cache też może się tutaj pojawić. Pobaw się memcpy, memset.

 

Dla hdd/ram proponuję zrobić tak:

-nowy plik/alokacja pamięci

-zapis, wypełnienie losowymi wartościami

-kopiowanie liniowe (potrzebny drugi obszar pamięci, plik)

-kopiowanie losowe (jw.)

Robisz te operacje dla różnej wielkości danych od pojedynczych bajtów (może się długo robić), po kB i MB. Przy alokacji warto zwrócić uwagę czy nie zachodzi fragmentacja.

Przy operacjach na plikach pomyśl jak ominąć buforowanie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jak wyżej

 

test HDD niestety z "bani" bo:

- operacje na plikach za pomocą strumieni to nieporozumienie :) - te funkcje są bardzo wolne - użyj zwykłego read i write

- bloki powinny być wielokrotnością 512B

- system operacyjny i tak cachuje i agreguje dane więc odczyt po zapisie idzie z RAMu, zapis tylko po przekroczeniu bufora albo limitu czasu oczekiwania - to można obejść za pomocą flush

- testy powinny być podobne do innych benchmarków dyskowych tj. testować prędkość vs wielkość bloku, prędkość vs położenie bloku (w przypadku HDD istotne), seek time czyli czas pozycjonowania

 

test RAM tak samo:

- całość się zmieści w cache przeciętnego procesora i stamtąd pójdą dane a nie RAM

- tak naprawdę program powinien odczytywać parametry procesora np. za pomocą CPUID tj. wielkość cache L1, L2 i L3 jeśli jest

- testować wielkie bloki pamięci RAM - zarówno odczyt liniowy jak i losowy

- ewentualnie ustawić pamięć jako nie keszowalną za pomocą niskopoziomowych funkcji systemowych

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...