QueryPerformanceCounter and Windows 10

Тема в разделе "WASM.WIN32", создана пользователем TermoSINteZ, 8 июл 2020.

  1. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    Впервые вчера столкнулся с интересной особенностью 10ки.
    История такова, что один софт попросили посмотреть. Наблюдались странности. Софт показывает картинки. И вот иногда они показываются ускоренно. При чем рандомно. То есть может работать как надо, а после какого то времени - не так как надо - быстро. Решается перезагрузкой.

    Собственно не буду говорить как натолкнулся. Но суть такова.
    1) queryperformancefrequency API, по которому идет опрос частоты процессора - возвращает всегда 10 мегагерц. (об этом на сайте МС инфа есть - хоть и не связана с 10кой напрямую)
    Линк: https://docs.microsoft.com/en-us/wi...-high-resolution-time-stamps#direct-tsc-usage
    Хотя гипервизор не запущен. То есть нативная система.

    2) queryperformancecounter API - тоже возвращает ерунду. То значение улетает далеко вперед, то обратно возвращается.

    Собственно интересно было бы обсудить - почему и зачем на 10ке это изменили \ поскипали \ испортили? Или дело не в 10-ке ?)
     
  2. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.200
    Адрес:
    подполье
    Так ведь как раз таки, похоже, дело в деградации кода венды, о чом и говорится в топике про это-наше-всё winxp
     
  3. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    TermoSINteZ, ситуация проверялась на скольких разных машинах?
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.479
    Адрес:
    Россия, Нижний Новгород
    А если поиграть с HPET (включить\выключить), что-нибудь изменится?
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    HoShiMin, спасибо, попробую.
    UbIvItS, да, но в основном это мощные машины. Типа Core i9 или Xeon последних поколений. А так же это материнские платы типа Gigabyte X299 DESIGNARE EX. Если надо точнее - скажу позже.
    Если не трудно - почекайте у себя вывод хотя бы того же QueryPerformanceFrequency. Это делов на 5 минут запустить студию . Если у вас 10ка и свежее железо.
     
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.479
    Адрес:
    Россия, Нижний Новгород
    У меня тоже 10 МГц. Как отключить HPET на Z-390 - хз, в биосе нет. Но есть какие-то флаги для bcdedit.
     
  7. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    TermoSINteZ, отключи всю защиту ядра и для пущей важности можно Hyper-V убрать из системы полностью :)
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    Ага тоже не нашел где отключать.
    UbIvItS, Ну ради эксперимента попробую. Но имхо - не прокатит кажется.
    Есть другие процы где core i7 4 поколения на 10ке - тоже самое поведение.
     
  9. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    попытка - не пытка :) в любом случае для нахождения причины нужно исключать все возможные варианты.
    --- Сообщение объединено, 9 июл 2020 ---
    повторяемость на разных машинах говорит, что ситуация не локальна, то бишь сразу отпадают частные проблемы с дровами и в итоге имеем...

    1. софтина мокрых.
    2. особенности процев интела.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    UbIvItS, дело в том, что queryperformancefrequency не частота процессора, а частота внутреннего таймера, для перф каунтера. В винде вообще.
    А у кого есть может 7 установленная. Кто проверить может ? Что выдаст.
     
  11. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.479
    Адрес:
    Россия, Нижний Новгород
    Тоже отпадает. Вчера попросил потестить на Ryzen 5 1600 - тоже 10 МГц (на Win10 2004)
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    RDTSC - в 32 битных прогах работает нормально*
    RDTSC - в 64 битных прогах работает скачет в минус.
    Минус связаны с тем что ядра процессора стартуют с задержкой смотри MP-Specification.
    *Если 32 битную программу замучить, то она перескочит с ядра. Достаточно запустить высоко нагруженную программу желательно парочку.

    Это от того, что ядра стартуют с задержкой. А МС ленивые жопы выронить не могут.
    У меня QueryPerformanceCounter - работает нормально без улётов назад. Неравномерность не привышает 1 мс. ОС Win7 на 10 позже проверю.

    --- Сообщение объединено, 9 июл 2020 ---
    Где 10 МГц у вас какая версия десятки?
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Проверил на Win 10 проц i7-4700HQ всё норм. QueryPerformanceCounter не скачет неравномерность 60-1200 мкс в зависимости от нагрузки и энергосберегающего режима.
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    Приветствую )
    У меня 1903 версия.

    Попозже покажу два кода. 1 исходный который работает не так, как от него ожидают. А второй - уже с моими исправлениями (убрал вообще QPC)
     
  15. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    а в тестах учитывали режим защиты ядра, то бишь отключали его?
    TermoSINteZ, кстати, можно ориентироваться по нагреву проца == в зависимости от энергосберегающего режима и защиты от перегрева на проце роняется частота.
     
  16. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.479
    Адрес:
    Россия, Нижний Новгород
    TSC тикает на фиксированной частоте и от энергосберегаек не зависит, даже если процессор сбрасывает фактическую частоту.
    А 10 МГц - это какая-то синтетическая частота.
    Возможно, они ввели её для унификации замеров времени, чтобы точность не зависела ни от частоты TSC, ни от HPET, и измерялась строго в 100-наносекундных интервалах, как FileTime. Таким образом, на разном железе будет одинаковая точность.
     
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    но тут возникает Вопрос == точность ЧЕГО??? просто замерять время не имеет особого смысла без привязки к актуальной скорости проца.
     
  18. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.200
    Адрес:
    подполье
    А может индусы настолько ахоели, что данная функция возвращает номер венды^^
     
    hiddy, Rel, TermoSINteZ и 2 другим нравится это.
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    именно по этому и начали возникать глюки когда в код был написано с учетом изменения скорости.
    ахахах 5
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    hal 10-ки, KeQueryPerfCount() - функция не на константах, опорное значение HalpPerformanceCounter, это переменная. Далее копируется туда из HalpAlwaysOnCounter <- HalpTimerSelectRoles <- HalpAlwaysOnTimer <- HalpTimerSelectRoles <- HalpFindTimer <- HalpRegisteredTimer* <- HalpRegisteredTimerCount <- HalpTimerRegister <- HalpTimerInitializeEarlyStallSource <- есчо куча функций <- HalpRtcDiscover <- HalSocGetAcpiTable <- HalpAcpiGetTable <- HalpAcpiGetTableWork <- HalpAcpiGetCachedTable <- HalpAcpiTableCacheList <- HalpAcpiGetRsdt <- HalpAcpiCopyBiosTable/HalpInvalidAcpiTable etc пошло в железо.
    --- Сообщение объединено, 16 июл 2020 ---
    TermoSINteZ,

    У тебя тупо стоит какой то ядерный фильтр возвращающий константу, удали авера и таймеры будут работать как положено :lol: