SSE란?
다음 링크 참고
ko.wikipedia.org/wiki/%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D_SIMD_%ED%99%95%EC%9E%A5
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);
'게임 공부 > DirectX' 카테고리의 다른 글
Constant buffer - 16바이트 단위로 정렬! (0) | 2021.04.02 |
---|---|
atan2(arctan)을 이용하여 pitch, yaw 구하기 (0) | 2021.03.25 |
깊이스텐실 Desc 중 깊이 func 값 관련 - D3D11_COMPARISON_FUNC (0) | 2021.03.18 |
[DirectX] Direct3D 11 programming (1) (0) | 2021.03.05 |
DirectDraw 학습 (4) - 사각형 이동시켜보기 (1) | 2020.11.23 |
댓글