Мне нужно удалить ветки / если заявление, чтобы улучшить конвейерную обработку: как это сделать здесь?

Вот мой код:

inline void ScaleValue(double &value) {
// bipolar
if (!mIsBipolar) {
value = (value + 1.0) / 2.0;
}

// amount
value *= mAmount;
}

Как бы вы оптимизировали его, удалив ветки / если? (Я в контексте DSP, мне нужно оптимизировать, насколько это возможно).

-1

Решение

Если mIsBipolar это bool тогда это

inline void ScaleValue(double &value) {
value = mAmount * ((1+mIsBipolar)/2.0 * value + (1-mIsBipolar)/2.0);

должен работать точно так же, как ваш предыдущий код.

Когда mIsBipolar является false тогда его int представление равно 0, и поэтому у вас есть

value = mAmount * ((1+0)/2.0 * value + (1-0)/2.0);

когда он является true затем:

value = mAmount * ((1+1)/2.0 * value + (1-1)/2.0);

что именно ваша формула.

1

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

Если вашей целью является удаление if и затем, вы можете (почти) всегда делать следующее.

inline void ScaleValue(double &value) {
value = mIsBipolar*value + !mIsBipolar*((value + 1.0) / 2.0)
value *= mAmount;
}

если mIsBipolar истина, то значение сохраняет свое первоначальное значение value = mIsBipolar*value
в противном случае он получает значение в правой части + знак !mIsBipolar*((value + 1.0) / 2.0),

1