임베디드 딥러닝

[임베디드 딥러닝] gprof 프로파일러를 이용해 딥러닝 최적화하기 - 3

다락공방 2024. 8. 28. 02:47

나는 총 3가지의 최적화 기법을 사용하였는데, 하나 하나 살펴보자 

다시 공부하니 최적화 기법이 엄청 길고 많아서 따로 정리하는 거도 좋겠다. 일단 여기서는 사용한것만 쓰겠다. 

 

1. Loop 에서 0과 비교하기

위 루프의 경우 i 가 10 보다 작은지 비교하고 있고, 아래 루프에서는 i 가 0 과 다른지 비교하고 있는데

일반적으로 0 과 비교하는 명령어는 CPU 에서 따로 만들어져 있기 때문에 더 빠르게 작동한다.

 

 

2. Loop Unrolling 

루프문을 굳이 쓰지 않고 쓸 수 있는 문장들은 되도록 직접 쓰는 것이 좋다.

for 문 자체에서 돌때마다 종류 조건 비교 및 변수 증가도 있으므로 시간이 든다.

 

3. Pointer Chaining

  • 포인터 체이닝은 구조체 내에서 정보를 액세스하기 위해 자주 사용된다.
  • 코드에서는 각 할당(assign)마다 p->pos를 다시 로드해야 합니다. 이는 컴파일러가 p->pos->x가 p->pos의 별칭(alias)이 아니라고 판단하기 때문이다.
  • 더 나은 방법은 p->pos를 로컬 변수에 캐시하는 것이다.

간단히 말해서 메모리를 더 써서 효율을 높이는 거라고 볼 수 있다. 

 

 

초기 원본의 프로파일링이다. 

Compute_backward 함수가 가장 많이 사용되어서 해당 함수를 최적화 타겟으로 3가지 기법을 적용해봤다. 

 

1. Loop 에서 0과 비교 결과

실제 Compute_backward   함수에서는 위와 같이 for문의 변형을 진행하였고 결과는  아래와 같았다. 

초기 원본과 다른이유는 다른 환경에서 프로파일링을 진행해서 그렇다. 

208.15 -> 167.79 19%감소한 실행 시간을 보인다.

 

2. Loop Unrolling 결과

위처럼 하나의 루프안에서 여러번 수행하도록 변경하였고 결과는 아래와 같다. 

 

실제 Compute_backward   함수에서는 위와 같이 for문의 변형을 진행하였고 결과는  아래와 같았다. 

150.32 -> 133.7711.1% 감소함을 보였다.

 

 

3. Point chaining 결과

 

위처럼 진행하였고, 

150.32 -> 108.8227.6% 감소함을 보였다.

 

 

3가지 기법을 적용해보았을때 Pointer Chaining 기법이 가장 감소율이 큰것을 볼 수 있었다.

 

최적화 기법은 따로 다시 정리하는게 좋겠다.