Оптимизация для процессоров семейства Pentium: 30. Тестирование скорости

Дата публикации 22 авг 2002

Оптимизация для процессоров семейства Pentium: 30. Тестирование скорости — Архив WASM.RU

У микропроцессоров семьи Pentium есть встроенный 64-х битный счетчик, который можно считать в EDX:EAX, используя инструкцию RDTSC (read time stamp counter). Эта инструкция очень полезна для того, чтобы точно узнать, сколько тактов занял кусок кода.

Программа ниже полезна для измерения количества тактов, которое занимает код. Программа выполняет код 10 раз и сохраняет 10 значений счетчика. Программу можно использовать как в 16-ти, так и в 32-х битном режиме на PPlain и PMMX.

Код (Text):
  1.  
  2. ;************   Тестовая программа для PPlain и PMMX: ********************
  3.  
  4. ITER    EQU     10              ; количество повторений
  5. OVERHEAD EQU    15              ; 15 для PPlain, 17 для PMMX
  6.  
  7. RDTSC   MACRO                   ; определяем инструкцию RDTSC
  8.         DB      0FH,31H
  9. ENDM
  10. ;************   Data segment:                   ********************
  11. .DATA                           ; сегмент данных
  12. ALIGN   4
  13. COUNTER DD      0               ; счетчик цикла
  14. TICS    DD      0               ; временная переменная для значения счетчика
  15.  
  16. RESULTLIST  DD  ITER DUP (0)    ; список тестовых результатов
  17. ;************   Code segment:                   ********************
  18. .CODE                           ; сегмент кода
  19. BEGIN:  MOV     [COUNTER],0     ; сбрасываем счетчик цикла
  20. TESTLOOP:                       ; тестовый цикл
  21. ;********* Делаем здесь необходимую инициализацию: *****************
  22.         FINIT
  23. ;************      Конец инициализиции          ********************
  24.         RDTSC                   ; считываем значение счетчика тактов
  25.  
  26.         MOV     [TICS],EAX      ; сохраняем его
  27.         CLD                     ; не спариваемая инструкция
  28. REPT    8
  29.         NOP                     ; 8 NOP'ов, чтобы избежать эффекта "затенения"
  30. ENDM
  31.  
  32. ;***  Поместите здесь инструкции, которые нужно протестировать:  ***
  33.         FLDPI                   ; это всего лишь пример
  34.         FSQRT
  35.         RCR     EBX,10
  36.         FSTP    ST
  37. ;******** Конец инструкций, которые нужно тестировать  *************
  38.  
  39.         CLC                     ; инструкция против спаривания и затенения
  40.  
  41.         RDTSC                   ; снова читаем счетчик
  42.         SUB     EAX,[TICS]      ; вычисляем разность
  43.         SUB     EAX,OVERHEAD    ; вычитаем такты, которые использовали
  44.                                 ; подсобные инструкции (против спаривания и
  45.                                 ; затенения)
  46.         MOV     EDX,[COUNTER]   ; счетчик цикла
  47.         MOV     [RESULTLIST][EDX],EAX   ; сохраняем результат в таблице
  48.         ADD     EDX,TYPE RESULTLIST     ; увеличиваем значение счетчика
  49.         MOV     [COUNTER],EDX           ; сохраняем счетчик
  50.         CMP     EDX,ITER * (TYPE RESULTLIST)
  51.         JB      TESTLOOP                ; повторяем заданное количество раз
  52.  
  53. ; вставьте здесь код, чтобы считать значения в RESULTLIST

Подсобные инструкции до и после тестируемого кода были включены, чтобы получить адекватные результаты на PPlain. CLD - это неспариваемая инструкция, которая была вставлена, чтобы порядок спаривания инструкций в первый раз будет такой же, как и во все остальные. Восемь инструкций NOP были вставлены, чтобы предотвратить возможные префиксы в тестируемом коде, которые могли бы раскодироваться в тени предыдущих инструкций на PPlain. Однобайтовые инструкции использовались здесь, чтобы получить тот же порядок спаривания, что

На PMMX вы можете захотеть вставить 'XOR EAX,EAX / CPUID' перед тестируемым кодом, если вы хотите, чтобы FIFO-буфер инструкций был очищен или какую-нибудь длительную инструкцию (например, CLI или AAD), если вы хотите, чтобы он был полон (CPUID не вызывает эффекта затенения может начаться раскодировка префиксов последующих инструкций).

На PPro, PII и PIII вы можете вставить 'XOR EAX,EAX / CPUID' до и после каждого RDTSC, чтобы предотвратить ее возможное выполнение параллельно с какой-нибудь другой инструкцией и убрать подсобные инструкции. (CPUID - это синхронизирующая инструкция, что означает то, что она очищает конвеер и ждет, пока все исполняющиеся инструкции не будут выполнены, и только тогда выполнится сама. Это может быть полезно для тестирования.)

Инструкция RDTSC не может выполняться в виртуальном режиме на PPlain и PMMX, поэтому если вы запускете DOS-программы, вам нужно перегрузиться в реальный режим. (Нажмите F8 во время загрузки и выберите "safe mode command promt only" или "bypass startup files").

Полный исходник тестовой программы доступен на www.agner.org/assem/.

У процессоров Pentium есть специальные счетчики наблюдения за качеством работы, которые отслеживают и подсчитывают такие события как промахи кэша, невыравненность, различные задержки. Подробности об использовании счетчиков не затрагиваются в данном руководстве, но их можно найти в "Intel Architecture Software Developer's Manual", vol. 3, Appendix A. © Агнер Фог, пер. Aquila


0 681
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532