API и конвейер

Тема в разделе "WASM.BEGINNERS", создана пользователем Y_Mur, 20 сен 2006.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Фог пишет
    Т.е. получается что вызов API или собственной DLL функции практически всегда сбрасывает конвейер?
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Типичная для switch/case конструкция jmp [reg32+offset] тоже создаёт подобный эффект.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Y_Mur
    Нет не "практически всегда", а только при отсутствии записи в BTB, т.е. при первом вызове. При последующих вызовах осуществляется спекулятивный переход "к той же цели, что и в прошлый раз", а поскольку цель не изменяется, то и ошибок предсказания не будет

    А вот для типичной конструкции switch\case ошибки предсказания неизбежны, т.к. адрес перехода в общем случае изменяется. Причем только в PM и видимо в Core 2 есть Indirect Branch Predictor, распознающий регулярные чередования косвенных переходов, а на других процах каждое изменение адреса перехода будет сопровождаться ошибкой предсказания
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    На AMD - точно, кроме случая, когда переход два раза подряд к одной и той же цели. У них для indirect'а сохраняется только одна цель на инструкцию перехода.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    leo
    Т.е. если вызывать кучу разных внешних функций, то ВТВ их все запомнит?
    Насколько я понял Фога, запоминается только один вызов, т.е. "практически всегда" означает: "за исключением редких случаев, когда одна и та же функция вызывается несколько раз подряд, не чередуясь с вызовом других внешних функций".
    Буду очень рад если я понял Фога не правильно :)
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Y_Mur
    Да нет, перечитай еще раз - не один вызов (т.е. адрес самого jmp\call), а одна цель для каждого вызова, т.е. один адрес цели перехода для каждого вызова как и при обычных jcc. Только при jcc еще и последовательности чередования переход\не переход (паттерны) отслеживаются, а тут нет - длина паттерна = 1, т.е. проц запоминает цель последнего перехода и в следующий раз прыгает на эту цель

    Да, пока они не будут вытеснены другими. Это же относится и к прямым jmp\call, и косвенные от них отличаются только тем, что после каждого вызова происходит обновление адреса цели, а для прямых ес-но нет, т.к. адрес фиксирован
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    leo
    Спасибо
    А что прямой безусловный jmp\call тоже в первый раз сбивает конвейер?
    Здесь же угадывать совсем ничего не надо.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Y_Mur
    Сбивает, но не весь - также как и статическое предсказание условных jcc.
    Угадывать ес-но ничего не надо, а надо просто пройти несколько стадий конвеера от загрузки блока инструкций до выхода декодера, чтобы понять что это инструкция jmp\call и куда нужно прыгнуть. В P6 и AMD fetch+decode составляют около 5-7 стадий, т.е. около половины длины всего конвеера. В P4 число стадий декодирования неизвестно, но видимо оно должно быть больше чем в P6 и AMD. Поэтому грубо можно считать, что пенальти при первом безусловном переходе или статически предсказанном прыжке по jcc может составлять примерно половину штрафа за непредсказанный jcc или indirect, которые приводят к сбросу всего конвеера
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Y_Mur
    Вот картинка для наглядности:
    Код (Text):
    1. Основные стадии конвеера (каждая может состоять из нескольких стадий):
    2. BTB.fetch.decode.RAT\ROB\Shed.Exec.Flags
    3. ^____________________________________^ - штраф за ошибку jcc и indirect
    4. ^_______________^                      - штраф за первый проход jmp\call и верный static
    5. ^_                                     - 1(0) такт при правильном прыжке по BTB
    6. ^                                      - 0 при правильном не-прыжке по BTB
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    [offtopic]
    Красивая картинка :))
    [/offtopic]
    2leo, я не совсем понял, ты говоришь что если ты по томоже адресу делаешь call, то процессор предскажет это, и то что запоминается N-нное количество адресов. А как процессор угадает по какому из этих адресу я собираюсь сделать call/jmp?
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    n0name
    По паттерну. Скажем цель перехода в таком коде:
    Код (Text):
    1.     void (* farr)()[] = {f1, f2, f3, f4};
    2.     for(int i = 0; i < 256; ++i)
    3.         farr[i & 3]();
    на PM и Core2 с какого-то момента всегда будет предсказываться правильно.
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    n0name
    Здрасс-те, или я тебя не понял или ты меня ;)
    Я говорил, что во всех процессорах запоминаются адреса самих инструкций jcc\jmp\call и во всех процессорах кроме PM+ для каждой из них запоминается только один адрес цели перехода (т.е.адрес куда будет совершен переход), поэтому и гадать тут не приходится - куда был прыжок в предыдущий раз, туда и прыгаем - если угадали, то хорошо, если нет - то сброс конвеера и переход по новому адресу. Для прямых переходов и для вызовов API адрес цели не изменяется, поэтому и ошибок не будет.

    А то, о чем ты говоришь, реализовано только в PM+ - для каждого косвенного перехода запоминаются все адреса целей по которым были переходы. А предсказание осуществляеется по паттерну, почти также как и для jcc. Только в jcc адрес цели фиксирован, зато переход или совершается (taken) или не совершается (not-taken), поэтому паттерны это последовательности бит 1 - taken, 0 - not-taken. А косвенный переход всегда taken, но по разным адресам. Поэтому адреса целей записываются в спец.массив и в паттернах запоминаются не биты 1\0, а индексы этого массива (по мнению Фога 6-7 бит на индекс). В итоге если переходы осуществляются не по случайным адресам, а упорядоченно (как в примере Ustus'а), то через период повторения в паттерне оказывается правильная последовательность чередования адресов и далее проц просто прыгает по этим адресам
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    leo
    Угу, спасибо за объяснение.
    PS: А откуда ты всё это знаешь? =)
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    n0name
    Из лесу вестимо ;)
    А.Фог + мануалы Intel & AMD (в т.ч. и старые по P6) + по крупицам из статеек
    Но вот разбираться в тонкостях работы предсказателей переходов - чес слово, лень ;) Это к Ustas'у - он аохоже свой виртуальный процессор разрабатывает :lol:
     
  15. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    n0name
    Никому еще не удалось выяснить, откуда он столько знает :lol: Иногда даже страшно становится: не знает ли он Слишком Много :):):)
    Не совсем :) Хотя в перспективе - не исключено :) Пока же гораздо скромнее - что-то типа Pipeline Simulator'а для как можно большего множества процессоров. Но с каким же скрипом идет, зар-р-раза :dntknw: И еще производители смерти моей хотят - не успел еще даже наполовину разобраться с NetBurst - а вражеский Интел хоп так легко прыг-прыг - глядишь и забьет на энту архитектуру.
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ustus
    Этого и следовало ожидать ;) А ты помниться "восхищался" суперидеей T-кэша и еще каким-то прибамбасам NetBurst ;) А все это оказолось хитрой ловушкой - пока они нам впаривали свои сверчастоты и сверхмощности, "секретные командос" PM & Core втихушечку отрабатывали идеи Next Generation. Похоже и AMD на эту удочку попалось ...
     
  17. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    leo
    Мне все же думается, что некоторые идеи из NetBurst еще пригодятся с будущем - когда процы перестанут соревноваться, кто холоднее и начнут опять тупо гнать частоту. Ведь идея Т-кэша не на ровном месте родилась, это как бы вынужденая мера для обеспечения работоспособности на гигантских конвейерах, которые, в свою очередь возникли в результате попыток разгрузить исполнительные модули процессора и получить приемлемую пропускную способность при высокой латентности. Вот дойдут до 10нм техпроцесса - кто знает, может все по второму кругу пойдет? :)
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ustus
    А говорят экстрасенсы в отпуске ?! После предыдущего поста именно эта мысль ползала по моему истощенному мозгу пока я ее решительно не смыл потоком холодного пивка ;)