2015-02-05 2 views
0

Какого код является более эффективным:Удаление ветвей при установке локальных переменных

рутина

local int a[5]; 
bool condition; 
... 
a[0] = 0; 
if (condition) { 
     a[0] = 1; 
} 

или Рутинное B

local int a[5]; 
bool condition; 
.... 
a[0] = 0; 
a[0] = select(a[0], 1, condition); 

Второго листинг удаляет ветвь, но оператор выбора может дважды щелкните локальную память, если условие ложно. Будем надеяться, что компилятор установит значение no-op, если условие ложно.

+0

Большинство, если не все компиляторы могут заменить первую ветвь условным перемещением без разветвления. Пожалуйста, найдите время, чтобы проверить сгенерированную сборку, прежде чем задавать такие вопросы на SO ... –

ответ

1

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

Например, вы не можете сказать такие вещи, как «удаление инструкции if избавляется от ветки», что, если компилятор решил использовать команду сравнения и установки вместо ветви сравнения, за которой следует переход?

Если условие всегда неверно, код будет считаться мертвым кодом, и компилятор может решить поместить ничего вместо no-op.

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

выбор выглядит так, как будто он предназначен для векторов, а не только для отдельных значений. Скорее всего, он может использовать инструкции SIMP, которые работают на массивах, а не только на одно значение, например, то, что у нас есть. См. OpenCL built-in function 'select'

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