자기개발/SIMD

SIMD - 비교 연산

pi92 2021. 10. 12. 09:43

128bit __m128i에 들어있는 packed된 값들을 서로 비교한 겨과가 리턴되는 __m128i 값에 넣어준다.

참인경우 -1, 거짓인경우 0이 출력된다.

 

- 정수 상등 함수(==)

__m128i xmmR = _mm_cmpeq_epi16(xmmA, xmmB); 

- 정수 비교 함수(>)

__m128i xmmR = _mm_cmpgt_epi16(xmmA, xmmB); 

- 정수 비교 함수(<)

__m128i xmmR = _mm_cmplt_epi16(xmmA, xmmB); 

 

#include <iostream>
#include <afx.h>
using namespace std;
#include <emmintrin.h>

int main(int argc, char* argv[])
{

	__declspec(align(16)) short A[8] = { 1,0,1,0,1,0,1,0 };
	__declspec(align(16)) short B[8] = { 1,1,2,1,0,0,0,-1 };
	__declspec(align(16)) short R[8] = { 0 };

	__m128i xmmA = _mm_load_si128((__m128i*)A);
	__m128i xmmB = _mm_load_si128((__m128i*)B);


	__m128i xmmR = _mm_cmpeq_epi16(xmmA, xmmB);	//Equality 연산 ==
	_mm_store_si128((__m128i*)R, xmmR);			//결과 출력
	cout << "Equality : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;

	xmmR = _mm_cmpgt_epi16(xmmA, xmmB);	//Greater Than 연산 >
	_mm_store_si128((__m128i*)R, xmmR);			//결과 출력
	cout << "Greater Than : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;

	xmmR = _mm_cmplt_epi16(xmmA, xmmB);	//Less 연산 <
	_mm_store_si128((__m128i*)R, xmmR);			//결과 출력
	cout << "Less : " << R[7] << ", " << R[6] << ", " << R[5] << ", " << R[4] << ", " << R[3] << ", " << R[2] << ", " << R[1] << ", " << R[0] << endl;


	return 0;
}

실행 결과