Graphics Programming
SSE2, AVX2 테스트 본문
https://deplinenoise.files.wordpress.com/2015/03/gdc2015_afredriksson_simd.pdf
이거 보고 첫번째 예제 간단히 코딩해서 시간을 측정해봤다. (내 코드는 여기)
테스트1
디버그 빌드
- Scalar: 0.7278700 seconds
- SSE2: 0.0579500 seconds (12.56x faster)
- AVX2: 0.0306839 seconds (23.72x faster)
릴리즈 빌드
- Scalar: 0.0435770 seconds
- SSE2: 0.0015728 seconds (27.70x faster)
- AVX2: 0.0006350 seconds (68.62x faster)
SIMD만으로 이렇게 극적으로 빨라지는 건 아니고 AOS를 SOA로 바꿔서 캐시 히트를 크게 높인 것도 있다. 그러고보니 SOA 레이아웃에서 단순 루프 도는 버전을 빼먹었다.
집에서 이런 거 찬찬히 파보고 싶은데 맨날 늦게 퇴근해서 시간이 없다. 이 글만 해도 새벽 2시 반에 쓰는 중이다. 주말엔 여유가 있어도 하기 싫고... 사람이 어떻게 일주일 내내 코딩만 하고 살어 ㅜ.ㅜ
테스트2
Scalar(SOA) 버전을 추가해서 다시 재봤다.
디버그 빌드
- Scalar(AOS): 0.7304680 seconds
- Scalar(SOA): 0.0258607 seconds (28.24x faster)
- SSE2: 0.0589321 seconds (12.39x faster)
- AVX2: 0.0312854 seconds (23.34x faster)
릴리즈 빌드
- Scalar(AOS): 0.0429811 seconds
- Scalar(SOA): 0.0040337 seconds (10.65x faster)
- SSE2: 0.0015692 seconds (27.39x faster)
- AVX2: 0.0006341 seconds (67.78x faster)
디버그 빌드에서는 SIMD를 쓰면 오히려 느려진다. 머지 -_- 컴파일러 옵션을 건드려야 하나?
레퍼런스에도 써있지만 SOA 레이아웃이어야 SIMD를 쓰는 의미가 있다. 위 테스트에서도 SOA 레이아웃으로 바꾼 것만으로 10배 빨라졌다.
SSE2, AVX2를 썼을 때 이상적인 속도 향상은 4배, 8배지만 현실적으로는 2.7배, 6.7배 정도 빨라졌다. 이것도 SIMD 활용하기 이상적인 단순한 예제여서 이만큼 빨라지지, 더 복잡한 상황에서는 성능 향상이 적을 것 같다.
UE4 소스에서 VectorRegister로 검색해봤는데 사용하는 곳은 많지만 대부분 한 객체의 x, y, z, w 성분을 한 레지스터에 넣고 연산을 동시에 하는 유형의 코드여서 SOA 레이아웃을 활용한 건 아니다.