Мелкие вопросы по теории
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: Мелкие вопросы по теории
Друзья, а вот маленький теоретический вопрос от простого Кота... Предположим лежит у нас препарированный микроконтроллер, с прошивкой внутри. В ней, разумеется, циклы задействованы, ветвления. так вот вопрос, сколько тактов тратится на принятия решения по операторам If, For, While?
Правильным ли будет полагать, что IF съедает 1 такт, WHILE 2 такта, а FOR три? Т.е. рассмотреть while как <If + goto>. А FOR как <i++ + if + goto> ?
Или же на практике эти инструкции исполняются рациональнее? Или это очень зависит от архитектуры процессора, и будет в корне различным для мелких RISK аврок, пиков и, скажем, более массивнго Cortex-M3, из STM-32. А как обстоит дело в процессорах полноразмерных? Типа х86
Правильным ли будет полагать, что IF съедает 1 такт, WHILE 2 такта, а FOR три? Т.е. рассмотреть while как <If + goto>. А FOR как <i++ + if + goto> ?
Или же на практике эти инструкции исполняются рациональнее? Или это очень зависит от архитектуры процессора, и будет в корне различным для мелких RISK аврок, пиков и, скажем, более массивнго Cortex-M3, из STM-32. А как обстоит дело в процессорах полноразмерных? Типа х86
- Реклама
- Андрей Бедов
- Друг Кота
- Сообщения: 37346
- Зарегистрирован: Чт авг 30, 2012 20:24:40
- Откуда: Нижний Новгород
Re: Мелкие вопросы по теории
Да.Или это очень зависит от архитектуры процессора
Несколько десятков инструкций за такт.как обстоит дело в процессорах полноразмерных? Типа х86
- Slabovik
- Друг Кота
- Сообщения: 17234
- Зарегистрирован: Чт апр 04, 2013 12:46:59
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по теории
Андрей Бедов писал(а):Несколько десятков инструкций за такт.
просто КОТ, у процессоров нет инструкций типа IF, FOR и т.п. Потому что это инструкции языка программирования, по иерархии стоящего гораздо выше процессорных команд. Но у процессоров есть команды перехода по условиям. Условиями при этом служат биты из регистра состояния процессора, которые называют флагами. Флаги устанавливаются (1) или сбрасываются (0) автоматически в процессе обработки команд АЛУ. При исполнении команды перехода по условию анализируется конкретный флаг и производится (или не производится) переход. Естественно, заботу о флагах выполняет программист, задавая такую последовательность команд, чтобы состояние нужного флага было адекватным непосредственно перед исполнением команды перехода.
Например, команда перехода в процессорах на ядре i8080 занимает либо 7 либо 10 тактов. 7 - если переход не производится. 10 - если производится.
Вообще, у всего семейства i80xx эта система похожа. Правда, у современных процессоров очень развита конвейерность, поэтому что-то конкретное сказать по занимаемому времени невозможно однозначно - всё зависит от контекста.
У микроконтроллеров типа PIC, AVR картина тоже похожа. Конвейер там простенький. Команды также исполняются за 4 такта, однако их выполнение хитро распараллелено - с каждым тактом в конвейер поступает новая команда, а уже поступившая "переходит" на следующий такт исполнения. Поэтому заявляется, что скорость исполнения 1 команда за 1 такт. И это верно для пользователя, но неверно с точки зрения АЛУ. При исполнении команды перехода АЛУ может сбрасывать такую очередь "почти исполненных команд" (ну, это потому что чтобы не сбрасывать, АЛУ должно предугадывать состояние флагов, что реально сложно), поэтому следующая команда за командой перехода (если переход был выполнен) исполняется также 4 такта, а не 1, как было бы, если бы она была в ряду простых команд.
p.s. Я описал чрезмерно упрощённо, чтобы не залезать в дебри конкретных архитектур, где у каждой много своих тонкостей. Поведение каждой лучше всего узнавать в тех. документации на неё.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: Мелкие вопросы по теории
Неверно выразился... Разумеется, процессор не исполняет команд в том виде напрямую. Упрощу вопрос до того, в каком виде он появился:
Можно ли полагать, что переход с конца в начало цикла WHILE выполнится быстрее чем у цикла FOR, т.к. нет необходимости обрабатывать пресловутое I++. Или это всё выполняется одинаково?
Вот этот вопрос для восьмибитных RISC интересует. И для X86.
Есть ли разница в том, какими инструкциями описываются процессору два этих разных цикла?
Можно ли полагать, что переход с конца в начало цикла WHILE выполнится быстрее чем у цикла FOR, т.к. нет необходимости обрабатывать пресловутое I++. Или это всё выполняется одинаково?
Вот этот вопрос для восьмибитных RISC интересует. И для X86.
Есть ли разница в том, какими инструкциями описываются процессору два этих разных цикла?
- Slabovik
- Друг Кота
- Сообщения: 17234
- Зарегистрирован: Чт апр 04, 2013 12:46:59
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по теории
Невозможно сравнить, т.к. никаких While, For процессор в принципе не понимает. Сколько будет исполняться конкретная языковая конструкция - это зависит от того, в какую последовательность процессорных инструкций она будет превращена. Ну т.е. от программиста, писавшего компилятор, и решившего сделать так, или эдак...
Вот, например, фрагмент кода для PICКак видим, здесь два вложенных цикла. Но где же тут FOR или While? Их нет. А команды перехода выглядят как
cccfsflag
goto xxx
; где ccc - команда, flag - конкретный флаг, проверяемый на условие по выполнению этой команды ; при этом по соответствию флага процессор исполняет одну следующую за этой инструкцией команду, по несоответствии - скипает.
Вот, например, фрагмент кода для PIC
Код: Выделить всё
Str2M_L4:
; далее выводим буфер строки с подготовленными в нём битами
movlw str_data_buf ; указатель на буфер
movwf FSR
movlw MATRIX_LENGTH
movwf str_byte_cnt
bcf PIX_STRDY ; опустим защелку строки
Str2M_L5: ; большой круг - считаем байты буфера
movlw 8 ; количество бит в байте
movwf str_bit_cnt
Str2M_L6: ; малый круг - вывод битов из байта буфера
bcf PIX_SYNC ; опустим защелку пиксела
rrf INDF,F ; вращаем буфер вправо через флаг переноса
btfsc STATUS,C
goto Str2M_L7 ; если флаг не 1, идём поставим 0
bsf PIX_DATA ; а если 1 - то ставим 1
goto Str2M_L8
Str2M_L7:
bcf PIX_DATA
nop
Str2M_L8:
bsf PIX_SYNC ; защёлкиваем пиксель
decfsz str_bit_cnt,F ; все биты выдвинули?
goto Str2M_L6 ; нет - возвращается за следующим
incf FSR,F
decfsz str_byte_cnt,F ; весь буфер выдвинули?
goto Str2M_L5 ; нет - возвращаемся
bsf PIX_STRDY ; защелкиваем строку на отображение
returncccfsflag
goto xxx
; где ccc - команда, flag - конкретный флаг, проверяемый на условие по выполнению этой команды ; при этом по соответствию флага процессор исполняет одну следующую за этой инструкцией команду, по несоответствии - скипает.
- Реклама
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Мелкие вопросы по теории
Slabovik не только от вариантов реализации структур While, For... в компиляторе но еще и от архитектуры железа, так в современных процессорах код выполняется в так называемых конвеерах (их может быть несколько, а в видеокартах их сотни), они могут выполняться параллельно. Кроме того код может выполняться наперед. Например у нас есть оператор if так вот процессор для ускорения выполняет оба варианта ветвления, а лишний потом просто отбрасывается. Там много таких заморочек связанных с архитектурой и никак не зависящих от кода. В процессорах есть память, так вот когда разработчик выпускает ревизии, они корректируют внутренние алгоритмы процессора, это называется микрокодом.
Про микроконтроллеры не знаю, но думаю ситуация аналогична.
Так что однозначно нельзя сказать сколько будет занимать времени и инструкций тот или иной код. По этой причине и производительность толком не измерить, так как на одном железе тест будет показывать одно, а на другом железе тот же тест будет показывать другое, даже при равных характеристиках железа но например разных производителей.
ПС: прочитал ваши сообщения выше, вижу вы и так это знаете
Про микроконтроллеры не знаю, но думаю ситуация аналогична.
Так что однозначно нельзя сказать сколько будет занимать времени и инструкций тот или иной код. По этой причине и производительность толком не измерить, так как на одном железе тест будет показывать одно, а на другом железе тот же тест будет показывать другое, даже при равных характеристиках железа но например разных производителей.
ПС: прочитал ваши сообщения выше, вижу вы и так это знаете
Последний раз редактировалось Gisteresis Ср дек 09, 2015 13:30:41, всего редактировалось 1 раз.
- Андрей Бедов
- Друг Кота
- Сообщения: 37346
- Зарегистрирован: Чт авг 30, 2012 20:24:40
- Откуда: Нижний Новгород
Re: Мелкие вопросы по теории
Об этом я пытался сказать выше. Просто выразился коряво.в современных процессорах код выполняется в так называемых конвеерах (их может быть несколько, а в видеокартах их сотни), они могут выполняться параллельно.
- Slabovik
- Друг Кота
- Сообщения: 17234
- Зарегистрирован: Чт апр 04, 2013 12:46:59
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по теории
Архитектура железа - это тоже отдельный вопрос и к конструкции While To отношения совершенно не имеющий. Перпендикулярное такое пространство. Поэтому при сравнениях принято, что при сравнении трансляций их исполнение производится на идентичной архитектуре. В противном случае эксперимент и вовсе некорректен. Потому что, к примеру, тот же I8086 не имеет возможности скорректировать код, который ещё формально не исполнен, но уже находится в конвейере, а 80286 такую коррекцию допускает, но ценой перезагрузки конвейера. Кстати, тот же микрокод, о котором вы говорите, как раз у 286-х и появился, и по факту он представляет собой нечто подобное коду для программируемой логической матрицы (предположение, причём не моё, т.к. людей, реально знающих, как оно работает, кроме "а вот в третьем пне", я не встречал)
А простейший конвейер - это вот как раз глядите те же PIC, как оно там.
p.s. Кстати, есть процессоры, исполняющие код Z80 за один такт. Секрет прост - такая же конвейеризация. Сами команды при этом как исполнялись 4 такта, так и исполняются.
А простейший конвейер - это вот как раз глядите те же PIC, как оно там.
p.s. Кстати, есть процессоры, исполняющие код Z80 за один такт. Секрет прост - такая же конвейеризация. Сами команды при этом как исполнялись 4 такта, так и исполняются.
Последний раз редактировалось Slabovik Ср дек 09, 2015 13:36:06, всего редактировалось 1 раз.
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Мелкие вопросы по теории
По этой причине оптимизация кода дело очень сложное. Один код будет если мы пишем под определенный кристалл и совсем другой будет если писать под группу кристаллов (семейство или группу по иным признакам). В играх под это дело делают динамически подключаемые библиотеки, после теста процессора подсоединяется код оптимизированный именно для этого процессора.
просто КОТ на эту тему есть статьи в которых рассматриваются разные компиляторы и во что они транслируют те или иные операторы.
Вот например. Конечно это не для AVR но суть таже.
http://www.cyberguru.ru/programming/cpp ... page5.html
5 лет занимался геймдевом в качестве хобби. Заморочка с оптимизацией дает 10..30% прироста производительности и несравненно больше головняков и увеличение времени разработки программы. А при современных мощностях кристаллов выигрыш часто не оправдывает затраченных сил.
Отношение не имеющий к конструкции но имеющий ко времени выполнения.Архитектура железа - это тоже отдельный вопрос и к конструкции While To отношения совершенно не имеющий.
просто КОТ на эту тему есть статьи в которых рассматриваются разные компиляторы и во что они транслируют те или иные операторы.
Вот например. Конечно это не для AVR но суть таже.
http://www.cyberguru.ru/programming/cpp ... page5.html
5 лет занимался геймдевом в качестве хобби. Заморочка с оптимизацией дает 10..30% прироста производительности и несравненно больше головняков и увеличение времени разработки программы. А при современных мощностях кристаллов выигрыш часто не оправдывает затраченных сил.
Последний раз редактировалось Gisteresis Ср дек 09, 2015 13:57:31, всего редактировалось 1 раз.
Re: Мелкие вопросы по теории
По-моему, что WHILE, что FOR - это разновидности IF внутри цикла. Каждую итерацию производится проверка условия. При прочих равных принципиальной разницы нет.
Кстати в одной программке проверил ради интереса. Цикл WHILE выполняется за то же время, что и IF внутри LOOP. Однако, если внутри LOOP дать сравниение If x > 1000000, работает быстрее, чем If x < 1000000.
Вывод такой, что все факторы учесть трудно, нужно пробовать.
Кстати в одной программке проверил ради интереса. Цикл WHILE выполняется за то же время, что и IF внутри LOOP. Однако, если внутри LOOP дать сравниение If x > 1000000, работает быстрее, чем If x < 1000000.
Вывод такой, что все факторы учесть трудно, нужно пробовать.
- Slabovik
- Друг Кота
- Сообщения: 17234
- Зарегистрирован: Чт апр 04, 2013 12:46:59
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по теории
Я боюсь, что в утверждении
Процедура распараллеливания простая на словах, однако на деле я настоятельно рекомендую зарыться в даташиты Microchip или AVR и посмотреть на простейших реализациях, как именно работает конвейер, и какие ограничения при этом существуют. Да, конвейер современного ядра Core2 весьма сложен, однако и у него куча ограничений, и вот "просто так" он не в состоянии исполнять две ветви кода сразу, а только по соблюдении условий. Но. НО! Вы понимаете, что при этом ускорения исполнения кода нет? О, отличный вопрос: а что же тогда? А отвечу. Предсказание переходов позволяет делать одну простую штуку (а на деле очень затратную штуку) - оно позволяет не сбрасывать конвейер при исполнении перехода по условию. А это экономит сотни тактов, необходимых для наполнения этого весьма длинного конвейера. Просто то время, пока конвейер наполняется, команды не исполняются - ядро просто стоит и ждёт...
заключено заблуждение. Точнее, некоторая путаница понятий о том, что такое конвейер, поток, вычислительное ядро (АЛУ) и чем они всё-таки отличаются, чтобы не лепить их в одну кучу.Gisteresis писал(а):в современных процессорах код выполняется в так называемых конвеерах (их может быть несколько, а в видеокартах их сотни)
Процедура распараллеливания простая на словах, однако на деле я настоятельно рекомендую зарыться в даташиты Microchip или AVR и посмотреть на простейших реализациях, как именно работает конвейер, и какие ограничения при этом существуют. Да, конвейер современного ядра Core2 весьма сложен, однако и у него куча ограничений, и вот "просто так" он не в состоянии исполнять две ветви кода сразу, а только по соблюдении условий. Но. НО! Вы понимаете, что при этом ускорения исполнения кода нет? О, отличный вопрос: а что же тогда? А отвечу. Предсказание переходов позволяет делать одну простую штуку (а на деле очень затратную штуку) - оно позволяет не сбрасывать конвейер при исполнении перехода по условию. А это экономит сотни тактов, необходимых для наполнения этого весьма длинного конвейера. Просто то время, пока конвейер наполняется, команды не исполняются - ядро просто стоит и ждёт...
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Мелкие вопросы по теории
ypppu, видимо вы не смотрели во что транслируются эти операторы разными компиляторами. Есть компиляторы у которых текст оператора в 2..3 раза больше чем у оптимизированного.
Кроме того сильно сомневаюсь, что замер времени произведен верно. Разрядность таймера винды слишком низка для этого. Если мои предположения конечно верны.
Если вы пишите под ПК, советую использовать процессорный счетчик тактов. Причем алгоритм такой.
10 раз запускаем один и тот же тест и если время выполнения одинаково, считаем его верным. Или смотрим время за которое выполнилось большинство запусков, оно будет верным. Потому, что может произойти например прерывание и мы получим неверное время. Если хотите дам свой класс бенчмарка, хотя он не мной изобретен, он типовой.
Поэтому и нужно задаться вопросом а нужно ли оптимизировать и если да тогда что.
Значительный прирос дает отыскание критически важного места и оптимизация только его.
Кроме того сильно сомневаюсь, что замер времени произведен верно. Разрядность таймера винды слишком низка для этого. Если мои предположения конечно верны.
Если вы пишите под ПК, советую использовать процессорный счетчик тактов. Причем алгоритм такой.
10 раз запускаем один и тот же тест и если время выполнения одинаково, считаем его верным. Или смотрим время за которое выполнилось большинство запусков, оно будет верным. Потому, что может произойти например прерывание и мы получим неверное время. Если хотите дам свой класс бенчмарка, хотя он не мной изобретен, он типовой.
Конечно, но зачем сейчас вдаваться в эти подробности.Slabovik писал(а):Точнее, некоторая путаница понятий о том, что такое конвейер, поток, вычислительное ядро (АЛУ) и чем они всё-таки отличаются, чтобы не лепить их в одну кучу.
Поэтому и нужно задаться вопросом а нужно ли оптимизировать и если да тогда что.
Значительный прирос дает отыскание критически важного места и оптимизация только его.
Re: Мелкие вопросы по теории
Я предполагаю, что для WHILE, FOR и IF конечный машинный код после компиляции может оказаться одинаковым. Вроде об этом изначально спрашивал просто КОТ.
- Slabovik
- Друг Кота
- Сообщения: 17234
- Зарегистрирован: Чт апр 04, 2013 12:46:59
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по теории
С равной уверенностью можно предполагать, что он будет отличаться.
Реально же необходим разбор конкретного кода конкретного компилятора при абсолютно одинаковых условиях. В противном случае любое утверждение будет лишь предположением.
p.s. Я уже говорил, что нет никакого смысла притягивать язык высокого уровня к машинным командам? Почему? А потому что результат неоднозначен, и даже если вы сделаете работу и разберёте один компилятор, это отнюдь не будет означать, что другой компилятор будет вести себя так же
Реально же необходим разбор конкретного кода конкретного компилятора при абсолютно одинаковых условиях. В противном случае любое утверждение будет лишь предположением.
p.s. Я уже говорил, что нет никакого смысла притягивать язык высокого уровня к машинным командам? Почему? А потому что результат неоднозначен, и даже если вы сделаете работу и разберёте один компилятор, это отнюдь не будет означать, что другой компилятор будет вести себя так же
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Мелкие вопросы по теории
1 зависит от компилятора и архитектуры.просто КОТ писал(а): так вот вопрос, сколько тактов тратится на принятия решения по операторам If, For, While?
Правильным ли будет полагать, что IF съедает 1 такт, WHILE 2 такта, а FOR три? Т.е. рассмотреть while как <If + goto>. А FOR как <i++ + if + goto> ?
Или же на практике эти инструкции исполняются рациональнее?
2 нет, смотри ответ 1.
3 да.
Машинный код может оказаться одинаковым после трансляции разными компиляторами (что вообще говоря не так часто происходит, потому что одни и те же конструкции можно по разному писать и оптимизировать, но если программисты запаривались над оптимизацией они часто как минимум похожи), но это еще не гарантия быстрого выполнения.
Вот Slabovik выражает здравую мысль, имеет смысл сравнивать куски ассемблера.
А еще лучше просто бенчмарк написать и им сравнивать.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: Мелкие вопросы по теории
Огромнейшее спасибо, други! Как я и подозревал, после компилятора всё не так и однозначно. Мой маленький вопрос решён, и я пошёл взвешивать результат. Задачи как таковой я не имел, если честно. Это небольшая лабораторная работа по алгоритмам сортировки. Просто мы считаем "шагами" по коду, а я задумался и решил привязать это к тактам процессора. Вот так...
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Мелкие вопросы по теории
Бенчмарк решает задачу измерения затратности кода на конкретном оборудовании.
Еще аналитический метод есть оценки алгоритмов. Представляется формулой.
Например
https://ru.wikipedia.org/wiki/%D0%A1%D0 ... 0%BC%D0%B8
Вычислительная сложность - O(n^2).
https://ru.wikipedia.org/wiki/%D0%A1%D0 ... 0%B5%D0%BC
O(n log n) обычно, O(n) на упорядоченном массиве
И т.д.
Часто алгоритм можно построить таким образом, чтобы он выполнялся эффективнее. Например, чтобы избежать сортировки в массиве, можно при вставке элементов в него сразу выбирать необходимое место, чтобы он сразу был отсортирован.
Еще аналитический метод есть оценки алгоритмов. Представляется формулой.
Например
https://ru.wikipedia.org/wiki/%D0%A1%D0 ... 0%BC%D0%B8
Вычислительная сложность - O(n^2).
https://ru.wikipedia.org/wiki/%D0%A1%D0 ... 0%B5%D0%BC
O(n log n) обычно, O(n) на упорядоченном массиве
И т.д.
Часто алгоритм можно построить таким образом, чтобы он выполнялся эффективнее. Например, чтобы избежать сортировки в массиве, можно при вставке элементов в него сразу выбирать необходимое место, чтобы он сразу был отсортирован.
Re: Мелкие вопросы по теории
Вопрос по симистору.
IGT в документации - это максимальный длительный ток, который разрешено пропускать через управляющий электрод? Или же это минимальный ток, при котором симистор гарантированно откроется?
Просто смотрел документацию к Z01xxN и увидел сноску:
Note 1: minimum IGT is guaranted at 5% of IGTmax.
А по ГОСТ 20332-84 IGT - это наименьший постоянный ток управления тиристора, необходимый для включения тиристора.
IGT в документации - это максимальный длительный ток, который разрешено пропускать через управляющий электрод? Или же это минимальный ток, при котором симистор гарантированно откроется?
Просто смотрел документацию к Z01xxN и увидел сноску:
Note 1: minimum IGT is guaranted at 5% of IGTmax.
А по ГОСТ 20332-84 IGT - это наименьший постоянный ток управления тиристора, необходимый для включения тиристора.
- Slabovik
- Друг Кота
- Сообщения: 17234
- Зарегистрирован: Чт апр 04, 2013 12:46:59
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по теории
Надо верить ГОСТу. Пороговый ток - это ток, необходимый для включения.
Ну а то, что
А максимальный ток УЭ (гейта) к пороговому отношение имеет лишь то, что текут они в один электрод.
Ну а то, что
означает всего лишь, что минимальный пороговый ток составляет 5% максимального порогового тока. Это разброс, нижняя граница возможного порогового тока для всех приборов. В таблице же указан только максимальный.ypppu писал(а):minimum IGT is guaranted at 5% of IGTmax.
А максимальный ток УЭ (гейта) к пороговому отношение имеет лишь то, что текут они в один электрод.
Re: Мелкие вопросы по теории
Правильно я понял, что
- IGTmax - это ток, в пределах которого я точно не спалю УЭ;
- minimum IGT = IGTmax *5% - это ток, при котором симистор гарантированно включится?




