Доброго времени суток. Пишу код определения скорости выполнения команд; написал для начала процедуру определения частоты шины. В документации на APIC сказано что частота тактовых импульсов его таймера и есть частота шины. На P4/3014GHz возвращает ~200MHz. Окончательно запутался, или частота шины умнажается ? Тогда в каких тактах измерять скорость инструкции ? Спасибо. Код (Text): PIT_FREQUENCY equ 1193180 ;Hz APIC_TMR_COUNT equ 0FFFE0390h ;адрес счётчика APIC_TMR_INIT equ 0FFFE0380h ;начальное значение счётчика APIC_TMR_DIVIDE equ 0FFFE03E0h ;делитель QueryBusClockFrequency proc C cli mov dword ptr ds:[APIC_TMR_DIVIDE],1010b ;устанавливаем делитель в 128 mov dword ptr ds:[APIC_TMR_INIT],10000h ;устанавливаем начальное значение счётчика, чтобы избежать перезагрузки его ;Используем канал 2 таймера, он свободен и используется для генерации звука mov edx,61h ;системный порт in al,dx and al,11111100b out dx,al ;останавливаем счёт в канале 2 jmp $+2 ;задержка mov al,10111000b ;канал 2, запись младшего и старшего байт, одновибратор, двоичный счёт out 43h,al ;запись команды в управляющий регистр jmp $+2 mov eax,1024 ;константа пересчёта out 42h,al ;младший байт константы пересчёта jmp $+2 mov al,ah out 42h,al ;старший байт константы пересчёта jmp $+2 mov ebx,10000h in al,dx or al,00000001b out dx,al ;разрешаем счёт в канале 2 mov dword ptr ds:[APIC_TMR_INIT],ebx ;устанавливаем начальное значение счётчика, чтобы избежать перезагрузки его wait_: ;в порту 61h бит 5 - выход канала 2 счетчика; ;будем читать иначе - из регистра состояния канала in al,dx test al,100000b jnz wait_ ;ждём срабатывание счётчика sub ebx,dword ptr ds:[APIC_TMR_COUNT] ;число тактов/128 за 1024*Tpit ;у меня погрешность 2 такта на P4/3014GHz xor edx,edx mov eax,PIT_FREQUENCY mul ebx shr eax,3 ;частота шины mov dword ptr ds:[APIC_TMR_DIVIDE],1011b ;устанавливаем делитель в единицу, (по умолчанию) sti ret QueryBusClockFrequency endp
Clerk Частота процессора=частота генератора*множитель Такты процессора записываются в счетчик и читаются через инструкцию RDTSC.
rdtsc, работает неоднозначно на различных процессорах, и испольовать её для определения времени или для определения тактов процессора нужно с большой осторожностью. RTFM: Частоту шины и множетель можно определить через rdmsr (для каждого камня соотвесвтенно свой MSR). Что ты подразумеваешь под скоростью выполнения команды(? одной инструкции? или серри? или куска программы?)
Я не подумал про MSR... Измерять скорость инструкции надо в какихлибо единицах. Насчёт TSC - погрешность огромная, используэ таймер апик - погрешность очень низкая, например код: mov eax,dword ptr ds:[APIC_TMR_COUNT] sub eax,dword ptr ds:[APIC_TMR_COUNT] У меня всегда возвращает 11, при коэф. деления 1
Смысл есть, измеряется точно, в тактах синхронизации таймера апик - но не пойму как это сопоставить с частотой ядра
частота шины с частотой ядра никак не сопаставишь. ИМХО ... теоретически ... можно, опять таки через MSR (для интела это e7), получить количество тактов ядра выполненых в режиме С0 (режим исполнения инструкций) счётчик "обновляется" с частотой шины * на множитель и чаще всего частота шины * множитель выше частоты ядра - следовательно можно довольно таки точно определить.
Clerk, ты сказал - У меня всегда возвращает 11, при коэф. деления 1 - скажи, а в каком режиме процессора измерял и на каком процессоре? (спрашиваю, потому что пробывал как то... так у меня такое не получается в РМ).
Если у тебя остался ещё этот код, попробуй на более слабом процессоре, на P3 500Mhg, у меня такое неполучилось.