2012-04-15 2 views
2

내 프로그램을 최적화하는 내장 함수를 사용하고 있습니다. 그러나 이제 결과를 부동 소수점 값과 비교하기 위해 __m128 벡터에있는 네 개의 요소를 합산하려고합니다. 예를 들어,이 128 비트 벡터가 있다고 가정 해 봅시다. {a, b c, d}. + b + c + d와 e를 어떻게 비교할 수 있습니까? e는 float 유형입니까?_m128 벡터의 4 개 32 비트 요소 합

SSE2 또는 SSE3은이를 간단하게 수행 할 수 있습니까? 아니면 나를 도울 수있는 코드 스 니펫이 있습니까? 감사 !

+0

두 개의 HADDPS로 SSE3에서 수행 할 수 있지만 그다지 빠르지는 않습니다. 이 벡터는 어디서 오는 것입니까? 수평 적 추가를 피할 수 있도록 계산 된 값을 재조정 할 수 있습니까? – harold

+0

그럼 (a * a + b * b)와 4.0을 비교해야합니다. 이렇게하기 위해 vec = {a, b, UNUSED, UNUSED}와 같은 __m128 벡터에 a와 b를 저장했습니다. square = _mm_mul_ps (vec, vec)를 실행하여 {a², b², X, X}를 얻습니다. 이제는 ² + b²를 구할 수있는 방법을 찾고 있으므로 4.0과 비교할 수 있습니다. 그건 분명히 최적이 아니기 때문에 조언이 있으면 크게 감사하겠습니다. – Merkil

+0

SSE4는 허용 되었습니까? – harold

답변

1

내가 위로 할 수있는 최선은 이것이다 :

; assumes xmm0 = [0, B, 0, A] or similar 
mulps xmm0,xmm0 ; [0, B*B, 0, A*A] 
xorps xmm1,xmm1 
movhlps xmm1,xmm0 ; [0, 0, 0, B * B] 
addps xmm0,xmm1 ; [0, 0, 0, A * A + B * B] 

A와 B가 절대적 후 지금까지 내가 당신이 사전에 느린 셔플을 필요로 말할 수있는 낮은 쿼드 워드에있을 경우 Penryn (그리고 Penryn에서는 DPPS 솔루션을 사용할 수 있습니다).

+0

고마워. 그러나 이제는이 벡터를 어떻게 4와 비교할 것인가? {0, 0, 0, 4}를 포함하고 _mm_cmpeq_ss와 비교할 벡터를 만들어야합니까? – Merkil

+1

원한다면 이것은 부동 소수점이므로 EQ 변형과 잘 섞이지는 않습니다. 그게 뭐야? 비교를 LE 또는 NLT 변형으로 대체 할 수 있습니까? – harold

+0

음, 사실 LE도 사용할 수 있습니다. 당신의 도움을 주셔서 감사합니다 ! – Merkil

관련 문제