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

Подскажите, почему избавление от условного выполнения увеличивает performance? Так или

иначе все равно тут есть сравнение же

15 ответов

4 просмотра

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

Melonges-🇸🇮 Автор вопроса
disba1ancer
во втором случае выше вероятность что компилятор с...

А, то есть нужно конкретно избегать if else ветвлений, а не сравнений?

Melonges 🇸🇮
А, то есть нужно конкретно избегать if else ветвле...

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

Melonges-🇸🇮 Автор вопроса
disba1ancer
смысл в том чтобы избежать команд перехода в резул...

Я как слышал jump и у ему все подобные практически бесплатны, нет?

Melonges 🇸🇮
Я как слышал jump и у ему все подобные практически...

проблема в ветвлении, ветвление требует предугадать место прыжка

Melonges 🇸🇮
Я как слышал jump и у ему все подобные практически...

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

Melonges-🇸🇮 Автор вопроса
Самый маленький
Смешные у тебя шутки, проблема именно в переходе, ...

Задаюсь вопросом тогда что лучше) https://godbolt.org/z/czKqY83PY

Melonges 🇸🇮
Задаюсь вопросом тогда что лучше) https://godbolt....

Так нет однозначного ответа, от архитектуры и компилятора зависит, а вообще лучше сделать вставку под x86 и обернуть макросами, чем хардкодить размер инта (хотя и можно было взять (CHAR_BIT * sizeof a - 1)), тем не менее нет никаких гарантий, что под условный IA64 твоя программа будет работать эффективнее классической реализации. Если интересно, можешь ручками посчитать примерно - смотришь сколько исполняются твои инструкции в тактах, добавляешь половину латентности, хотя прям точного результата не получишь.

Самый маленький
@disba1ancer я ни в чём не ошибся?

я всех деталей точно не знаю, но выглядит, как нормальное объяснение

Там всё равно SIMD будет в обоих случаях, ну какие бранчи?

Melonges-🇸🇮 Автор вопроса
s54820
Там всё равно SIMD будет в обоих случаях, ну какие...

Так вроде бранчи не позволяют его использовать

Melonges 🇸🇮
Так вроде бранчи не позволяют его использовать

Наоборот, такое очень хорошо векторизуется, и компиляторы достаточно умные, чтобы убрать if. Вот gcc выдаёт в теле цикла для обоих вариантов одно и то же, элементы инты, в xmm2 продублировано по всем элементам 49. После цикла горизонтальное суммирование ещё. Из бранчей только сам цикл: movdqu xmm0, XMMWORD PTR [eax] movdqu xmm3, XMMWORD PTR [eax] add eax, 16 pcmpgtd xmm0, xmm2 pandn xmm0, xmm3 paddd xmm1, xmm0

Melonges-🇸🇮 Автор вопроса
s54820
Наоборот, такое очень хорошо векторизуется, и комп...

Ну получается не нужно избегать if else если это можно математическим путем решить?

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Блин, интересно, кто-нибудь когда-нибудь переписывал какую-нибудь игру с x86 на arm? Вообще, такое возможно?
Alan 🔝 Бэброу
12
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
I just installed it but how do I use it?
Talula
12
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Карта сайта