LINUX.ORG.RU

x86: почему CISC-команды медленнее?

 ,


1

4

Неоднократно слышал, что:

  • leave медленнее, чем
    mov esp, ebp
    pop ebp
    
  • enter N, 0 медленнее, чем
    push ebp
    mov ebp, esp
    sub esp, N
    
  • stosd медленнее, чем
    mov [es:edi], eax
    add edi, 4
    
  • repne scasb медленнее, чем наивный strchr()

и так далее.

Вопрос: почему? Не похрен ли, одна команда развернётся в 10 микроопераций или четыре команды развернутся в столько же? В первом случае даже нагрузка на декодер меньше.

★★★★★

Последнее исправление: Klymedy (всего исправлений: 1)

особенности реализации (Ц) (Р) (ТМ)

exception13 ★★★★★
()

Не увидел опровержения.

anonymous
()

Сделаю дикое предположение (где-то когда-то слышал, т.ч. пруфов не будет): i686 давным-давно внутри RISC, а вся это CISC галиматья идёт уже как эмуляция забытой летающим макаронным монстром костыльных, ископаемых фекалий мамонтов под названием i386.

TL;DR: x86 — это RISC. CISC-коммадны i386 эмулируются через micro-code со всеми вытекающими.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от Waterlaz

Похоже на миф. Я бы скорее предположил обратное.

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

exception13 ★★★★★
()
Ответ на: комментарий от exception13

Эта методика потеряла актуальность только для суперскалярных архитектур.

nanoolinux ★★★★
()

leave медленнее, чем

mov esp, ebp
pop ebp

Мухаха! Замени все leave в своём горячо любимом системд на второй вариант, и твоя система будет загружаться ещё быстрее!

nanoolinux ★★★★
()
Ответ на: комментарий от Waterlaz

Похоже на миф

Дожили :) Ещё недавно растактовку команд на память помнил любой уважающий себя программист среднего уровня.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Когда-то и вода была мокрее и дефки сиськатей и будущее лучше... стоп, мы уже в будущем! :)

beastie ★★★★★
()
Ответ на: комментарий от KRoN73

Дожили :) Ещё недавно растактовку команд на память помнил любой уважающий себя программист среднего уровня.

Тогда у процессора не было кэша. И переписываемого микрокода. Да и самих команд в x86 было сильно меньше.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от KRoN73

Не ты ли рассказывал, что операции типа scasb на 386 и ниже были неприемлемо медленными, а когда их ускорили в 486, все ручные оптимизации полетели к чертям?

question4 ★★★★★
()
Ответ на: комментарий от question4

утверждал, что собственноручно это измерял на 8088, 386 и 486 и получил разные результаты — на первых двух быстрее одно, на 486 — другое

Не измерял, а знал из справочников :)

И с тех пор забил на ручную оптимизацию

Я забил с первыми Пнями. Во-первых, два конвейера стало реально сложно считать, во-вторых, компиляторы Си стали писать оптимальный код, сравнимый со средним по качеству ассемблерным (и при этом на написание кода уходили раз в десять меньше времени). А окончательно в гроб подсчёт тактов загнал MMX :) Я не придумал, под какие из своих задач его притянуть и окончательно забил на ассемблер :D

(сорри, лениво переписывать ответ на удалённое, так что выше оставлю как есть)

Не ты ли рассказывал, что операции типа scasb на 386 и ниже были неприемлемо медленными, а когда их ускорили в 486, все ручные оптимизации полетели к чертям?

Я помню, что растактовка строковых операций менялась несколько раз. Только, кажется, наоборот было. До ~80386 строковые были быстрее, а с 80486 стало быстрее работать через регистры, т.к. строковые стали эмулироваться. Но могу уже и ошибаться, почти 20 лет прошло.

KRoN73 ★★★★★
()
Ответ на: комментарий от intelfx

Это когда программисты среднего уровня занимались микрооптимизациями?

Тогдашний «средний уровень» соответствует очень низкому современному :)

Собственно, основная масса программистов делилась на тех, кто пишет на ассемблере и Си (с ручным распахиванием бинарного кода и ассемблерными вставками) и на программистов на Бейсике (прикладники, которым надо было на коленке расчёты проводить и т.п.) Поколение старых фортранщиков уже стало составлять слишком малую долю, прикладники на Паскале как-то были скорее экзотикой :)

Это, блин, было время, когда на Бейсике программы писали «братки» с рынка :D — http://www.balancer.ru/g/p2655957

KRoN73 ★★★★★
()
Ответ на: комментарий от intelfx

лет 15-20 взад. не знающий ассемблер погромист отправлялся пейсать на фокс-про — 1с того времени.

anonymous
()

про stos и scas - 4.2

anonymous
()
Ответ на: комментарий от beastie

CISC-коммадны i386 эмулируются через micro-code со всеми вытекающими

CISC команды по определению выполняются через микрокод. В этом суть CISC

no-such-file ★★★★★
()

Не похрен ли, одна команда развернётся в 10 микроопераций или четыре команды развернутся в столько же?

Для конвеера и внутреннего шедулера процессора далеко не похрен.

no-such-file ★★★★★
()
Ответ на: комментарий от nanoolinux

Мухаха! Замени все leave в своём горячо любимом системд на второй вариант, и твоя система будет загружаться ещё быстрее!

Когда же он станет настолько быстрым, что перестанет восприниматься человеком, и мы забудем его, как страшный сон?

anonymous
()
Ответ на: комментарий от anonymous

лет 15-20 взад
1с того времени

15 лет назад 7.7 уже два года как была, так что на фоксе только неудачники писали.

ovk48 ★★★
()
Ответ на: комментарий от arturpub

