Помогите с частотой разобратся

Тема в разделе "WASM.OS.DEVEL", создана пользователем Clerk, 24 янв 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Доброго времени суток.
    Пишу код определения скорости выполнения команд; написал для начала процедуру определения частоты шины.
    В документации на APIC сказано что частота тактовых импульсов его таймера и есть частота шины.
    На P4/3014GHz возвращает ~200MHz. Окончательно запутался, или частота шины умнажается ? Тогда в каких тактах измерять скорость инструкции ?
    Спасибо.
    Код (Text):
    1. PIT_FREQUENCY       equ 1193180 ;Hz
    2. APIC_TMR_COUNT      equ 0FFFE0390h  ;адрес счётчика
    3. APIC_TMR_INIT       equ 0FFFE0380h  ;начальное значение счётчика
    4. APIC_TMR_DIVIDE equ 0FFFE03E0h  ;делитель
    5.  
    6. QueryBusClockFrequency proc C
    7.     cli
    8.     mov dword ptr ds:[APIC_TMR_DIVIDE],1010b    ;устанавливаем делитель в 128
    9.     mov dword ptr ds:[APIC_TMR_INIT],10000h ;устанавливаем начальное значение счётчика, чтобы избежать перезагрузки его
    10. ;Используем канал 2 таймера, он свободен и используется для генерации звука
    11.     mov edx,61h ;системный порт
    12.     in al,dx       
    13.     and al,11111100b
    14.     out dx,al       ;останавливаем счёт в канале 2
    15.     jmp $+2     ;задержка
    16.    
    17.     mov al,10111000b    ;канал 2, запись младшего и старшего байт, одновибратор, двоичный счёт
    18.     out 43h,al  ;запись команды в управляющий регистр
    19.     jmp $+2
    20.    
    21.     mov eax,1024    ;константа пересчёта
    22.     out 42h,al  ;младший байт константы пересчёта
    23.     jmp $+2
    24.     mov al,ah
    25.     out 42h,al  ;старший байт константы пересчёта
    26.     jmp $+2
    27.  
    28.     mov ebx,10000h
    29.     in al,dx
    30.     or al,00000001b
    31.     out dx,al       ;разрешаем счёт в канале 2
    32.    
    33.     mov dword ptr ds:[APIC_TMR_INIT],ebx    ;устанавливаем начальное значение счётчика, чтобы избежать перезагрузки его
    34. wait_:
    35. ;в порту 61h бит 5 - выход канала 2 счетчика;
    36. ;будем читать иначе - из регистра состояния канала
    37.     in al,dx
    38.     test al,100000b
    39.     jnz wait_       ;ждём срабатывание счётчика
    40.     sub ebx,dword ptr ds:[APIC_TMR_COUNT]   ;число тактов/128 за 1024*Tpit
    41. ;у меня погрешность 2 такта на P4/3014GHz
    42.     xor edx,edx
    43.     mov eax,PIT_FREQUENCY
    44.     mul ebx
    45.     shr eax,3       ;частота шины
    46.     mov dword ptr ds:[APIC_TMR_DIVIDE],1011b    ;устанавливаем делитель в единицу, (по умолчанию)
    47.     sti
    48.     ret
    49. QueryBusClockFrequency endp
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Clerk
    Частота процессора=частота генератора*множитель
    Такты процессора записываются в счетчик и читаются через инструкцию RDTSC.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    rdtsc не применимо для определения скорости инструкций.
    Не понимаю...
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Clerk
    более точно, нежели чем через rdtsc, ты не измеришь
     
  5. Hairy

    Hairy Сёма

    Публикаций:
    0
    Регистрация:
    25 янв 2008
    Сообщения:
    39
    Адрес:
    Ад на земле
    rdtsc, работает неоднозначно на различных процессорах, и испольовать её для определения времени или для определения тактов процессора нужно с большой осторожностью.

    RTFM:
    Частоту шины и множетель можно определить через rdmsr (для каждого камня соотвесвтенно свой MSR).

    Что ты подразумеваешь под скоростью выполнения команды(? одной инструкции? или серри? или куска программы?)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Я не подумал про MSR...
    Измерять скорость инструкции надо в какихлибо единицах. Насчёт TSC - погрешность огромная, используэ таймер апик - погрешность очень низкая, например код:
    mov eax,dword ptr ds:[APIC_TMR_COUNT]
    sub eax,dword ptr ds:[APIC_TMR_COUNT]
    У меня всегда возвращает 11, при коэф. деления 1
     
  7. Hairy

    Hairy Сёма

    Публикаций:
    0
    Регистрация:
    25 янв 2008
    Сообщения:
    39
    Адрес:
    Ад на земле
    а смысл измерения скорости 1 инструкции?
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    а теперь 11 умножь на множитель ;)
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Смысл есть, измеряется точно, в тактах синхронизации таймера апик - но не пойму как это сопоставить с частотой ядра
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Спасибо, попробую с MSR
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    умножь на множитель
    хотя он может динамически меняться
     
  12. Hairy

    Hairy Сёма

    Публикаций:
    0
    Регистрация:
    25 янв 2008
    Сообщения:
    39
    Адрес:
    Ад на земле
    частота шины с частотой ядра никак не сопаставишь.

    ИМХО ... теоретически ... можно, опять таки через MSR (для интела это e7), получить количество тактов ядра выполненых в режиме С0 (режим исполнения инструкций) счётчик "обновляется" с частотой шины * на множитель


    и чаще всего частота шины * множитель выше частоты ядра - следовательно можно довольно таки точно определить.
     
  13. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Clerk, ты сказал - У меня всегда возвращает 11, при коэф. деления 1 - скажи, а в каком режиме процессора измерял и на каком процессоре? (спрашиваю, потому что пробывал как то... так у меня такое не получается в РМ).
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Защищённый режим, P4/3014MHz - двуъядерный.
     
  15. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Если у тебя остался ещё этот код, попробуй на более слабом процессоре, на P3 500Mhg, у меня такое неполучилось.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Негде пробовать, перепрограммируй APIC.
     
  17. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    в смысле?
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    изменить начальное значение счетчика
     
  19. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    rei3er, у меня при значении 1, выбивает irq7
     
  20. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    значение делителя или счетчика?