Probleme Highperformance counter



  • Gibt es eine Möglichkeit auf multicore Cpus sicherzustellen, das immer der Performancecounter desselben Cores gelesen wird.

    Es ist ja bekannt, das durch das sceduling, ein Prozess/thread von cpu zu cpu wandern kann, leider sind die Counter auf den einzelnen Cpu's nicht synchron, so daß es bei regelmäßig zu Fehlemessungen kommt, da die Startcount auf der einen Core höher ist als der End Count der dann von einer anderen CPU gelesen wird.

    Forensuche war leider erfolglos, vielleicht habe ich auch die falschen Suchwörter
    benutzt.



  • Du kannst einen Thread auf eine CPU beschränken:
    SetThreadAffinityMask
    http://msdn.microsoft.com/en-us/library/ms686247

    Damit bekommt Dein Thread halt insgesamt weniger Zeit; aber für rtdsc ist dies nötig.

    PS: Ich würde mir eher die Multimedia-Timer oder QueryPerformanceCounter anschauen, also direkt rtdsc zu verwenden... wenn es bei QPC Probleme gibt, dann ist i.d.R. das BIOS/hal schuld...



  • Danke für die prompte Antwort.

    Mein Problem bezieht sich auf einen I7-Quadcore und QueryPerformanceCounter / QueryPerformanceFrequency.

    Oder gibt es noch Alternativen um Zeitabläufe im sub mSec Bereich zu messen?



  • Dir bleibt leider nichts anderes übrig als den Thread auf eine CPU zu begrenzen, da MS keine Kontrolle über Bugs im BIOS hat... siehe auch:
    http://msdn.microsoft.com/en-us/library/ee417693



  • Mist, ich höre davon zum ersten mal.
    Ich habe da so ein Problem, das die Werte von QPC und QPF springen.
    Leider bin ich in verschiedenen Threads unterwegs und share die Zeit zwischen den Threads.
    Was kann man hier für eine sichere Methode verwenden?
    Das mit dem Bios verstehe ich nicht.

    (Nevertheless, developers should attempt to have their games call QueryPerformanceCounter as little as possible to avoid any performance penalty.)

    Das ist eindeutig! Da ich aber extrem oft Zeitmessungen machen muss kommt mir das nicht gerade entgegen. Besonders werden bei mir die Zeit Deltas der verschiedenen Threads miteinander verglichen.

    Call QueryPerformanceFrequency only once, because the frequency will not change while the system is running.

    Ich dachte die CPU kann rauf und runter takten? Werden hier die Teiler mitgefahren?

    Kennt ihr eine bessere Lösung als MS vorgibt?

    Grüße
    TheNoName


Anmelden zum Antworten