Переходы (было AVR vs PIC)

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Mon, 6 Sep 2004 11:28:46 +0000 (UTC) Alexander Golov wrote to Harry Zhurov:

AG> ...

HZ>>     Тогда не понятно, почему goto два цикла выполняется?

AG> В каком смысле? Переход же нужно выполнить, значит новая выборка. Или ты
AG> про то, что второе слово выбирается, а не 3 цикла? А это как раз
AG> срабатывает, что команда (первое слово) уже декодирована и после выборки
AG> второго слова выбирается сразу адресуемая команда.

    Hе очень я понял, что ты тут сказал. Исходно дискуссия по этому вопросу
возникла из того, что ты назвал переходы тривиальными, а я сказал, что
переходы - нетривиальная вещь с точки зрения производительности и всегда
чреваты дополнительными циклами на считывание инструкции по новому адресу в
случае перехода (если не используются специальные средства), а ты сказал, что
это не так и главная причина в медленности памяти, что будь память быстрой, то
проблемы бы не было.

    Вот я и спрашиваю про этот goto - ведь это безусловный переход, с ним
никаких неожиданностей - переход есть всегда. Так что же мешает во время
выполнения собственно перехода (т.е. грубо говоря, прописывания в PC нового
адреса) считать инструкцию по новому адресу? Ведь скорости памяти повышенной
тут не требуется - ситуация точно такая же, как и в случае с любой другой
командой, когда во время выполнения команды преспокойно считывается следующая.
Однако тут даже в случае простейшего безусловного перехода требуется
дополнительный цикл. Очевидно, что дело не медленности памяти, а в том, что
сама следующая команда лежит не за инструкцией собственно перехода, а в другом
месте - по новому адресу, и чтобы ее оттуда выцепить _ВО ВРЕМЯ_ перехода, надо
иметь специальные аппаратные средства, которыми МК не оснащаются, ибо роскошь.
Вот здесь и кроется торможение при переходе, а не в пресловутой медленности
памяти. Hеужели не понятно?! Я уже устал твердить об этом!

[...]


HZ>>     Hу, так и выбирай, кто мешает-то? Если следующую команду ты можешь
HZ>> выбрать - хватает быстродействия памяти, то кто мешает выбрать вместо нее
HZ>> ту, которая по новому адресу?

AG> Следующая команда к моменту завершения выполнения условного перехода уже
AG> выбрана и её приходится выбрасывать и выбирать новую.

    Так выбирай не ту, которая за инструкцией перехода, а ту, которая по новому
адресу! Что мешает? "Ведь переход - это тривиальная вещь".


--
H.Z.

harry.zhurov<antispam::at>ngs<antispam::period>ru


We've slightly trimmed the long signature. Click to see the full one.
Переходы (было AVR vs PIC)
  Привет!

Mon Sep 13 2004 10:39, Harry Zhurov wrote to Alexander Golov:

...

 HZ>     Вот я и спрашиваю про этот goto - ведь это безусловный переход, с ним
 HZ> никаких неожиданностей - переход есть всегда. Так что же мешает во время
 HZ> выполнения собственно перехода (т.е. грубо говоря, прописывания в PC
 HZ> нового адреса) считать инструкцию по новому адресу?

Ничего не мешает, кроме необходимого времени, тех самых 30 нс (или сколько
там?), для доступа к памяти по новому адресу:

                                                 +-- здесь известен новый
адрес
 | выборка add | выполнение add  |               v
               | выборка bra     | выполнение bra |
                                 | выборка PC+1   | выборка по новому адресу |


 HZ> Ведь скорости памяти
 HZ> повышенной тут не требуется - ситуация точно такая же, как и в случае с
 HZ> любой другой командой, когда во время выполнения команды преспокойно
 HZ> считывается следующая.

Нет, для "любой другой команды" выбирается PC+1, а для goto адрес станет
известен с момента начала её исполнения. Спор начался именно с того, когда я
сказал, что PIC не декодирует предварительно выбранные команды (т.е. у него
отсутствует процессинг-конвейер), а только задерживает исполнение первой
команды на время выборки из памяти, общим случаем для которого выбран 1 цикл.

 HZ> Однако тут даже в случае простейшего безусловного перехода требуется
 HZ> дополнительный цикл. Очевидно, что дело не медленности памяти, а в том,
 HZ> что сама следующая команда лежит не за инструкцией собственно перехода, а
 HZ> в другом месте - по новому адресу, и чтобы ее оттуда выцепить _ВО ВРЕМЯ_
 HZ> перехода, надо иметь специальные аппаратные средства, которыми МК не
 HZ> оснащаются, ибо роскошь.

