미분류

SSE와 AVX, FMA3를 활용하자

C/C++ 게임 코딩을 좀 하다보면 SSE라는 녀석에 대해 듣게 된다. SSE 계열 명령어는 x86 및 x64 아키텍처의 주요 SIMD 명령어 셋이다. 이와 비슷한 것으로 ARM 아키텍처에는 NEON이 있다.

몇 년간은 SIMD 명령어 셋에 대해 알고는 있어도 컴파일러가 알아서 SIMD 명령어로 만들어 주겠지 하고 단순히 고급 언어로만 코드를 작성했었으나 최근에 그래도 컴파일러가 만능은 아닌데 코드를 안 만들어줄 수도 있지 않을까 하고 공부하면서 코드를 작성했었다.

위 이미지는 작년에 작성해서 돌려보고 찍었던 테스트 결과 스크린 샷이다. 여러 번 돌려보면서 그나마 결과가 잘 나온 화면을 찍었던 것이고, 생각보다 결과가 만족스러울 만큼 좋아진다는 느낌이 없어서 그 뒤로 한동안은 다시 SIMD 명령어는 다뤄보지 않았다.

 

그리고 이번에 아예 새로 다시 작성을 해봤다.

1

인라인 함수에 대해서는 행렬 저장 기능이 컴파일러 최적화로 코드 자체가 날아가버렸다. 그나마 행렬 결과물 테스트해본다고 곱셈 연산한 것은 남았다.

참고로 컴파일러 최적화를 수행한다면 위와 같은 형태가 되지만 최적화를 수행하지 않는다면 차이가 크게 벌어지지는 않는다. 특히나 인라인 함수로 실행한 코드가 아니라면 오히려 SSE나 AVX가 인라인 C++ 코드보다 더 느릴 때도 있다.

처음엔 volatile 키워드로 아예 C++ 코드는 레지스터 사용을 안 하도록 설정해보기도 했는데 차이가 벌어지지는 않는다.

SSE 시리즈는 아마 코어 2 듀오 시리즈들은 웬만하면 사용할 수 있을테고 AVX는 코어-i 2세대(샌디브릿지)부터, AVX2의 FMA3는 코어-i 4세대(하스웰)부터 사용할 수 있으니까 개발 타겟에 따라서 명령어를 쓰면 될 듯 싶다.

AVX는 256비트짜리를 행렬곱에 그대로 쓰면 오히려 느리고 AVX에서 추가된 SSE 확장(_mm_broadcast_ss)을 쓰거나 FMA3와 같이 쓰거나 하는게 효율이 좋다.

코어 2 듀오, 애슬론, 페넘 등 2005~2009년에 출시된 컴퓨터: MMX, SSE, SSE 2, SSE 3, SSSE 3, SSE 4.1, SSE 4.2, SSE 4a
코어 i-2세대, 불도저 등 2011년 이후 출시된 컴퓨터: SSE 시리즈, AVX
코어 i-4세대, 파일드라이버 등 2012~3년 이후 출시된 컴퓨터: SSE 시리즈, AVX, FMA3

광고

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중