* 이 강의는 비전공 웹싸개의 개인적인 견해가 포함되어 있음
오늘의 주제는 바로 Branchless 프로그래밍이다. 말 그대로 브랜치 없이 프로그래밍 해보자란 뜻임.
그럼 branch는 뭐냐? if, switch, 삼항연산자처럼 조건에 따라 다른 코드를 실행하게 되는 분기점을 말함.
근데 이런 if, switch같은 branch들이 니 코드를 꽤 많이 느려지게 함..
일단 왜 느려지냐?????
CPU는 현재 명령어를 실행하면서 다음 명령어를 미리 읽어서 준비함. 이걸 명령어 프리패치라 함
명령어 프리패치를 하다가 if 나오면 cpu 입장에선 어떤 명령어를 load해야할지 알 수가 없음.
그래서 둘 중 어떤 경로로 가야할지 예측을 해서 일단 명령어를 로드해놓고 만약 예측이 맞으면 좋고,
예측이 틀리면 로드되어있는 명령어를 flush하고 실제 실행할 명령어를 다시 load함. 이걸 분기예측이라 함
문제는 분기예측이 틀렸을때 명령어를 flush하고 다시 load하는 이 과정이 엄청 느리기 때문에 코드 실행 전체가 느려질 수 있음.
그래서 어떻게 해야하냐?
if 문을 안 쓰면 됨 ㅋㅋ
int min( int a, int b)
{
if(a < b)
return a;
else
return b;
}
이런 코드가 있을 때, cpu는 return a 부분과 return b 중 어느 걸 프리 패치 할 지 알 수가 없음..
따라서 if문을 없앤 cpu 최적화 코드는 아래와 같음
int min(int a, int b)
{
return a*(a<b)+b*(b<=a)
}
가독성은 똥망이지만 실제 c++ 로 컴파일 해서 루프 안에서 돌려보면 시간차이가 유의미하게 남
예를 들면 이런 식으로 수 많은 곳에 적용 가능함.
특히 문자열 처리할때 switch나 if문 나열해놓은 코드들은 branchless하게 짜면 2배까지도 성능차이를 볼 수 있음
하지만 이런 걸 웹싸개가 할 필요가 있느냐???
할 필요도 없고 해서도 안됨.
코드를 후자처럼 짠다? 퇴사권고 당할 수 있으니 조심
요즘 어셈블리 배우노 게이야
4년차 cto ㅋㅋㅋ
유의미한 차이 증거대바라 - dc App