Это не роскошь, а просто балласт. Создавать аппаратные навески для
параллельного предварительного декодирования однословных безусловных
переходов, чтобы в результате поднять производительность на 1% нет никакого
смысла.

 HZ> Вот здесь и кроется торможение при переходе, а не в пресловутой
 HZ> медленности памяти. Hеужели не понятно?! Я уже устал твердить об этом!

Я уже давно не понимаю что ты хочешь доказать. Ты в сущности пересказываешь
мне мои же слова и одновременно снимаешь акценты с проблемы
производительности памяти, пытаясь поставить их на якобы безумных затратах
аппаратной реализации. Я же могу только ещё раз подтвердить: никакого другого
смысла задерживать исполнение команды кроме наличия большого времени выборки
из памяти просто не существует.

...

 HZ>>>     Hу, так и выбирай, кто мешает-то? Если следующую команду ты можешь
 HZ>>> выбрать - хватает быстродействия памяти, то кто мешает выбрать вместо
 HZ>>> нее  ту, которая по новому адресу?

В момент начала декодирования goto начинается выборка следующей (PC+1)
команды. К моменту когда станет ясно, что выполняется goto эта выборка будет
в полном разгаре. Новая выборка требует своих 30 нс, для получения которых
вводится дополнительный цикл.

 AG>> Следующая команда к моменту завершения выполнения условного перехода уже
 AG>> выбрана и её приходится выбрасывать и выбирать новую.

 HZ>     Так выбирай не ту, которая за инструкцией перехода, а ту, которая по
 HZ> новому адресу! Что мешает?

Тогда два цикла потребуется каждой команде уже на линейном коде и только
переходы будут выполняться за 1 цикл.

 HZ> "Ведь переход - это тривиальная вещь".

Естественно, что там может быть нетревиального?


Переходы (было AVR vs PIC)
Thu, 23 Sep 2004 16:44:14 +0000 (UTC) Alexander Golov wrote to Harry Zhurov:


HZ>>     Вот я и спрашиваю про этот goto - ведь это безусловный переход, с ним
HZ>> никаких неожиданностей - переход есть всегда. Так что же мешает во время
HZ>> выполнения собственно перехода (т.е. грубо говоря, прописывания в PC
HZ>> нового адреса) считать инструкцию по новому адресу?

AG> Ничего не мешает, кроме необходимого времени, тех самых 30 нс (или сколько
AG> там?), для доступа к памяти по новому адресу:

AG>                                                  +-- здесь известен новый
AG> адрес
AG>  | выборка add | выполнение add  |               v
AG>                | выборка bra     | выполнение bra |
AG>                                 | выборка PC+1   | выборка по новому адресу
AG> |

-----------------------------------------^^^^^^^^

    А почему бы не сделать в этом месте вместо "выборка PC+1" "выборка
bra->addr"? Адрес-то уже известен. Уж в случае безусловных переходов точно
никаких принципиальных трудностей нет. Даже выяснять не надо (как в случае
условного перехода), откуда следующую инструкцию фетчить.


HZ>> Ведь скорости памяти
HZ>> повышенной тут не требуется - ситуация точно такая же, как и в случае с
HZ>> любой другой командой, когда во время выполнения команды преспокойно
HZ>> считывается следующая.

AG> Нет, для "любой другой команды" выбирается PC+1, а для goto адрес станет
AG> известен с момента начала её исполнения.

    Для goto адрес известен после ее выборки. А во время ее выполнения можно
выбрать инструкцию по новому адресу. Тем более, что уже известно перед
выборкой, что следующая команда - абсолютно точно не та, которая PC+1, а та,
которая указана в goto.

AG> Спор начался именно с того, когда я сказал, что PIC не декодирует
AG> предварительно выбранные команды (т.е. у него отсутствует
AG> процессинг-конвейер), а только задерживает исполнение первой команды на
AG> время выборки из памяти, общим случаем для которого выбран 1 цикл.

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

HZ>> Однако тут даже в случае простейшего безусловного перехода требуется
HZ>> дополнительный цикл. Очевидно, что дело не медленности памяти, а в том,
HZ>> что сама следующая команда лежит не за инструкцией собственно перехода, а
HZ>> в другом месте - по новому адресу, и чтобы ее оттуда выцепить _ВО ВРЕМЯ_
HZ>> перехода, надо иметь специальные аппаратные средства, которыми МК не
HZ>> оснащаются, ибо роскошь.

