2012-06-03 4 views
5

MS Visual Studio에서 SSE2 명령 세트로 작업하고 있습니다. 나는 그것을 16 비트 데이터로 계산할 때 사용하고있다.효율적으로 128 비트 상수를 정의하는 방법은 무엇입니까?

SSE 레지스터에로드 된 8 개의 값이 있다고 가정합니다. 모든 항목에 상수 (예 : 42)를 추가하고 싶습니다. 다음은 내 코드를 어떻게 보이게할까요?

__m128i values; // 8 values, 16 bits each 
const __m128i my_const_42 = ???; // What should i write here? 
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values 

어떻게 상수를 정의 할 수 있습니까? 다음 두 가지 방법이 효과가 있지만 비효율적이고 다른 것은 못생긴 것입니다.

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42) - 컴파일러는 "구축"8 개 명령을 생성하는 일정
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0} - 무슨 일이 일어나고 있는지 이해하기 어려운; 42을 예 : -42

보다 편리하게 128 비트 정수를 표현할 수있는 방법이 있나요 사소한 아닌가요?

+1

두 번째 방법의 매크로를 사용하는 것이 좋습니다. – valdo

답변

8

전투의 90 %가 올바른 고유를 찾습니다. MSDN Library는 매우 체계적으로 구성되어 있으며 this page부터 시작합니다. 거기에서, 다음과 같이 드릴 다운 : 당신은 당신이 "MMX, SSE와 SSE2 내장 함수를"사용하려는 알고

  • 당신은 당신이 "스트리밍 SIMD 확장 2"를 사용하려면 알고있는 링크를 클릭 것을 클릭 당신이 부동 소수점 싶지 않기 때문에 링크
  • 다음으로 매력적인 링크는 "정수 메모리 및 초기화"입니다
  • 두 관련 링크,로드 및 설정 작업을 얻을 것이다로드 그냥 당신이 이미
  • 을 발견하는 사람을 얻는다

세트 밖으로 SSE (또는 NEON)에 상수를 만드는 방법에 대해주의해야 할 _mm_set1_epi16 (short w)

2

뭔가 팝, 황금이다. 메모리에서 데이터를로드하는 것은 명령 실행에 비해 매우 느립니다. 코드를 통해 생성 할 수있는 상수가 필요하면 더 빠른 선택입니다. 다음은 코드를 통해 생성 된 상수의 몇 가지 예입니다.

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 7); // now it has 0xFF80 (-128) 

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 15); // 0x8000 
xmmTemp = _mm_srli_epi16 (mmxTemp, 11); // 0x10 (positive 16) 
관련 문제