본문 바로가기
게임 공부/DirectX

XMVECTOR 타입 구조 - SSE

by woohyeon 2021. 3. 20.
반응형

SSE란?

다음 링크 참고

ko.wikipedia.org/wiki/%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D_SIMD_%ED%99%95%EC%9E%A5 

 

스트리밍 SIMD 확장 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 스트리밍 SIMD 확장(Streaming SIMD Extensions, SSE)은 x86 아키텍처에 대한 SIMD(단일 명령 다중 데이터) 명령어 집합 확장이며, 인텔이 1999년에 펜티엄 III 시리즈 프로세

ko.wikipedia.org

 

DX에서 자주 사용되는 XMVECTOR는 __m128 타입을 재정의 한 것이다. __m128 타입은 여러 개의 수를 한번에 처리하는 SIMD 연산을 위한 타입이다. SIMD 연산이란 하나의 명령어로 여러개의 데이터를 처리하는 것을 말한다. 

__m128 타입은 다음과 같이 union으로 정의되어 있는 것을 확인할 수 있다.

즉 위와 같은 배열 타입 중 하나의 배열을 사용하게 되는데, 보통 float 타입 연산에 주로 사용된다. float의 경우 4바이트이므로 하나의 __m128 타입의 변수에 최대 4개 크기 배열을 사용할 수 있다. 배열 자체는 일반 float 배열과 다를 게 없지만 연산을 할 경우 내부적으로 사용되는 명령어가 다르다.

예를 들어 float f[4]와 float f2[4] 두 배열을 더하기 위해선 [0]과 [0], [1]과 [1], ...과 같이 총 4번의 덧셈 명령이 필요하다.

하지만 __m128 타입을 사용하게 되면 sse 전용 명령어를 사용하게 되는 데 이 경우 다음과 같이 SSE 전용 레지스터인 xmm 레지스터에 값을 저장 후 연산을 진행하게 된다. 최종적으론 _mm_add_ps 함수 호출 시 addps라는 명령어로 실질적인 4번의 덧셈을 한번에 처리하게 된다.

 

이를 지원하는 함수들 몇 개를 간단하게 살펴보면 아래와 같다.

다음은 vec4에 0.f, 1.f, 1.f, 1.f의 값이 저장된다.

XMVECTOR vec4 = XMVectorSet(0.f, 1.f, 1.f, 1.f);



다음은 v4에 1.f, 1.f, 1.f, 1.f의 값이 저장된다.

FLOAT4 f4 = {1.f, 1.f, 1.f, 1.f};
XMVECTOR v4 = XMLoadFloat4(&f4);



다음은 f4에 0.1, 0.1f, 0.1f, 0.1f의 값이 저장된다.

XMVECTOR vec4 = XMVectorSet(0.1f, 0.1f, 0.1f, 0.1f);

XMFLOAT4 f4 = {};
XMStoreFloat4(&f4, vec4);



댓글