AG> Это не роскошь, а просто балласт. Создавать аппаратные навески для
AG> параллельного предварительного декодирования однословных безусловных
AG> переходов, чтобы в результате поднять производительность на 1% нет никакого
AG> смысла.

    Производители DSP процессоров так не считают. Просто в МК это именно
роскошь, они и так не претендуют на максимальное быстродействие, поэтому им не
нужен такой наворот, увеличивающий стоимость и энергопотребление, бо автомат
этот отнюдь не простой. Только и всего.

    И потом, откуда ты взял 1%? Вот возьми какой-нибудь цикл, где три-четыре
инструкции, одна из которых переход. Сколько % прирост на четырех командах,
если переход выполняется не два, а 1 цикл? Другой вопрос, стОят ли эти 10-25%
прироста скорости дополнительных наворотов в ядре МК. Очевидно, что не стОят,
т.к. производительность и так не стоИт во главе угла.

HZ>> Вот здесь и кроется торможение при переходе, а не в пресловутой
HZ>> медленности памяти. Hеужели не понятно?! Я уже устал твердить об этом!

AG> Я уже давно не понимаю что ты хочешь доказать. Ты в сущности пересказываешь
AG> мне мои же слова и одновременно снимаешь акценты с проблемы
AG> производительности памяти, пытаясь поставить их на якобы безумных затратах
AG> аппаратной реализации. Я же могу только ещё раз подтвердить: никакого
AG> другого смысла задерживать исполнение команды кроме наличия большого
AG> времени выборки из памяти просто не существует.

    Это еще вопрос, кто чьи слова пересказывает. Но не будем на это
отвлекаться. Итак, ты по-прежнему утверждаешь, что единственная причина в
медленности памяти. Я же утверждаю, что принципиальная причина не в медленности
памяти, а в отсутствии в МК специальных аппаратных средств, наличие которых
решает проблему - любой переход может быть выполнен за один цикл. Пресловутая
"медленность" памяти проблемой не является при желании. Кроме того, не забывай,
что бывают и другие процессоры, где программа выполняется из ОЗУ (почти все
DSP), и память там отнюдь не медленная. Но проблема остается. И решается именно
применением предиктора ветвлений. Просто кроме памяти есть еще и остальная
логика, которая тоже имеет конечное быстродействие, и те же проблемы встают в
полный рост. И решаются указанным способом.

    В заключение еще раз (последний): переход является тривиальным _ТОЛЬКО_ в
случае, если оставить его как есть и получить потерю производительности. Любая
попытка довести производительность на переходах до уровня линейных команд
выливается либо в необходимость значительно более быстрой памяти (это может
помочь до некоторого предела скоростей), либо в необходимость городить
специальные аппаратные средства (что кардинально решает проблему в любом
случае). И то, и другое и есть та самая _нетривиальность_, которую порождают
тривиальные переходы.

--
H.Z.

harry.zhurov<antispam::at>ngs<antispam::period>ru

We've slightly trimmed the long signature. Click to see the full one.
Переходы (было AVR vs PIC)
  Привет!

Sat Sep 25 2004 19:59, Harry Zhurov wrote to Alexander Golov:

...

 AG>> Hичего не мешает, кроме необходимого времени, тех самых 30 нс (или
 AG>> сколько  там?), для доступа к памяти по новому адресу:

 AG>>                                                  +-- здесь известен
 AG>> новый  адрес
 AG>>  | выборка add | выполнение add  |               v
 AG>>                | выборка bra     | выполнение bra |
 AG>>                                 | выборка PC+1   | выборка по новому
 AG>> адресу  |

 HZ> -----------------------------------------^^^^^^^^

 HZ>     А почему бы не сделать в этом месте вместо "выборка PC+1" "выборка
 HZ> bra->> addr"? Адрес-то уже известен. Уж в случае безусловных переходов
 HZ> точно никаких принципиальных трудностей нет. Даже выяснять не надо
 HZ> (как в случае условного перехода), откуда следующую инструкцию фетчить.

В этом момент это не адрес, а абстрактный набор битов, адресом он станет лишь
по завершению первого такта цикла, в котором осуществляется декодирование
команды и станет известно, что это "bra". А подозрение в каждом выбранном
последним наборе битов адреса безусловного перехода грозит тем, о чём я
говорил в прошлый раз -- выбором каждой последующей команды за 2 цикла. Хотя
на самом деле делать выборки по данным в полях команды без предварительного
декодирования вообще нельзя.

