1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Портирование FPU на SSE

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mikl___, 14 июл 2020.

  1. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.602
    Jin X,

    Так потому что это ошибка профайлера(системных таймеров), у него разрешение на много порядков ниже, а есчо он периодически вытисняется как задача. Замер должен быть в цикле на очень большом числе итераций. Иначе будет рандом.
    --- Сообщение объединено, 22 дек 2020 ---
    > Success: both RDTSCP instruction and invariant TSC are supported.

    Нет этот счётчик крайне медленный(есчо и плавает), не получится за одну итерацию, это в принципе невозможно. Процик не так тупо сделан, есть всякие предсказания конвееры и прочее, что он сам посчитать не может. Только если в цикле тайминг считать, тем самым исключить анстаб таймеров.
     
    Последнее редактирование: 22 дек 2020
  2. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    365
    Адрес:
    Кольца Сатурна
    Так, там 256 циклов + 16 на разогрев. И из 256 половина отбрасывается (64 самых быстрых и 64 самых медленных). Минус холостой, разумеется. И я этот тест запускал много раз. Показывает одинаковые значения с разбегом 1-2%.
    А сейчас сделал 65536 (с разогревом 256), разбег стал ещё меньше (чаще всего числа всегда одинаковые). Но проблема осталась: когда fld/ftsp внутри функции, все тесты показывают чуть большее значение, а когда снаружи, все показывают чуть меньше. Хотя, они только в одном тесте присутствуют. Причём, все функции выравнены по 16 байтам, а этот тест последний, т.е. тестовые процедуры сдвинуться не могут.
    --- Сообщение объединено, 23 дек 2020 ---
    А вот сейчас я ещё и сами процедуры замера выравнил по 16 байтам.
    И результаты стали одинаковыми, кроме последнего теста. Как и должно быть.
    --- Сообщение объединено, 23 дек 2020 ---
    Вот.
    --- Сообщение объединено, 23 дек 2020 ---
    Почему плавает?
    У меня разница 4 такта (хотя понимаю, что может быть и больше).
    Но учитывая, что он ожидает завершение предыдущих операций (не надо вызывать cpuid, который действительно медленный), то его использование наоборот быстрее получается.

    Вообще, хотелось бы, чтобы спецы проинспектировали функции чтения счётчиков и поправили, если что не так:
    Код (ASM):
    1.  
    2. ; Read TSC via RDTSC [for internal use]
    3. ; Returns: rax = current TSC counter value, ecx = 0 (processor id detection is not supported)
    4. ; Changes ebx !!!
    5. if used SpeedTestRDTSC
    6. SpeedTestRDTSC:
    7.         xor    eax,eax        ; cpuid execution time may vary depending on eax value
    8.         cpuid            ; serialization
    9.         xor    ecx,ecx        ; processor id (not supported)
    10.         rdtsc
    11.         shl    rdx,32
    12.         or    rax,rdx
    13.         mfence
    14.         ret
    15. end if ; used SpeedTestRDTSC
    16.  
    17. ; Read TSC via RDTSCP [for internal use]
    18. ; Returns: rax = current TSC counter value, ecx = processor id
    19. if used SpeedTestRDTSCP
    20. SpeedTestRDTSCP:
    21.         mfence
    22.         rdtscp
    23.         shl    rdx,32
    24.         or    rax,rdx
    25.         mfence
    26. SpeedTestEmptyFunc:
    27.         ret
    28. end if ; used SpeedTestRDTSCP
    --- Сообщение объединено, 23 дек 2020 ---
    Блин, mfence перед rdtscp тут не должно быть, случайно написал :-/
     

    Вложения:

    • sinps.asm
      Размер файла:
      12,9 КБ
      Просмотров:
      65
    Indy_ нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.602
    Jin X,

    > Почему плавает?

    Тема этого счётчика древняя как мамонты, посмотри поиском, не особо давно разбирали.

    > fld

    Дело в том что это не чистый замер. Это под обработкой ядра, в частности планировщика и ловушек. Большую часть NPX обрабатывает ядро, часть симулирует. Постоянно сбрасывает хард маркеры на новых квантах, оптимизации ради, так что не удивляйся когда при тестах тайминг плавает - ты не выключил(исключил) из статистики планировщик и саму ось в целом.

    > Вообще, хотелось бы, чтобы спецы проинспектировали функции чтения счётчиков и поправили

    Респект за вопрос и мотив, но вот только всё слишком запутанно, всё что с профайлом связано. Вот тут посмотри https://wasm.in/threads/profajl-po-preryvanijam.33586/ это решено так и небыло.

    Прикола ради смени приоритет потока, результат будет иной. Так как будет меньше поток квантоваться. Но всё равно это NPX- ловушки не отключит. Лишь повысит точность, на реалтайм поток не будет вообще вытисняться, отдавать кванты системе(соотв всё зависнет, но это годный тест и в юзер).
     
    Последнее редактирование: 23 дек 2020
    Jin X нравится это.
  4. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    365
    Адрес:
    Кольца Сатурна
    Зачем?

    Приоритеты я выставил на максимум (по-хорошему, да, нужно из-под админа запускать... надо добавить манифест, кстати!) + Affinity, чтоб не мигрировал. Пробовал вставить SwitchToThread на каждой итерации цикла при замере, но это ничего не дало (видимо, потому что часть результатов отбрасывается в итоге).

    А сам Intel что глаголит про это?
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.602
    Jin X,

    Затем, что приходится раскодировать инструкции на уровне опкодов, что бы правильно обработать события, приводящие к ловушкам. А есчо разгрузить систему, первое обращение к блоку математики расширяет контекст потока на квант. По причине того, что сохранение контекста математики слишком тяжёлая по таймингу операция. По дефолту никакой поток не использует эти блоки(NPX).
     
    Jin X нравится это.
  6. R81...

    R81... Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    54
    На старых конфигурациях (VIA KT400 + AMD-Athlon XP 2000+: AXDA2000DKT3 1-о ядро) получалиcь в UM в эксперименте точно повторяемые значения в тактах LoopD циков RdTSC внутри (ClI,StI при IOPl=3) временем около 15 секунд каждый, SMI,NMI похоже не приходило - мышь не халявная, Power мененджмент в максимум.
    Это использовалось в качестве проверки - идут ли SMI часто.
     
    Indy_ нравится это.
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.602
    R81...,

    На первой версии системы был в юзер открыт сервис позволяющий поднять IOPL, тем самым выключить прерывания(CLI). Иначе нужно собирать драйвера, что очень не удобно.