Сколько байт занимают инструкции...

Тема в разделе "WASM.BEGINNERS", создана пользователем locki, 19 окт 2005.

  1. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    Сколько байт занимают инструкции перечисленные ниже:

    add

    imul

    sub

    idiv



    paddw

    pmullw

    psubw



    FADD

    FMUL

    FSUB

    Fdiv



    addss

    mulss

    subss

    Divss



    ADDSD

    MULSD

    SUBSD

    DIVSD

    ???
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Посмотри этот раздел. Многие вопросы отпадут.
     
  3. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    Что именно?
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Opcodes book
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    locki

    К сожалению, Intel-архитектура - это CISC по полной программе, то есть нельзя сказать, что инструкция занимает сколько-то байт. Та же ADD може занимать в зависимости от формы от 2-х до 14-ти байт. Как раз тот случай, когда без мануалов не обойтись. Например IA-32 Intel® Architecture Software Developer’s Manual Volume 2: Instruction Set Reference, APPENDIX B: INSTRUCTION FORMATS AND ENCODINGS.

    или вкратце здесь есть общий формат для всех инструкций.
     
  6. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    ни хрена не понял. А можете ответить ск-ка они занимают если ни работают с eax,ebx {add eax,ebx...} и повторяются в цикле много раз.
    Код (Text):
    1. for i:=1 to 1000000 do
    2. asm
    3.  add eax,ebx  
    4.  ...
    5. end;
    6.  


    Сколько можно раз их поставить в цикле (развернуть цикл)

    так, чтобы это было оптимально для Pentium4
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Прежде чем оптимизировать, надо хорошо изучить формат опкода. imho, конечно.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    locki

    add eax,ebx обычно занимает 2 байта и этот размер не зависит от количества повторений в цикле :)





    А что мы оптимизируем? Алгоритмически этот цикл можно заменить инструкцией умножения. А цикл лучше всего сначала выровнять.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    locki

    Разворот в основном используется для уменьшения относительного вклада операций управления циклом (декремент счетчика и переход) в общее время выполнения одного цикла. Поэтому разворачивать нужно до разумного предела, пока вклад управления не снизится до достаточно малого значения (IA-32 рекомедуют до 10%). Дальнейший разворот практически ничего не дает для повышения быстродействия, но дольше декодируется при первом проходе а потом занимает лишнее место в T-кэше.

    Для супертонкого цикла как у тебя для оптимизации быстродействия на P4 вполне достаточно разворота на 8-10 (максимум на 15-16)
     
  10. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    -цикл лучше всего сначала выровнять.

    как это сделать align 16 в дельфи нет - ругается!

    -Дальнейший разворот практически ничего не дает для повышения быстродействия, но дольше декодируется при первом проходе а потом занимает лишнее место в T-кэше.

    Для супертонкого цикла как у тебя для оптимизации быстродействия на P4 вполне достаточно разворота на 8-10 (максимум на 15-16)


    а можно точное(оптимально для T-кэша P4)количество для каждой инструкции от add, ..., до divsd.
     
  11. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    add eax,ebx обычно занимает 2 байта

    а остальные сколько
     
  12. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков


    а что, были случаи?

    [offtop]

    - Синус равен, предположим 1.5...

    - товарищ прапорщик, синус не может быть больше 1!

    - что вы знаете, в военное время и до 3-х доходит!

    [/offtop]



    locki



    Еще раз повторяю - все зависит от формы.

    Если все в регистрах, то арифметические операции занимают, как правило, 2 байта, fpu - 2, mmx - 3, sse - 3(векторные) или 4(скалярные), sse2 - 4 байта.

    При использовании операндов в памяти могут добавляться префиксы, sib-байт, смещение.



    Приведи полные формы инструкций - тогда можно будет точно сказать.
     
  13. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    А какой обьем Т-кэша у Нортвуда и у Прескота? 12288 байт!

    Т.е. для add eax,ebx оптимально ~6144 повторений

    для MMX и FPU ============= 4096

    для SSE2=================== 3072

    я правильно понял???

    или Т-кеш = 2048 блоков 1 блок=6байт

    Максимальная длина трассы составляет 64 блока

    64*6байт = 384байта и уже 384 делить на кол-во байт занимаемых инструкцией????
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Размер T-кэша измеряется не в байтах, а в микрооперациях (мопах) - 12К мопов, объединенных в блоки по 6 мопов. Мопы и байты исходного кода напрямую не связаны. Например и двухбайтовая add r32,r32 и 6-байтовая add r32,imm32 состоят из одного мопа. Но хитростей в организации T-кэша предостаточно и совершенно не понятно о какой оптимальности тут может идет речь и нафиг тебе сдалось забивать весь T-кэш одним циклом ;)) Ведь прежде чем инструкции попадут в T-кэш их нужно сначала декодировать, а на простых операциях типа add r32,r32 декодер P4 работает в 3 раза медленнее, чем извлечение готовых мопов из T-кэша. Это при условии, что код уже находится в L2. А если нет, то плюс время на загрузку кода из ОЗУ. Простая задачка: частота ОЗУ в 8-10 раз ниже ЦПУ, в P4 данные из ОЗУ грузятся секторами по 128 байт = 16 чанков по 8 байт. Прикинь число тиков только на передачу 128 байт (не считая потерь на управление транзакциями) и наскоько оно больше чем время декодирования (1 инструкция за такт)