...

 AG>> Hет, для "любой другой команды" выбирается PC+1, а для goto адрес станет
 AG>> известен с момента начала её исполнения.

 HZ>     Для goto адрес известен после ее выборки.

Только не известно, что это goto, и что там адрес команды, а не, скажем,
SFR'а.

...

 AG>> Спор начался именно с того, когда я сказал, что PIC не декодирует
 AG>> предварительно выбранные команды (т.е. у него отсутствует
 AG>> процессинг-конвейер), а только задерживает исполнение первой команды на
 AG>> время выборки из памяти, общим случаем для которого выбран 1 цикл.

 HZ>     Hет. Спор начался, когда ты сказал, что переходы тривиальные, а я
 HZ> сказал, что это несколько не так, и именно из-за этого переходы и требуют
 HZ> дополнительных затрат либо в виде времени выполнения, либо в виде
 HZ> дополнительной аппаратуры. В этом и состоит нетривиальность.

Нет, мои слова относились к 2810 у которого из-за конвейера и вайт-стейтов
переход тянет на 4...12 циклов, а здесь мы долго и нудно обсуждаем почему
меня не смущает, что у PIC'ов переход длится 2 цикла; я описал почему (см.
два абзаца выше).

...

 AG>> Это не роскошь, а просто балласт. Создавать аппаратные навески для
 AG>> параллельного предварительного декодирования однословных безусловных
 AG>> переходов, чтобы в результате поднять производительность на 1% нет
 AG>> никакого  смысла.

 HZ>     Производители DSP процессоров так не считают. Просто в МК это именно
 HZ> роскошь, они и так не претендуют на максимальное быстродействие, поэтому
 HZ> им не нужен такой наворот, увеличивающий стоимость и энергопотребление,
 HZ> бо автомат этот отнюдь не простой. Только и всего.

Не знаю, что там считают производители DSP, но у них оптимизация goto не
будет обеспечивать существенного прироста производительности. А ускорение
DSP-алгоритмов в этой части, куда эффективнее при создании специальных
конструкций организации циклов, после чего переход выполняется даже не за 1,
а за 0 циклов. Что мы и наблюдаем в dsPIC30F.

 HZ>     И потом, откуда ты взял 1%? Вот возьми какой-нибудь цикл, где
 HZ> три-четыре инструкции, одна из которых переход.

Близко к 100% -- условный. А мы говорим про безусловные, более того, только
однословные, т.е. только bra, ещё возможно: rcall и return.

...

 HZ>     Это еще вопрос, кто чьи слова пересказывает. Hо не будем на это
 HZ> отвлекаться. Итак, ты по-прежнему утверждаешь, что единственная причина в
 HZ> медленности памяти.

Медленность -- причина, а всё остальное -- следствия конкретных путей
преодоления связанных с ней проблем.

 HZ> Я же утверждаю, что принципиальная причина не в
 HZ> медленности памяти, а в отсутствии в МК специальных аппаратных средств,

Для PIC'ов специальные аппаратные средства позволят разобраться лишь с
однословными безусловными переходами.

 HZ> наличие которых решает проблему - любой переход может быть выполнен за
 HZ> один цикл.

Чтобы разобраться с остальными переходами нужно строить абсолютно другой
командный цикл с конвейерным декодированием и специальными аппаратными
навесками смотрящими вперёд по конвейеру.

 HZ> Пресловутая "медленность" памяти проблемой не является при
 HZ> желании.

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

...

 HZ>     В заключение еще раз (последний): переход является тривиальным
 HZ> _ТОЛЬКО_ в случае, если оставить его как есть и получить потерю
 HZ> производительности.

Для PIC'ов переход это простое копирование адреса в PC и вставка одного nop.
Единственное радикальное средство ускорения -- подкладывание полноразмерного
скоростного ОЗУ под Flash и полное копирование кода перед запуском. Любые
другие варианты работают в одних случаях и не работают в других, т.е. вносят
дисперсию в результаты выполнения и в общем случае требуют закладываться на
максимум.

...

 HZ> И то, и другое и есть та
 HZ> самая _нетривиальность_, которую порождают тривиальные переходы.

Ну да, только вся "нетривиальность" наворотов у 2810 приводит к переходам
даже без вайт-стейтов за 4/7 циклов, а "тревиальность" у PIC за 2 цикла в
любых условиях.


Site Timeline