и правильно. есть первоисточник — software developer's manual. там каждый год что-то меняется.

anonymous
()
Ответ на: комментарий от arturpub

везде бывают ошибки, тем более что тут сплошные цифры и проверить их не представляется возможным.

wakuwaku ★★★★
()
Ответ на: комментарий от anonymous

После этого Поттеринга живым на огненной колеснице возьмут в рай. Он будет внедрять systemd как систему инициализации вселенной.

proud_anon ★★★★★
()
Ответ на: комментарий от no-such-file

CISC команды по определению выполняются через микрокод. В этом суть CISC

т.е. hard-wired CISC существовать не может? Ломающие новости. Как же M68060, например?

AptGet ★★★
()

leave медленнее, чем

ПРотухло лет 8назад. И не актуально - всем класть.

enter N, 0

Так же протухло.

stosd

Протухло, выкини этот ущербанский синтаксис на этмо форуме.

repne scasb

Патамучто говно и нахрен никому не нужно.

Вопрос: почему? Не похрен ли, одна команда развернётся в 10 микроопераций или четыре команды развернутся в столько же? В первом случае даже нагрузка на декодер меньше.

Патамучто никому это говно не нужено и всем похрен как она там разварачивается. Да и развернуть нормальнольно все эти rep'ы не представляется возможным.

Темболее все они разварачиваются в банальные циклы на операнде rep'а, поэтому мало того, что твой цикл 8-мибитный - он ещё и на ущербански медленном scas"е. Когда как та же cmp намного быстрее.

Сейчас только movs разварачивается во что-то вменяемое.

anonymous
()
Ответ на: комментарий от question4

Не ты ли рассказывал, что операции типа scasb на 386 и ниже были неприемлемо медленными, а когда их ускорили в 486, все ручные оптимизации полетели к чертям?

Этого не может быть по определению. Даже если запилят идеальный rep's, то он как максимум будет такой же, как ручной цикл. А сейчас даже в говно илитный movs сливает в хлам нормальному, ручному циклу.

anonymous
()
Ответ на: комментарий от KRoN73

Не измерял, а знал из справочников :)

Время 386-го было всё настолько примитивно, что те знания - это ничто сейчас.

Я забил с первыми Пнями.

Твоя проблема.

Во-первых, два конвейера стало реально сложно считать

Очередные мифы и легенды из говнокниженок - в х86 никогда небыло «одного конвейера», да и какая тебе разница? Их там мильёны, только что это меняет?

во-вторых, компиляторы Си стали писать оптимальный код

Только в мечтах.

сравнимый со средним по качеству ассемблерным

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

Ручно говноассемблер всегда был говно и никакого качества там небыло.

(и при этом на написание кода уходили раз в десять меньше времени)

Это проблемы не ассемблера, ни х86, ни конпелятора, ни сишки, а идиотов. Писалось одно говно и это проявилось только с приходом нормальных конпеляторов, и не конпелятор стал что-то там «оптимизировать», а просто все писали говно, думая иначе.

А окончательно в гроб подсчёт тактов загнал MMX

Везде применимо, хотя первых ммх были одним названием, как и всегда у штеуда.

Я помню, что растактовка строковых операций менялась несколько раз. Только, кажется, наоборот было. До ~80386 строковые были быстрее, а с 80486 стало быстрее работать через регистры, т.к. строковые стали эмулироваться. Но могу уже и ошибаться, почти 20 лет прошло.

Они всегда эмулировались, а говном они стали из-за своего throughput'а, когда он пошел в отрыв на нищем х86, при этом на «строкое операции» все поклали.

anonymous
()
Ответ на: комментарий от KRoN73

Какая такая растактовка в OoO?!?

anonymous
()
Ответ на: комментарий от anonymous

Царь в треде! Мебель, хули тормозишб, надо банить по IP.

anonymous
()

Это тебе не функциональщина, у каждой ассемблерной команды куча побочных эффектов, всё зависит от того, какой эффект ты эксплуатируешь.

luke ★★★★★
()
Ответ на: комментарий от anonymous

Негоже царю писать из-под анонима. Регайся и вливайся в дискуссию!

kravich ★★★★
()

а нельзя ли написать простенький синтетический тест и прогнат его?

тут нужно обязательно именно развести теорию (?), и рассуждать строго исходя из теории?

[ну, я просто интересуюсь:)]

user_id_68054 ★★★★★
()
Ответ на: комментарий от no-such-file

CISC команды по определению выполняются через микрокод. В этом суть CISC

С какой такой радости? Совершенно не обязательно. Может быть железная реализация в multi-cycle FSM.

anonymous
()

Неоднократно слышал

Вопрос: почему?

дык и спросил-бы у того, от кого слышал. Мне вот это тоже не очевидно. Да и тесты этого НЕ подтверждают.

emulek
()
Ответ на: комментарий от beastie

i686 давным-давно внутри RISC

да.

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

да.

CISC-коммадны i386 эмулируются через micro-code со всеми вытекающими.

дык leave это тоже не RISC, как и mov esp, ebp pop ebp

emulek
()
Ответ на: комментарий от exception13

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

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

emulek
()
Ответ на: комментарий от beastie

на развернуть microcode тоже imho такты нужны.

нет. Они *одновременно* разворачиваются.

emulek
()
Ответ на: комментарий от KRoN73

Только, кажется, наоборот было. До ~80386 строковые были быстрее, а с 80486 стало быстрее работать через регистры

...а потом опять строковые стали быстрее. А сейчас — не знаю.

emulek
()
Ответ на: комментарий от anonymous

Очередные мифы и легенды из говнокниженок - в х86 никогда небыло «одного конвейера», да и какая тебе разница? Их там мильёны, только что это меняет?

занесите в фортунки.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.