Скорость выполнения условных инструкций по сравнению с математическими функциями

Я постараюсь быть максимально ясным со своим вопросом (не легко … это не так ясно и для меня).
Предположим, у вас есть набор инструкций IF … THEN с несколькими операндами, например

IF ((a==0) && (b==1) && (c==1)) THEN x=1
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2-

и так далее

Предположим, я мог бы заменить все эти IF с одной математической функцией, такой как
x = a * n1 + b * n2 + c * n3 (это просто для того, чтобы дать вам представление, на самом деле это более сложно, но также и IF и операнды намного больше)

Функция происходит от ранее обученной искусственной нейронной сети.

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

Вы можете это подтвердить? Может быть, даже предоставить мне ссылку, где я мог бы найти объяснение?

Заранее спасибо, ребята!

5

Решение

Ваше внутреннее чувство правильно.

Проблема в том, что современные процессоры имеют конвейер, а в конвейере следующий Икс инструкции загружаются последовательно и готовы к выполнению. Если у вас есть ветвь, оператор if, тогда процессор не знает, какой путь кода вы будете использовать следующим, и поэтому он догадывается, используя предсказатель ветви, но если он ошибается, он должен выбросить весь конвейер и начать снова с правильной ветви.

Предсказатели ветвления в современных процессорах довольно хороши, но если у вас есть что-то, что имеет 50/50 шансов пойти тем или иным путем, у вас будет много конвейерных остановок.

Вот почему устранение, если операторы хороши, особенно в тесных циклах.

Кажется, у этого есть хорошее объяснение: http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

4

Другие решения

Других решений пока нет …