※ DirectXMath 란?

   - WIndow 8 이상에서 DirectX3D 응용 프로그램을 위한 표준 3차원 수학 라이브러리이다. Windows SDK의 일부인 이 라이브러리는 SSE2(Streaming SIMD Extensions 2) 명령 집합을 활용한다.

 

   ▶  SIMD (single instruction multiple data)란?

        하나의 명령으로 여러데이터를 처리한다.

   ▶  SSE2(Streaming SIMD Extensions 2)란?

        128비트 너비의 SIMD레지스터를 이용해서 float, int와 같은 32비트 데이터 4개를 한꺼번에 처리한다. 

        그래서 벡터계산을 아주 유용하게 할 수 있다.

# 참고자료

https://m.blog.naver.com/fs0608/221650925743

 

SIMD (Single Instruction Multiple Data)에 대한 집중탐구!

안녕하세요~! 오늘은 파수테크 블로그 첫번째 시간으로 SIMD (Single Instruction Multiple Data)...

blog.naver.com

https://www.secmem.org/blog/2022/02/15/Intel-Intrinsics-Guide/   

 

Intel Intrinsics(SIMD) 가이드

1. Introduction 우리가 주로 사용하는 Intel(AMD) 아키텍쳐에서는 SIMD(Single Instruction Multiple Data)를 이용할 수 있습니다. SIMD는 말 뜻 그대로 하나의 명령을 통해 여러 값의 연산을 동시에 처리하는 명령

www.secmem.org

 

   ▶  X86(32bit)에서 SSE2 사용 할때 주의사항

         - SSE2를 활성화 해야된다. x64는 상관없이 다된다.

           ( 프로젝트속성 > 구성 속성 > C/C++ > 코드 생성 > 고급 명령 집합 사용)

 

※ 사용해보기.(여기에선 visual studio community 2019로 작업한다.)

       ▶  빈 프로젝트를 만든다.

     

     ▶  C++ 소스파일을 만든다

 

     ▶  여기서 X84로 사용해서 SSE2사용 체크를 한다.       

 

     ▶  DirectXMath.h 추가 및 DirectX 네임스페이스 사용

        여기까지 됬으면 사용할 준비는 끝났다.

 

※  벡터 형식들 알아보기

         ▶  XMVECTOR 

               - DirectXMath에서 핵심 벡터 형식은 SIMD 하드웨어 레지스터에 대응되는 XMVECTOR이다.

                 이 XMVECTOR는 128비트의 크기의 32비트 부동소수점 값 4개로 구성되어있고 한번 명령

                  으로 4개를 처리할 수 있다. 정의는 다음과 같다.

 

               typedef __m128 XMVECTOR;

 

                  SIMD의 장점을 쓰려면 벡터가 XMVECTOR 형식으로 바껴야 된다.

                  이 형식으로 3차원 ,2차원 값을 처리할 수 있다. 쓰이지 않는 성분들은 0으로 설정하면 된다.

 

               - XMVECTOR는 16바이트에 경계에서 정합(alignment) 되어야 한다. 그래서 자동으로 정합이

               일어나는 지역변수나 전역변수에서 사용된다.

 

         ▶  XMFLOAT2 , XMFLOAT3 , XMFLOAT4

               - 벡터 성분들을 담는 구조체이다. 클래스 멤버 자료형으로 사용되는 걸 권장된다.

                 1) FLOAT2 : 2차원 벡터값을 담는 구조체 

                 2) FLOAT3 : 3차원 벡터 값을 담는 구조체

                 3) FLOAT4 : 4차원 벡터 값을 담는 구조체

                

                FLOAT2 , FLOAT3, FLOAT4 벡터 연산은 가능하다. 하지만 SIMD의 장점을 사용해서 계산하는

               것이 효과적이기 때문에 XMVECTOR 형식으로 변환해야 한다.

 

         ▶  XMLoadFloat2 , XMLoadFloat3 , XMLoadFloat4

               - XMLoadFloat는 XMFLOAT -> XMVECTOR에 변환해서 저장을 할 수 있게 도와주는 함수이다. 

                이것을 XMFLOAT -> XMVECTOR에 적재한다고 표현한다.

 

         ▶  XMStoreFloat2 , XMStoreFloat3 , XMStoreFloat4

               - XMStoreFloat는 XMVECTOR -> XMFLOAT에 변환해서 저장을 할 수 있게 도와주는 함수이다.

                이것을 XMVECTOR-> XMFLOAT에 저장한다고 표현한다.

 

         ▶  XMVectorGetX , XMVectorGetY , XMVectorGetZ , XMVectorGetW                

               -  이것은 XMVECTOR의 특정 성분만 읽고 싶을 때 사용하는 함수들이다.

         ▶  XMVectorSetX , XMVectorSetY , XMVectorSetZ , XMVectorSetW                

               -  이것은 XMVECTOR의 특정 성분만 변경하고 싶을 때 사용하는 함수들이다.

 

           # 실제 사용       

                   

 

                # 정리

               1. 지역변수나 전역변수에는 XMVECTOR를 사용한다.

               2. 클래스 자료 멤버에 XMFLOAT2 , XMFLOAT3 , XMFLOAT4를 사용한다.

               3. 계산을 수행하기 전에 적재(Load) 함수들을 이용해서 XMFLOAT 을 XMVECTOR로 변환한다.

               4. XMVECTOR 인스턴스들로 계산을 수행한다.

               5. 저장 함수들을 이용해서 XMVECTOR를 XMFLOAT으로 변환한다.

 

 

 

 

'Directx12 > DirectX 내용' 카테고리의 다른 글

DirectXMath 라이브러리의 벡터(3)  (0) 2022.08.15
DirectXMath 라이브러리의 벡터(2)  (0) 2022.08.14

+ Recent posts