AVX는 부동 소수점 데이터 유형 __m256 및 __m256d 및/또는와 같은 비트 논리 연산을 허용합니다.avx 부동 소수점 논리 연산의 이유는 무엇입니까?
그러나 C++에서는 float 및 double에 대한 비트 연산을 허용하지 않습니다. 맞다면 컴파일러가 IEEE754를 사용할 지 여부와 상관없이 플로트의 내부 표현에 대한 보장이 없으므로 프로그래머는 플로트 비트가 어떻게 보이는지에 대해 확신 할 수 없습니다. -1의 표현이 0xffffffff를 그대로 대신
있는 동안 나는 출력이1,0,0,4,0,6,0,0
것으로 예상, IEEE754를 사용한다고 가정
#include <immintrin.h>
#include <iostream>
#include <limits>
#include <cassert>
int main() {
float x[8] = {1,2,3,4,5,6,7,8};
float mask[8] = {-1,0,0,-1,0,-1,0,0};
float x_masked[8];
assert(std::numeric_limits<float>::is_iec559);
__m256 x_ = _mm256_load_ps(x);
__m256 mask_ = _mm256_load_ps(mask);
__m256 x_masked_ = _mm256_and_ps(x_,mask_);
_mm256_store_ps(x_masked,x_masked_);
for(int i = 0; i < 8; i++)
std::cout << x_masked[i] << " ";
return 0;
}
:
이 예제를 고려
1 0 0 1.17549e-38 0 1.17549e-38 0 0
따라서 내부 표현에 대한 내 가정은 틀렸을 수도 있습니다. 어리석은 실수).
그래서 질문은 : 논리 부동 소수점을 사용하고 결과가 의미가 있다는 사실에 대해 안전 할 수있는 방법이 있습니까?
IEEE-414에서 -1은 0xffffffff가 아니며 0xbf800000입니다. – genisage
@ genisage와 비교하면 '_mm256_cmp_ps (x, y, 1)'-1 = 0xffffffff가 아닌 0xbf800000을 반환합니다. 부동 소수점 AVX 비트 연산자는 정수형 대신 부동 소수점 실행 uni에서 작동한다는 점을 제외하면 정수형 AVX 연산자와 동일하게 작동합니다. –
C++에서 float에 대해 비트 연산자를 사용할 수 있습니다. 내 대답을 보라. x86-64 코드의 모든 부동 소수점 연산이 IEEE754를 사용한다는 것은 꽤 좋은 가정입니다. –