169 похожих чатов

@S54820 подскажи плиз, вот если у нас есть 2 функции

и в первом случае с равной вероятностью при помощи ветвления выбирается вызов одной из них, во втором же случае у нас есть массив с указателями на функции, откуда вызываются функции по оффсету в виде выражения с такой же вероятностью, что из этого должно работать быстрее на x86/x64?

9 ответов

18 просмотров

Не знаю. Я бы сделал явные вызовы без jump table.

А меня почему не спросил😕

КТ315
А меня почему не спросил😕

Так а ты что думаешь по этому поводу?

Денис Rabbit
Так а ты что думаешь по этому поводу?

Ниже написал. Есть свои нюансы. s54820 отказался от jump table, потому что, вроде как, на новых процессорах это внутри неплохо оптимизируется. Дело в том, что при использовании jump table, от процессора не требуется нагрузка на предсказатель ветвлений, а лишь вычислить адрес по формуле (ALU/AGU), однако при больших размерах, это всё требует большего размера программы, и соотв. требует некоторого нахождения в кэше, чтобы быстро обратиться к каждой ячейке массива указателей. В случае с ветвлениями, размер программы уменьшается, но идёт нагрузка на предсказатель ветвлений. Соотв., что я думаю.. Если, допустим, условий 10+ — естественно, гуманно использовать таблицу с указателями, если это возможно. Ну вы сами представьте себе такой код с ветвлениями, это же ужас для процессора будет. Если же условий 2-3, тогда зачем обращаться к памяти, вычислять адрес и т.д и т.п., если процессор вполне неплохо и сам может это оптимизировать (использовать ветвление).

КТ315
Ниже написал. Есть свои нюансы. s54820 отказался ...

Ну, а вообще, ответ s54820 не изменяется. Т.к функций в условии всего 2, тогда и использовать jump table не надо. Я просто хотел подробнее расписать свою точку))

КТ315
Ниже написал. Есть свои нюансы. s54820 отказался ...

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

Денис Rabbit
Так а что же всё-таки дольше - пенальти от неудачн...

Если функции всего 2, удачнее использовать обычное ветвление. На новых процессорах, всякие "пенальти" уже не так критичны будут, если они вообще ещё могут быть. Рассматриваются идеальные варианты, а не кривой код. На старых процессорах, уже всё меняется.

Денис Rabbit
Так а что же всё-таки дольше - пенальти от неудачн...

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

Mixail Frolov
вычисление будет занимать не больше команды lea, а...

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

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта