SMID 병렬프로그래밍
SIMD(Single Instruction Multiple Data)
SIMD란 병렬 컴퓨팅의 한 종류로, 하나의 명령어로 여러 개의 값을 동시에 계산하는 방식이다.
변수형
typedef union __declspec(intrin_type) __declspec(align(16)) __m128i { __int8 m128i_i8[16]; __int16 m128i_i16[8]; __int32 m128i_i32[4]; __int64 m128i_i64[2]; unsigned __int8 m128i_u8[16]; unsigned __int16 m128i_u16[8]; unsigned __int32 m128i_u32[4]; unsigned __int64 m128i_u64[2]; } __m128i;
사용법
__declspec(align
__declspec(align(32)) struct s1 { int a, b, c, d; // sizeof(struct s1)는 32. 16바이트가 덧붙여진다. }; __declspec(align(8)) struct s2 { int a, b, c, d; // sizeof(struct s2)는 16. };
__mm_loadu_si128
__m128i a; // 128bit aligned 자료형 __declspec(align(16)) short v1[6] = { 1, 2, 3, 4, 5, 6}; //short 단위로 채움 a = _mm_loadu_si128((__m128i *)v1);
_mm_set1_epi32
__m128i b; // 128bit aligned 자료형 b = _mm_set1_epi32((int)5); //int형 변수를 32bit 단위로 채움
_mm_cmpeq_epi16
__m128i simd1, simd2, simd3; __declspec(align(16)) short sv1[8] = { 1, 2, 3, 4, 5, 6, 7, 8}; __declspec(align(16)) short sv2[8] = { 1, 3, 5, 0, 0, 0, 7, 0}; simd1 = _mm_loadu_si128((__m128i *)sv1); simd2 = _mm_loadu_si128((__m128i *)sv2); simd3 = _mm_cmpeq_epi16(simd1, simd2);
_mm_blendv_epi8
… __m128i simd4, simdMask; simdMask = _mm_set1_epi16((short)-255); //vmask simd4 = _mm_blendv_epi8(simdMask, simd2, simd3);
_mm_storeu_si128
__m128i simdDest, simdSrc; __declspec(align(16)) short svDest[8] = { 0, }; __declspec(align(16)) short svSrc[8] = { 1, 2, -255, -255, -255, -255, 7, -255 }; simdDest = _mm_loadu_si128((__m128i *)svDest); simdSrc = _mm_loadu_si128((__m128i *)svSrc); _mm_storeu_si128(&simdDest, simdSrc);
_mm_unpacklo_epi8 :
답글삭제https://www.officedaytime.com/simd512e/simdimg/unpack.php?f=punpcklbw
SIMD :
답글삭제https://www.officedaytime.com/simd512e/