QueryPerformanceCounter PMC oder TCS?



  • zeusosc schrieb:

    Ich möchte die Laufzeit eines Threads 0,5µs genau messen. 🙂

    Wenn du die Laufzeit messen willst, lies den PC am anfang und am ende des Threads aus.



  • zeusosc schrieb:

    Mich interessiert dennoch wie ich aus der CPU prozessorspezifisch einen PMC und dessen Frequenz auslesen kann...

    Diese Counter sind alle nicht Teil der CPU sondern irgendwelche Bausteine am Mainboard. D.h. du musst erstmal schaun ob die überhaupt vorhanden sind und dann suchst du dir das Beste was du finden kannst oder so. Auslesen läuft dann eben z.B. über Memory Mapped I/O oder irgendwelche Interrupt Handler oder was weiß ich, hängt vom jeweiligen Baustein ab.



  • @500ns:

    ich hatte nur auf die frage geantwortet, was ich denn "eigentlich" vorhätte.

    Meine eigentliche frage ist also noch nicht beantwortet.
    Ich werde diese aber nochmal in einem satz umformulieren:

    "Wie sieht die ASM implementantion des QPC/QPF aus?"

    Seid gegrüßt und danke für eure gedult...

    ----------
    not casesensitive....



  • Auf meinem System sieht es so aus:
    QPC:

    0000000076D6C210  sub         rsp,28h  
    [b]0000000076D6C214  test        byte ptr [7FFE02EDh],1  [/b]
    0000000076D6C21C  mov         r9,rcx  
    0000000076D6C21F  je          0000000076DDB660  
    0000000076D6C225  mov         r8,qword ptr [7FFE03B8h]  
    [b]0000000076D6C22D  rdtsc  [/b]
    0000000076D6C22F  movzx       ecx,byte ptr [7FFE02EDh]  
    0000000076D6C237  shl         rdx,20h  
    0000000076D6C23B  or          rax,rdx  
    0000000076D6C23E  shr         ecx,2  
    0000000076D6C241  add         rax,r8  
    0000000076D6C244  shr         rax,cl  
    0000000076D6C247  mov         qword ptr [r9],rax  
    0000000076D6C24A  mov         eax,1  
    0000000076D6C24F  add         rsp,28h  
    0000000076D6C253  ret
    

    Es gibt also wohl ein System-Bit (7FFE02EDh), welches definiert, ob rdtsc verwendet wird oder nicht. Falls nicht, so wird dieser Code ausgeführt:

    0000000076D91620  mov         r10,rcx  
    0000000076D91623  mov         eax,2Eh  
    0000000076D91628  syscall  
    0000000076D9162A  ret
    

    QPF (vereinfacht, zuvor werden noch einige andere Register gesetzt):

    0000000076D91620  mov         r10,rcx  
    0000000076D91623  mov         eax,2Eh  
    0000000076D91628  syscall  
    0000000076D9162A  ret
    

    PS: Das kannst Du auch selber nachvollziehen, indem Du in VS Ctrl-F11 während dem Debuggen drückst...



  • Danke Jochen, Ctrl+f11 Kannte ich noch nicht,...

    ich habe nun auch mal nachgeschaut wie man die aktuelle Performance Ratio im verhältnis zur maximalen Qualifizierten Frequenz zu den logischen Prozessor bekommt.

    Dazu muss man das verhältniss RDMSR(IA32_MPERF/IA32_APERF) *CPUID(FREUQ) berechnen,.. Wenn man jetzt noch TSC differenz von Aufruf 1,2 des aktuellen prozessors mit einbezieht sollte man eine akurraten Performance Counter/Timer haben,...

    Siehe http://www.intel.com/Assets/PDF/manual/325384.pdf [14.2][30.11] und http://www.intel.com/Assets/PDF/manual/325383.pdf [tbl. 3-17 p.274]

    Im ganzen sind wohl noch ein paar dinge zu beachten, was z.b. amd/intel kompatibiliätat oder prozessor affinität betrifft,...

    Aber ich werde das mal weiter verfolgen und ein zwei source beispiele basteln...

    Danke Leute 🙂



  • Also,..

    Intel beschreibt in http://www.intel.com/Assets/PDF/manual/325384.pdf [16.12.1 , p. 754], dass bei der neueren Generation an CPUs der TSC unabhängig vom Powerstate ist. Ansonsten abhängig vom Powerstate und damit unterschiedlich von der Maximalen qualifizierten Frequenz.

    Obwohl bei Wiki o.ä. beschrieben wird das der TSC je nach Core in einem Multicoresystem unterschiedlich tickt, so finde ich nix in den Intel Dokus etwas davon,...

    grüße



  • zeusosc schrieb:

    Intel beschreibt in http://www.intel.com/Assets/PDF/manual/325384.pdf [16.12.1 , p. 754], dass bei der neueren Generation an CPUs der TSC unabhängig vom Powerstate ist. Ansonsten abhängig vom Powerstate und damit unterschiedlich von der Maximalen qualifizierten Frequenz.

    Also musst du je nach CPU unterschiedliche Methoden anwenden. Btw: Wie siehts mit AMD, Cyrix, VIA, etc. aus?

    zeusosc schrieb:

    Obwohl bei Wiki o.ä. beschrieben wird das der TSC je nach Core in einem Multicoresystem unterschiedlich tickt, so finde ich nix in den Intel Dokus etwas davon,...

    Ich denke es sollte eigentlich ziemlich selbstverständlich sein dass man in einem Multiprozessorsystem nicht davon ausgehen kann dass die Timestamps aller CPUs hardwaremäßig synchronisiert sind (jetzt mal ganz ehrlich: Was hätte man davon eigentlich!?). Ich würde mir erwarten in der Doku davon zu lesen wenn es so wäre dass man all den Aufwand betrieben, die zahlreichen damit verbundenen technischen Probleme gelöst und den ganzen daraus resultierenden Overhead in Kauf genommen hätte um dieses Feature zu implementieren...

    Zusammenfassend kann man also sagen: Je nach Hardwarekonfiguration gibt es verschiedenste Methoden die brauchbar und andere die völlig unbrauchbar sind. Warum willst du die Entscheidung was in der jeweiligen Situation am Besten ist nicht einfach dem Betriebssystem überlassen? Genau für solche Dinge hat man doch ein Betriebssytem!?



  • @dot:

    Weil mich der entscheidungsweg interessiert 😉

    de facto ist es so, dass ob Intel oder AMD sich der TSC als counter eignet wenn man die Tatsächliche Frequenz berücksichtigt und diese aus dem MSR ausliest.

    Leider weiß ich gerade nicht wie ich die Affinität berücksichtigen soll.. 😕

    grüüüüße



  • zeusosc schrieb:

    de facto ist es so, dass ob Intel oder AMD sich der TSC als counter eignet wenn man die Tatsächliche Frequenz berücksichtigt und diese aus dem MSR ausliest.

    Die tatsächliche Frequenz kann man aber afaik nicht so einfach auslesen sondern muss sie selbst wieder irgendwie messen. Und selbst wenn funktioniert das nur solange der gemessene Thread auf einen Core fixiert wird.



  • Um die Zeiten eines einzelnen Threads zu messen kannst Du auch die regulären Api abfragen des Threads selbst nutzen.



  • ...was auch immer das bedeuten soll.

    Man beachte, dass der Thread hier über 3 Monate alt ist...


Anmelden zum Antworten