Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Cykle procesora
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004
Cykle procesora

Witam - jak to wyliczyć


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

06-01-2005 13:31
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Przede wszystkim -  z czego wyliczyć . No i oczywiście co ma być wynikiem. Długość trwania cyklu czy coś innego?

Co prawda nie mam narazie pomysłu i nie wiem, czy pod VB jest to wogóle możliwe (tzn. nie wiem, czy wogóle przy pomocy WinAPI da się do zrobić), ale może inny coś pomoże


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

06-01-2005 15:56
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Może to w czymś pomoże:
http://vbnet.mvps.org/index.html?code/wmi/wmiprocessor.htm


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

06-01-2005 16:02
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Chcę wyliczyć ile cyklów zajęła np. pętla

For X=1 To 1000
  dOeVENTS
Next X

A tak w ogóle chcę wyliczyć ile czasu zajmuje załadowanie bloku danych do pamięci i funkcję typu GetTickCount czy coś tego odpadają.

Znalazłem funkcje QueryPerformanceCounter i QueryPerformanceFrequency za pomocą, których można wyliczyć ile czasu zajęła dana operacja i niby wszystko działa ale za to mam teraz inny problem

Mam funkcję:




Private Declare Sub FillMemory Lib "kernel32.dll" Alias "RtlFillMemory" (Destination As Any, ByVal Length As Long, ByVal Fill As Byte)
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long


Public Function MemWriteTest(ByVal nBlockSize As Long) As Integer
Dim liFreq As Currency
Dim liStart As Currency
Dim liStop As Currency
Dim dFreq As Double
Dim dStart As Double
Dim dStop As Double
Dim bBuffer(1048576) As Byte
Dim dSpeed As Currency
Dim X As Integer

For X = 1 To 10
    If QueryPerformanceFrequency(liFreq) = 0 Then
            Exit Function
    Else
        QueryPerformanceCounter liStart
       
        Call FillMemory(ByVal VarPtr(bBuffer(0)), nBlockSize, &H41)
       
        QueryPerformanceCounter liStop
       
        dSpeed = dSpeed + (nBlockSize / (1048576)) / ((liStop - liStart) / liFreq)
    End If
Next X
MemWriteTest = dSpeed / 10
End Function


