2017-05-18 1 views
-1

Heres는 내 코드 :파이프 라이닝을 개선하기 위해 분기/if 문을 제거해야합니다. 여기에서 수행하는 방법은 무엇입니까?

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

    // amount 
    value *= mAmount; 
} 

어떻게 당신이 경우/지점을 제거 최적화 것인가? (저는 DSP 컨텍스트에서 가능한 한 최적화해야합니다). mIsBipolar 만약

+0

'mIsBipolar'의 종류는 무엇입니까? – sithereal

+0

그것 bool. 참 또는 거짓. 하지만 int 1/0으로 전환 할 수 있습니다 (만약 그것이 같음). – markzzz

답변

1

는이

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

는 이전 코드로 정확하게 작동해야 bool이다.

mIsBipolar이 false입니다 다음의 int 표현은 0이며, 그 다음 true 때 그래서 당신은

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

있습니다 정확히 공식이다

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

.

1

목표가 if를 제거하면 다음과 같이 (거의) 항상 수행 할 수 있습니다. mIsBipolar에 해당하는 경우

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

는 값이 그렇지 않은 경우 + 기호 !mIsBipolar*((value + 1.0)/2.0)의 오른쪽에있는 값을 가져옵니다 원래 값 value = mIsBipolar*value 유지합니다.

관련 문제