2016-04-06 2 views
5

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

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

и так далее

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

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

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

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

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

+0

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

+0

https://en.wikipedia.org/wiki/Branch_predictor и статьи, на которые он ссылается, дадут начало. Относительная прибыль зависит от сложности функции и от возможных ветвей, но, с современными процессорами, часто бывает актуальной конвейерная обработка и отраслевые предсказатели. – Peter

+2

Возможно, вам стоит сначала проверить, что ваш компилятор [уже не может этого сделать] (http://stackoverflow.com/questions/26124620/why-does-msvc-emit-a-useless-movsx-before-performing-this-bit -test), прежде чем запускать свою программу. И, конечно, * всегда * сначала проверяйте, что это действительно * может * изменить ситуацию, используйте профилировщик. Задание программиста состоит в том, чтобы измерять три раза, разрезать один раз. –

ответ

4

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

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

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

Именно поэтому устранение, если утверждения хороши, особенно в плотных петлях.

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

+0

Подумайте, что вы ответите, я проверю! – Maxyone

 Смежные вопросы

  • Нет связанных вопросов^_^