2013-08-30 2 views
2

일부 int 값 ([position % 2 = 0]의 값은 음수이고 [position % 2 = 1]의 값은 양수입니다)이 포함 된 배열이 있습니다.C++ SSE는 레지스터 값을 반전합니다.

I는 레지스터 어레이로부터 4 단계에서 이러한 값을로드 할하지만 그 반전

__m128i v1; 
for (int k = 0; k < limit; k += 4) { 
     v1 = _mm_load_si128((__m128i *) & myArray[position + k]); 
} 

SSE 코드 위

레지스터에 값을로드 (마이너스 반대로 긍정적 변환) 할 있는 그대로 : v1을 가져 와서 반대의 명령이 있습니까? 원 스텝/커맨드로 처리 할 수 ​​있습니까? 원래 배열에서 직접 반전 된 값을로드 할 수 있습니까?

도움이 될 것입니다. 미리 감사드립니다.

+1

... 성능이 문제가되는 경우 나 프로파일 링을 권하고 싶습니다, 모두 1을 설정합니다 -1이 1이고 2가 -2이면 "부정"이라고합니다. 반전은 비트 단위가 아니므로 값의 모든 비트를 반전하므로 -1이 0이됩니다 –

답변

4

정수 요소가 32 비트라고 가정하면 0부터 빼기 만하면됩니다.

v1 = _mm_load_si128(...);     // load data 
v1 = _mm_sub_epi32(_mm_set1_epi32(0), v1); // negate all elements 
+1

고마워요. 나는 당신의 대답을지지하고 받아 들였다. – Alexandros

2

또 다른 방법은 다음과 같습니다 우리가이 일을

Bascially
__m128i v1 = _mm_xor_si128(
    _mm_load_si128((__m128i *)&myArray[position + k]), 
    _mm_cmpeq_epi8(v1, v1) 
); 

: 우리가 보완 -1 모든 것들의 순서는 조로와 기계를 사용하는 가정 x^-1을 ...

다음을 참고하십시오. 여기서 ~은 반전을 의미하고 ^은 독점적 인 또는을 의미합니다. 이 메모리 액세스를 생성 할 수 있기 때문에 당신이 실제로 속도가 느려질 수 있습니다 _mm_set1_epi32(-1)를 사용할 수있는 동안

~0 == 1 == (0^1) 
~1 == 0 == (1^1) 

_mm_cmpeq_epi8(a, a) 당신이 원하는 경우

관련 문제