Оптимизация для процессоров семейства Pentium: 30. Тестирование скорости — Архив WASM.RU
У микропроцессоров семьи Pentium есть встроенный 64-х битный счетчик, который можно считать в EDX:EAX, используя инструкцию RDTSC (read time stamp counter). Эта инструкция очень полезна для того, чтобы точно узнать, сколько тактов занял кусок кода.
Программа ниже полезна для измерения количества тактов, которое занимает код. Программа выполняет код 10 раз и сохраняет 10 значений счетчика. Программу можно использовать как в 16-ти, так и в 32-х битном режиме на PPlain и PMMX.
Код (Text):
;************ Тестовая программа для PPlain и PMMX: ******************** ITER EQU 10 ; количество повторений OVERHEAD EQU 15 ; 15 для PPlain, 17 для PMMX RDTSC MACRO ; определяем инструкцию RDTSC DB 0FH,31H ENDM ;************ Data segment: ******************** .DATA ; сегмент данных ALIGN 4 COUNTER DD 0 ; счетчик цикла TICS DD 0 ; временная переменная для значения счетчика RESULTLIST DD ITER DUP (0) ; список тестовых результатов ;************ Code segment: ******************** .CODE ; сегмент кода BEGIN: MOV [COUNTER],0 ; сбрасываем счетчик цикла TESTLOOP: ; тестовый цикл ;********* Делаем здесь необходимую инициализацию: ***************** FINIT ;************ Конец инициализиции ******************** RDTSC ; считываем значение счетчика тактов MOV [TICS],EAX ; сохраняем его CLD ; не спариваемая инструкция REPT 8 NOP ; 8 NOP'ов, чтобы избежать эффекта "затенения" ENDM ;*** Поместите здесь инструкции, которые нужно протестировать: *** FLDPI ; это всего лишь пример FSQRT RCR EBX,10 FSTP ST ;******** Конец инструкций, которые нужно тестировать ************* CLC ; инструкция против спаривания и затенения RDTSC ; снова читаем счетчик SUB EAX,[TICS] ; вычисляем разность SUB EAX,OVERHEAD ; вычитаем такты, которые использовали ; подсобные инструкции (против спаривания и ; затенения) MOV EDX,[COUNTER] ; счетчик цикла MOV [RESULTLIST][EDX],EAX ; сохраняем результат в таблице ADD EDX,TYPE RESULTLIST ; увеличиваем значение счетчика MOV [COUNTER],EDX ; сохраняем счетчик CMP EDX,ITER * (TYPE RESULTLIST) JB TESTLOOP ; повторяем заданное количество раз ; вставьте здесь код, чтобы считать значения в 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
Оптимизация для процессоров семейства Pentium: 30. Тестирование скорости
Дата публикации 22 авг 2002