nop в ntdll

Тема в разделе "WASM.BEGINNERS", создана пользователем el-, 22 сен 2006.

  1. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    собственно сабж ... в ntdll их такое количество, что страшно подумать как он похудеет, если их убрать ... так вот вопрос, они действительно нужны или не более чем прихоть кодеров из мелкософта ...

    зы. слышал про бесполезные циклы в hal.dll, это случайно не из той же серии ?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Это скорее всего выравнивание.
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    либо align, либо hot patching (скорее первое, особенно если перед\после функции в количестве до 16\32 нопов)
     
  4. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    посмотрел в отладчике ... да действительно алигн ... ну как я понял эхи можно смело сносить ?
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    el-
    Если ООООчень нужно, чтобы похудело, то можно, но как пишет Касперски:
    т.е. скорость заметно упадёт...
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    el-
    Каким образом? И что это даст?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А вообще интересно - Касперски приводит пример где невыровненный цикл съедает ~30% скорости, а leo пишет:
    Так на что ориентироватья? Выравнивать циклы или нет? Или на разных камнях по разному?
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Касперски, если я правильно помню приводит пример для PIII/Athlon.
    Так и есть, и не только это, к сожалению :dntknw:
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Y_Mur
    Хоть бы ссылку привел - самому интересно чего это я пишу ;)))
    Приведенная фраза относится только к NetBurst (P4 и Ко)
    Но где-то и вроде не раз, я брал смелость утверждать, что и для P6\AMD требование выравнивания само по себе не обязательно и не может давать полной гарантии максимума скорости. На самом деле важны 3 вещи:
    1) от метки цикла до конца 16-байтного блока должно быть достаточно мопов, чтобы "максимально" загрузить декодер хотя бы на 1 такт (т.е. либо как минимум 3 мопа direct path, либо 1 vector path), иначе декодер будет в первом такте работать с недогрузкой
    2) не должно быть разбивки "критических" инструкций границей 16-байтного блока
    3) желательно, чтобы условный переход не вываливался в гордом одиночестве в отдельный 16-байтный блок (иначе загрузка декодера в начале цикла, компенсируется недогрузкой в конце)
    Выравнивание цикла на 16 решает первую проблему, т.к. при выравнивании мы имеем максимум возможных мопов от метки начала цикла до конца блока. Но вот вторую проблему таким универсальным методом не решишь, поэтому в ответ на пример Касперски можно привести другие примеры, когда искусственный сбой выравнивания цикла дает выигрыш в скорости. Поэтому при ловле блох, если возникают ситуации 2 и 3, то приходится экспериментировать со смещением метки цикла и\или с перестановками и искуственным изменением длины инструкций
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    leo
    http://www.wasm.ru/forum/viewtopic.php?id=7782&p=2
    #30
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Не понял - это как? и почему?
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В P6 и AMD код грузится 16-байтными блоками с макс.скоростью 1 блок за такт. Если в этом блоке достаточно инструкций, чтобы загрузить декодер, то фетчер за время декодирования блока успевает загрузить следующий блок. Если же в блоке всего одна полезная инструкция, то соответственно декодер вместо 3-х возможных инструкций декодирует за такт только одну. Такая ситуация может возникать как при невыравненной метке цикла (первый блок содержит всего одну инструкцию или еще хуже ни одной, если первая инструкция разбивается границей 16 байт), так и в последнем блоке цикла, если он содержит только jcc да еще не дай бог разбитый по границе блока.
    Но следует иметь в виду, что все эти "штучки" не приводят к 100% потерям - они лишь образуют дырки (пузыри) в потоке мопов с декодера. Реальные потери будут в том случае, когда исполнение мопов идет со скоростью декодирования или быстрее, а если медленее, то очереди планировщиков сглаживают эти дырки и на итоговой скорости исполнения все эти невыравненности могут никак не отразиться
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    leo
    Круто однако! - спасибо!