Najważniejsza jest zmienna dSpeed i po każdym przejściu pętli zmienna ta jest zwiększana mniej więcej dwukrotnie (przypisywana jest prędkość zapisu nBlockSize'u do pamięci w MB/s)

I u mnie np. co jedno przejście przypisywane jest ~ 485,34234523857 (wartość przykładowa)

Jeżeli pętla przejdzie 10 razy dSpeed powinno mieć w przybliżeniu 4853,25285235

I Tutaj jest taki problem - chcę pobrać część całkowitą z dSpeed czyli Int(dSpeed) i dzielę ją przez 10 żeby mieć średnią wartość- o dziwo zamiast wyświetlić ~485 wyświetla mi 4853 - gdy wstawię MsgBox'a do pętli żeby pokazywał za każdym razem ile jest w dSpeed to po wyjściu z pętli pokazuje wszystko ok .

Coś tu jest nie tak z konwersją typów ale co - ten typ Currency coś tu nawala

P.S. nBlockSize = 32768 '32K

Pozdrawiam

[Post edytowany dnia 06-01-2005 16:50 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

06-01-2005 16:40
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Cykle zajete przez pętlę
Tego raczej nie wyliczysz. Może gdyby pomnożyć częstotliwosć przez czas wykonywania petli by coś wyszło, ale nie w systemie wielowątkowym, jakim jest Windows - tutaj czas procesora jest dzielony pomiędzy wiele procesów i zanim pętla się wykona, wykona swe operacje także wiele innych programów - tym samym będziesz zliczał nie tylko swoje własne użycie procesora. Ale nie zamykam tej dyskusji całkowicie - może się mylę.
Jedyne, co mi przychodzi do głowy, to dekompilacja kodu, sprawdzenie jakie sa instrukcje i policzenie (ręczne oczywiście) sumy ilości cyklów potrzebnych do wykonania każdej z nich (takie dane można znaleźć w dokumentacjach poszczególnych procesorów. Ale to jest praca dla dobrowolnego męczennika.

Czas ładowania bloku do pamięci
Po pierwsze - zmienna typu Currency nie może mieć wartości 4853.25285235 - sprawdź dokładnie, czy na pewno chodzi o tą zmienną
Po drugie - nie wiem, czym może być spowodowany ten problem. U mnie dzielenie przez 10 działa dobrze, tak samo jak natychmiastowy zapis do zmiennej typu Integer. Spróbuj to rozbić na mniejsze kroczki i po wykonaniu pętli sprawdź dokładnie (krok po kroku) co się dzieje ze zmiennymi...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

06-01-2005 17:02
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Funkcja ma liczyć średnią prędkość zapisu do pamięci i to liczy - wszystko się zgadza bo było testowane na kilku kompach (porównywałem z różnymi Benchmarkami) - może wynik nie jest dokładny ale podaje przybliżoną wartość.

Zmienna typu Currency przyjmuje wartości zmiennoprzecinkowe - gdy pętla wykona się raz wszystko działa ale dla 10 przejść dSpeed ma przecinek o jedno miejsce w prawo za daleko - gdy wyświetlam Msgboxem dSpeed dla każdego przejścia przecinek jest na swoim miejscu - nic z tego nie rozumiem - najlepiej to zapodaj sobie tą funkcję i się przekonasz w czym jest problem

Może inaczej
A= 10
For X=1 To 10
    dSpeed = dSpeed + A
    MsgBox dSpeed ' pierwszy
Next X
MsgBox dSpeed

dla pierwszego msgbox pokaże 10 20 30 itd.
Gdy usuniemy Msgboxa z pętli to drugi Msgbox pokaże nie 100 ale 1000

A co do cykli procesora to w C++ jest taka funkcja jak RDTSC, która pokazuje liczbę cyklów od momentu uruchomienia kompa

[Post edytowany dnia 06-01-2005 17:44 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

06-01-2005 17:37
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Dziwna sprawa

Pętlę For X=1 To 10 wyciągnąłem z funkcji i zrobiłem coś takiego

For X=1 To 10
    dSpeed = dSpeed+MemWriteTest(nBlockSize)
Next X

I jak się okazuje problem zniknął - o co chodzi ?? Przecież to niczym się nie różni od tego co było


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

06-01-2005 18:06
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Typy zmiennych
Właśnie o to chodzi, że zmienna typu Currency nie przyjmuje wartości zmiennoprzecinkowych - tylko stałoprzecinkowe z dokładnie 4-miejscowym rozwinięciem dziesiętnym. Zmiennoprzecinkowe są tylko Single, Double i Decimal.

Pętla
Próbowałem na różne sposoby uruchamiać tą twoją pętlę i za każdym razem ostatni MsgBox pokazywał mi 100... więc nie wiem, czym to może być spowodowane.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

06-01-2005 18:33
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Ok masz rację - zmylił mnie Msgbox, który zamienia kropkę na przecinek ale nadal mnie dziwi to w jaki sposób zniknął mój problem


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

06-01-2005 19:37
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

A mnie nadal dziwi w jaki sposób powstał. Jak pisałem - u mnie nie występuje.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

07-01-2005 09:23
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Chodzi mi o funkcję którą podałem a nie o przykład z tym

for X=1 To

bo mówisz że zwraca ci 100.... - ile masz RAMu ??


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

07-01-2005 12:51
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

192MB (3x64MB SDRAM)


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

07-01-2005 13:54
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No to moja funkcja na pewno nie zwróci ci 100

Dla 32MB zwraca ok.70


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

07-01-2005 14:37
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

No to mierzysz prędkość kopiowania, czy rozmiar pamięci?

I co ma rozmiar pamieci do wartości zwracanej przez:
A= 10
For X=1 To 10
    dSpeed = dSpeed + A
    MsgBox dSpeed ' pierwszy
Next X
MsgBox dSpeed


[Post edytowany dnia 07-01-2005 16:55 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

07-01-2005 16:54
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

dspeed jest podzielone na koncu przez tyle ile się wykonała pętla i mamy wartość średnią prędkości zapisu do pamięci

[Post edytowany dnia 08-01-2005 00:12 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

08-01-2005 00:11
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Pytania:

No to mierzysz prędkość kopiowania, czy rozmiar pamięci?

I co ma rozmiar pamieci do wartości zwracanej przez:
A= 10
For X=1 To 10
    dSpeed = dSpeed + A
    MsgBox dSpeed ' pierwszy
Next X
MsgBox dSpeed




Odpowiedź:

dspeed jest podzielone na koncu przez tyle ile się wykonała pętla i mamy wartość średnią prędkości zapisu do pamięci


??

[Post edytowany dnia 08-01-2005 04:26 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

08-01-2005 04:25
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Ehhhh - chyba źle czytałeś moje wcześniejsze posty - mówię o mojej funkcji MEMWRITETEST

a tego for to napisałem żeby przybliżyć istotę błędu i też to podkreśliłem

[Post edytowany dnia 08-01-2005 12:34 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

08-01-2005 12:34
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Uruchomiłem to u siebie i rzeczywiscie cosik jest nie tak. Udało mi sie ustalić, że błąd powstaje w samej pętli. Jeśli doda się w niej np. Debug.Print dSpeed, zupełnie inne dodaje wartości. Zrobiłem listę wartości "z" i "bez" dodanej liniki:
#    liFreq  liStart    liStop      liStart-liStop
-----------------------------------------------------
Z:
0 :  119.318 520393.9322 520393.9509 0.0187
1 :  119.318 520393.9534 520393.9569 0.0035
2 :  119.318 520393.9575 520393.9606 0.0031
3 :  119.318 520393.9611 520393.9644 0.0033
4 :  119.318 520393.9649 520393.968  0.0031
5 :  119.318 520393.9686 520393.9717 0.0031
6 :  119.318 520393.9722 520393.9754 0.0032
7 :  119.318 520393.9759 520393.979  0.0031
8 :  119.318 520393.9797 520393.9828 0.0031
9 :  119.318 520393.9834 520393.9865 0.0031
Bez:
0 :  119.318 521028.1291 521028.1479 0.0188
1 :  119.318 521028.2693 521028.2796 0.0103
2 :  119.318 521028.3986 521028.4092 0.0106
3 :  119.318 521028.4915 521028.5004 0.0089
4 :  119.318 521028.5811 521028.5899 0.0088
5 :  119.318 521028.6696 521028.6783 0.0087
6 :  119.318 521028.7573 521028.7662 0.0089
7 :  119.318 521028.8574 521028.867  0.0096
8 :  119.318 521028.9485 521028.9575 0.009
9 :  119.318 521029.0361 521029.0447 0.0086


I co widzimy? Funkcja QueryPerformanceCounter w obu przypadkach podaje... zupełnie inne wartości. Te "z linijką" są 3-krotnie mniejsze od tych "bez". Nie mam pomysłu z czego to wynika.

Jedyne, co przychodzi mi do głowy, to to, że jeśli nie ma tej liniki - kod wykonuje się zbyt szybko.. ale jaki dokładnie i co ma wpływ - nie wiem.

Co do zwracanych wartości - u mnie zwraca od 940 do 1120.


I nadal nie rozumiem co ma do tego rozmiar pamięci ...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

08-01-2005 14:36
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

W rzeczywistości rozmiar nie ma nic do prędkości ale pytałem dlatego bo napisałeś że moja funkcja zwraca ci dSpeed * 10 = 100 to przy średniej prędkości miałbyś 10MB/s - co raczej w dzisiejszych czasach jest zdecydowanie za mało

Co do funckji też myślałem nad tym, że wykonuje się zbyt szybko - wyciągnąłem "For ... To" na zewnątrz funkcji i zrobiłem

For ....
    ..
    dSpeed = dSpeed + Moja funkcja
    ..
Next

Jak się okazuje teraz dSpeed przyjmuje poprawne wartości


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

08-01-2005 15:01
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Wszystkich odpowiedzi: 18 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1