[t:/]$ 지식_

SIMD

2017/06/23

에.. SIMD를 이용하여 MLP (기본적인 머신러닝 알고리즘)를 최적화해봤는데요...
SIMD 최적화를 컴파일러에 맡기지 않고 손으로 😑 하면..

x86에서는 O3 보다 7-8배 빨라졌습니다.
ARM NEON에서는 O3 보다 2-3배 빨라졌습니다.

-ffast-math라는 예외 옵션이 있긴 한데 이를 쓰면 굉장한 속도 향상이 일어나나 에러가 증가하면서 학습을 종료하지 못하거나 종료 조건에 수렴하지 못하는 현상이 있습니다.

이미 사이킷런이나 여러 머신러닝 툴들이 SIMD를 지원하고 있습니다만, 임베디드에서는 사례가 적은 편이고, SIMD를 사용하는 툴들의 속도 향상이 생각보다는 작았습니다. (tinyDNN의 사례만 살펴보았음. 싸이킷런은 이미 느려서..)

GPU 시대이긴 합니다만, 임베디드에서는 배터리나 칩가격 문제랑 싸워야 할 수가 있으므로 SIMD도 대안 중 하나입니다.

실험을 진행하면서 플로팅 연산의 바틀넥이 상당하다는 것을 알 수 있었고, SIMD로 확보한 성능 향상을 플로팅 연산이 다 까먹는 느낌적 느낌이 들었습니다. 이를 극복할 알고리즘은 구상 중에 있습니다만 회사에서 월급주는 일이 아니라..

인텔의 경우 아마도 파이프 설계가 잘 되어 있어서 SIMD와 플로팅연산과 원래 자기 할 일의 병행 처리를 잘하고 있는 것으로 추정됩니다. ARM에 비해 성능향상이 월등한 이유가 바로 이런 차이가 아닐까 합니다. ARM의 파이프는 병행 처리를 거의 못하고 순차처리하는 부분이 더 많을 것으로 추정됩니다. 실험은 라즈베리파이3로 했는데 더 상위라인 코어를 쓰면 다를 수도 있겠죠.

이번에 멀티쓰레드는 귀찮아서-_-;뺐는데.. 멀티쓰레드와 SIMD를 엮으면 꽤 괜찮은 대안일 수도 있습니다...

이걸 논문으로 써서 6월 17일부터 진행된 정보과학회 하계학술대회에서 우수논문상을 받았습니다.

아.... 물론 저는 다른 걸로 월급받고 다닙니다.... -_-;;









[t:/] is not "technology - root". dawnsea, rss