Между кодом низкого уровня и целевой машиной есть компилятор, который и конечная машина, компилятор компиляции которой в конечном итоге определят код сборки, который будет сгенерирован.
Например, вы не можете сказать такие вещи, как «удаление инструкции if избавляется от ветки», что, если компилятор решил использовать команду сравнения и установки вместо ветви сравнения, за которой следует переход?
Если условие всегда неверно, код будет считаться мертвым кодом, и компилятор может решить поместить ничего вместо no-op.
Если вам удалось сгенерировать код сборки, соответствующий для рутинной версии A и рутинной B, и получить таблицу для затрат на обучение для целевой машины, то вы сможете говорить об эффективности машинного кода. У компиляторов обычно есть такие таблицы, встроенные в них, чтобы попытаться выбрать наиболее подходящие комбинации инструкций.
выбор выглядит так, как будто он предназначен для векторов, а не только для отдельных значений. Скорее всего, он может использовать инструкции SIMP, которые работают на массивах, а не только на одно значение, например, то, что у нас есть. См. OpenCL built-in function 'select'
Большинство, если не все компиляторы могут заменить первую ветвь условным перемещением без разветвления. Пожалуйста, найдите время, чтобы проверить сгенерированную сборку, прежде чем задавать такие вопросы на SO ... –