MFC SIMD Vector Class 사용법 정리
in Development on C++
- Header File :
<dvec.h>
SIMD Vector Class 명명법
<Type><Signed><Bits>vec<Nums>
{ F | I } { s | u } { 64 | 32 | 16 | 8 } vec { 8 | 4 | 2 | 1 }
- F : 실수 , I : 정수
- s : signed, u : unsigned ( I에만 사용됨)
- 64 : double, __int64 , 32 : float, int , 16: short , 8 : char
- 8,4,2,1 : pack 개수 (Bits x Nums 는 128을 넘어 갈 수 없다. )
Ex) unsigned int 4개pack class : Iu32vec4 , float 4개 packclass : F32vec4
초기화
- 괄호 안에 각 변수들을 지정
Ex) Is32vec4 pint4(10,20,30,40);
1. 연산자 ( vec = vec op vec)
- = : 대입
- +, += : 덧셈
- - , -= : 뺄셈
*
, *= : 곱셈- / , /+ : 나눗셈 (실수 연산만 가능)
- & : 논리연산 AND
** ** : 논리연산 OR - ^ : 논리연산 XOR
2. 연산자 (vec = vec op n )
- «, «== : Left Shift ( x2 )
- » , »== : Right Shift ( /2 )
3. 함수 (vec = func(vec, vec)
- simd_min() : 최소값
- simd_max() : 최대값
- andnot() : 논리연산 And Not
4. 비교함수 ( 참이면 0xff…, 거짓이면 0 )
- cmpeq : ==
- cmpneq : !=
- cmpgt : >
- cmpge : >=
- cmplt : <
- cmple : <=
- cmpnlt : !(A < B)
- cmpnle : !(A <= B)
- cmpngt : !(A > B)
- cmpnge : !(A >= B)
5. Select : R = Select(A,B,C,D)=> if (A 비교 B) R = C else R = D
- select_eq : ==
- select_neq : !=
- select_gt : >
- select_ge : >=
- select_lt : <
- select_le : <=
- select_nlt : !(A < B)
- select_nle : !(A <= B)
- select_ngt : !(A > B)
- select_nge : !(A >= B)
6. Unpacked / Pack (예제는 Is32vec4)
R = unpack_low( A, B) => R = ( B1 , A1 , B0 , A0 )
R = unpack_high(A, B) => R = ( B3 , A3 , B2 , A2 )
R = pack_sat(A, B) => Is16vec8 R = (B3, B2, B1, B0, A3, A2, A1, A0) // 정수형만지원
7.정수 Vector <-> Array :Vector Class에서 지원하지 앟음 intrinsic 함수 이용
Is32vec4 A = _mm_load_si128((__m128i*) p) // 배열 Pointer를 __m128i* 로 casting 후 저장 (정렬된 메모리)
s32vec4 A = _mm_loadu_si128((__m128i*) p) // 정렬되지 않은 메모리에서 데이터 읽어오기
_mm_store_si128((_m128i*) p , A) // A에 저장된 값들을 배열 p에순서대로 저장 (정렬된 메모리)
_mm_storeu_si128((_m128i*) p , A) // 정렬되지 않은 메모리에 데이터 쓰기
8. 실수 Vector <-> Array
loadu (F32vec4 R, float* a) // a[0] ~ a[3] 4개의 float 값을읽어서 R에 저장
storeu(float* a, F32vec4 R) // R의 값을 a[0] ~ a[3]에저장
store_nta(float* a, F32vec$ R) // 버퍼 없이 메모리 a[0] ~ a[3]에저장
9.수학 함수 (실수 연산만 가능)
R = sqrt(A) // 제곱근 Root
R = rcp(A) // 역분수 : R = 1 / A
R = rsqrt(A) // 제곱근 역분수 : R = 1 / Root A
R = rcp_nr(A) // Newton-Raphson법의 역분수 : R = rcp(A) * 2 –A * rcp(A) * rcp(A)
R = rsqrt_nr(A) // Newton-Raphson법의 제곤근 역분수 : R = rsqrt(A)/ 2 * ( 3 – A * rsqrt(A) * rsqrt(A) )
F = add_horizontal(A) // float F = A0 + A1 + A2 + A3
이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)