2021. 10. 12. 12:42 자기개발/SIMD
SIMD - Insert, Extrat, Mask 생성 함수
128bit 데이터형 안에 있는 pack의 값 한개를 넣고 뺄 때 사용한다. insert는 pack 한 개으 ㅣ값을 넣을 때, extract는 뺄 때 사용한다.
Insert 함수
__m128i a : a7 a6 a5 a4 a3 a2 a1 a0
__m128i r = _mm_insert_epi16(__m128i a, int b, int imm)
imm = 3
__m128i r : a7 a6 a5 a4 b a2 a1 a0
16bit short 형 정수 8개를 담고있는 __m128i형 데이터에 입력받은 integer 형 정숫값 b를 입력한다. 입력하고자하는 pack의 위치는 상수 imm 값으로 지정한다.
Extract 함수
__m128i a : a7 a6 a5 a4 a3 a2 a1 a0
int r = _mm_insert_epi16(__m128i a, int imm)
imm = 6
int r = a6
16bit short형 정수 8개를 담고있는 __m128i형 데이터에 있는 값을 꺼내온다. 꺼내오고자 하는 pack의 위치는 상수 imm 값으로 지정한다.
Mask 생성 함수
8bit 정수형 pack을 가진 package에서 최상위 비트 한 개씩을 가져와서 리턴한다.
iont mask = _mm_moveask(_m128i a);
#include <iostream>
#include <afx.h>
using namespace std;
#include <emmintrin.h>
int main(int argc, char* argv[])
{
__declspec(align(16)) short A[8] = { 1, 2, 3, 4, 5, 6, 7, 8};
__declspec(align(16)) short R[8] = { 0 };
__m128i xmmA = _mm_load_si128((__m128i*)A);
__m128i xmmR = _mm_insert_epi16(xmmA,10, 3); //insert 함수
_mm_store_si128((__m128i*)R, xmmR); //결과 출력
cout << "Insert Result : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;
int r = _mm_extract_epi16(xmmA, 6); //extract 함수
cout << "Extract Result : " << r << endl; //결과 출력
__declspec(align(16)) char B[16] = { 0xff, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
__m128i xmmB = _mm_load_si128((__m128i*)B);
int mask = _mm_movemask_epi8(xmmB); //mask 함수
cout << "Mask = " << mask << endl; //결과 출력
return 0;
}
실행 결과

'자기개발 > SIMD' 카테고리의 다른 글
| SIMD - Unpack, Pack 함수 (0) | 2021.10.12 |
|---|---|
| SIMD - 비교 연산 (0) | 2021.10.12 |
| SIMD - Shift 연산, intrinsic 나눗셈 구현 (0) | 2021.10.12 |
| SIMD - Intrinsics 세트 함수(값 입력 함수) (0) | 2021.10.08 |
| SIMD - Intrinsics 정수의 산술 연산 (0) | 2021.10.08 |