2021. 10. 8. 16:24 자기개발/SIMD
SIMD - Intrinsics 정수의 산술 연산
덧셈
__m128i R = _mm_add_epi16(__m128i a, __m128i b)
뺄셈
__m128i R = _mm_sub_epi16(__m128i a, __m128i b)
곱셈
__m128i R = _mm_mullo_epi16(__m128i a, __m128i b)
나눗셈(지원 X)
최댓값(Max)
__m128i R = _mm_max_epi16(__m128i a, __m128i b)
최솟값(Min)
__m128i R = _mm_min_epi16(__m128i a, __m128i b)
평균
__m128i R = _mm_avg_epi16(__m128i a, __m128i b)
사용 예제
#include <iostream>
#include <afx.h>
using namespace std;
#include <emmintrin.h>
int main(int argc, char* argv[])
{
__declspec(align(16)) short A[8] = { 2, 4, 6, 8, 10, 8, 6, 4 };
__declspec(align(16)) short B[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
__declspec(align(16)) short R[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
__m128i xmmA = _mm_load_si128((__m128i*)A);
__m128i xmmB = _mm_load_si128((__m128i*)B);
__m128i xmmR = _mm_add_epi16(xmmA, xmmB); //덧셈 연산
_mm_store_si128((__m128i*)R, xmmR); //결과 출력
cout << "Add : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;
xmmR = _mm_sub_epi16(xmmA, xmmB); //뺄셈 연산
_mm_store_si128((__m128i*)R, xmmR); //결과 출력
cout << "Sub : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;
xmmR = _mm_mullo_epi16(xmmA, xmmB); //곱셈 연산
_mm_store_si128((__m128i*)R, xmmR); //결과 출력
cout << "Mul : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;
xmmR = _mm_max_epi16(xmmA, xmmB); //Max값 계산
_mm_store_si128((__m128i*)R, xmmR); //결과 출력
cout << "Max : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;
xmmR = _mm_min_epi16(xmmA, xmmB); //Min값 계산
_mm_store_si128((__m128i*)R, xmmR); //결과 출력
cout << "Min : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;
xmmR = _mm_avg_epu16(xmmA, xmmB); //평균 계산
_mm_store_si128((__m128i*)R, xmmR); //결과 출력
cout << "Avg : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;
return 0;
}
실행 결과
'자기개발 > SIMD' 카테고리의 다른 글
SIMD - Shift 연산, intrinsic 나눗셈 구현 (0) | 2021.10.12 |
---|---|
SIMD - Intrinsics 세트 함수(값 입력 함수) (0) | 2021.10.08 |
SIMD - Intrinsics 개요 (0) | 2021.10.08 |
SIMD - memcpy구현 (0) | 2021.10.08 |
SIMD - 최대값 구하기( C랑 비교) (0) | 2021.10.08 |