Проблема с HyperThreading

Тема в разделе "WASM.ASSEMBLER", создана пользователем Dark_Master, 2 дек 2005.

  1. Dark_Master

    Dark_Master Member

    Публикаций:
    0
    Регистрация:
    19 май 2004
    Сообщения:
    32
    Адрес:
    Усть-За###юйск
    Возникла такая проблема: когда моя прога для мониторинга производительности работает на P4 с включенным hyperthreading то драйвер и программа которая им управляет иногда работают на разных процах и поскольку драйвер разрешает программе считывать счетчики через CR4 то он разрешает это "не в том CR4" так как он у каждой нити свой... Глюк получается не всегда, но довольно часто. Я точно не уверен, но кажется проблема именно в этом так как "privileged instruction" вылетает на RDPMC. Если HT отключить то все ОК.

    Я не большой спец по windows, так что если кто знает как это вылечить, поделитесь плиз
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Попробуй привязать свою прогу к конкретному процессору. В Task Manager должна быть менюшка "Set Affinity". Не уверен, правда, что это работает для логических процессоров. Если заработает, то см. функцию SetProcessAffinityMask и гугли по "processor affinity mask".
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    Four-F

    работает она для HT.
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Привязка к процессору - не 100% решение, так как она устанавливает предпочтительный процессор, но не всегда его придерживается.

    Чтобы код 100% не перебросило на другой процессор нужно просто поднять irql до DISPATCH_LEVEL, или можно просто запретить прерывания.

    Если нужно исполнить код на определенном процессоре, то следует использовать DPC. Свой модуль для работы с мультипроцессорными системами я уже атачил в каком-то топике.
     
  5. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    SetProcessAffinityMask, SetThreadAffinityMask

    работает на ура. Не надо "ляля". Были проблемы с многопроцессорной машиной. Дедлоки в непонятных местах. Это проблему решило полностью. Эти функции ГАРАНТИРУЮТ, что процесс будет на одном процессоре только выполняться.
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Нифига, есть экспериментальные данные, по которым несмотря на AffinityMask исполнение шло на другом процессоре, что проявлялось на 4 процессорном сервере с Windows XP. Причем проявлялось крайне редко, и только в моменты сильной загрузки сервера.

    Самое "прямое" решение этой проблемы - KeRaiseIrqlToDpcLevel/KeLowerIrql.
     
  7. Dark_Master

    Dark_Master Member

    Публикаций:
    0
    Регистрация:
    19 май 2004
    Сообщения:
    32
    Адрес:
    Усть-За###юйск
    Всем спасибо, буду дальше разбираться. Кстати, KeRaiseIrqlToDpcLevel должна вызываться только из драйвера, то есть тогда, когда и прога и драйвер уже работают, а если уже работают с самого начала на разных процах то автоматически станут работать на одном? Просто CR4 модифицируется один раз в DriverEntry, потом уже неважно где и кто работает, важно чтобы в момент вызова driver entry все было на одном проце.
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    В таком случае самым простым решением будет задать AffinityMask, но лучшее решение тут - модифицировать cr4 на всех процессорах.

    Модуль для работы с мультипроцессорными системами в атаче, он позволяет выполнить код на всех процессорах (функция CallToAllProcessors). Калбэк будет вызываться на DISPATCH_LEVEL.

    [​IMG] 1457923914__processor.rar
     
  9. Dark_Master

    Dark_Master Member

    Публикаций:
    0
    Регистрация:
    19 май 2004
    Сообщения:
    32
    Адрес:
    Усть-За###юйск
    Огромное спасибо
     
  10. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Dark_Master

    а еще лучше поройся в PE заголовке проги и драйвера, видел я там то, что позволит привязать потоки процесса к определенному процессору