본문 바로가기

개인공부/Branchless Programming

(Branchless Programming) 절대값 구하기

 

보통 절대값을 구하는 함수는 위의 함수처럼 구하지만 

Branchless 프로그래밍에선 아래처럼 한다.

 

간단히 코드 설명을 하자면

 

int mask = x >>31; 은 int (32bit) 의 모든 비트를 오른쪽으로 옮기니

 

if x >= 0 then mask = 0

if x < 0 then mask = -1

이 된다.

 

여기서 x 와 XOR 연산으로 mask 를 묶어주면 

if x >=0 then x ^ mask = x ( mask = 0)

if x < 0 then x ^ mask = ~x ( mask = -1) 비트 반전이 된다.

 

결국 return value 는 (x ^ mask) - mask 이니 

if x >=0 then (x ^ mask) - mask = x - 0 = x;

if x < 0 then (x ^ mask) - mask = ~x + 1 = -x; (2의 보수값이 된다.)

 

자 그럼 속도 테스트를 해보자.

 

 

 

 

위와 같이 branched abs function 과 branchless abs function 두개를 만들어서 clock 함수로 시간측정을 해보겠다.

 

 

 

결과를 보게되면 평균 200us 의 속도 차이를 보이게 된다. (Test 결과는 Second 단위이다.)

Low latency 환경에서 200us 차이는 엄청나게 크므로 확실히 유의미한 차이라고 볼 수 있다.