2014-05-24 10 views
4

다음 코드 단편이 어떻게 작동하는지 이해하려고합니다. 이 프로그램은 SIMD 벡터 명령어 (Intel SSE)를 사용하여 4 개의 부동 소수점 (즉, 기본적으로 벡터화 된 "fabs()"함수의 절대 값을 계산합니다. 나 자신을 테스트 할 수있는 프로그램을 실행하기 때문에이 함수는 어떻게 NOT과 AND 연산을 통해 float의 절대 값을 계산합니까?

#include <iostream> 
#include "xmmintrin.h" 

template <typename T> 
struct alignas(16) sse_t 
{ 
    T data[16/sizeof(T)]; 
}; 

int main() 
{ 
    sse_t<float> x; 
    x.data[0] = -4.; 
    x.data[1] = -20.; 
    x.data[2] = 15.; 
    x.data[3] = -143.; 
    __m128 a = _mm_set_ps1(-0.0); // ??? 
    __m128 xv = _mm_load_ps(x.data); 
    xv = _mm_andnot_ps(a,xv); // <-- Computes absolute value 
    sse_t<float> result; 
    _mm_store_ps(result.data, xv); 
    std::cout << "x[0]: " << result.data[0] << std::endl; 
    std::cout << "x[1]: " << result.data[1] << std::endl; 
    std::cout << "x[2]: " << result.data[2] << std::endl; 
    std::cout << "x[3]: " << result.data[3] << std::endl; 
} 

지금, 나는 그것이 작동 알고 여기

은 조각이다. g ++ 4.8.2로 컴파일한다면, 그 결과는 다음과 같습니다

x[0]: 4 
x[1]: 20 
x[2]: 15 
x[3]: 143 

세 (관련) 질문은 나 퍼즐 :

첫째, 어떻게 비트 단위의 기능을하고 플로트에 적용하는 것도 가능하다? 만약 내가 이것을 바닐라 C++에서 시험해 본다면, 이것은 정수형에서만 작동한다는 것을 알 수 있습니다.

두 번째, 더 중요한 것은 다음과 같습니다. 어떻게 작동합니까? NOT과 AND를 취하는 것이 어떻게 당신을 도울까요? 이것을 파이썬에서 정수형으로 시도하면 예상되는 결과를 얻을 수 있습니다. 정수가 아닌 모든 숫자와 -1 (0이 아님)은 해당 숫자를 반환하지만 기호는 변경하지 않습니다. 그러면 여기서 어떻게 작동합니까?

세 번째로, NAND 연산에 사용 된 부동 소수점 값 (-0.0에서 0.0으로 변경됨)을 변경하면 프로그램에서 더 이상 절대 값을 제공하지 않는다는 것을 알았습니다. 그러나 -0.0은 어떻게 존재할 수 있으며 어떻게 그것이 도움이 될 수 있습니까?

투표 참조 :

Intel intrinsics guide

+0

이것은 SSE이고 값에는 유형이 없습니다. 사용자가 수행하는 작업에 따라 비트 패턴 해석 방법이 결정됩니다. 이것은 표지판을 그냥 긋는 것입니다. – harold

+0

내 태그 편집이 가능한지 확실하지 않습니다. 요점은 IEEE 754 부동 소수점 표현에만 문제가 있다는 것입니다. Visual C++의 사용에 의해 함축되어 있습니다. 그러나 특정 프로그래밍 * 언어의 사용도 대부분 관련성이 없습니다. 어쩌면 태그에 대한 느낌이 좋은 사람이 향상 될 수 있습니다. –

+0

@Alf Visual C++를 사용하지 않았습니다. 그렇지 않으면 왜 gcc 컴파일러를 사용해야합니까? 윈도우즈를 사용하지도 않았지만 리눅스를 사용했습니다. 그래서, 거기에서도 확실히 작동합니다. –

답변