AVX支持浮點數據類型__m256和__m256d等按位邏輯操作。avx浮點按位邏輯運算的原因是什麼?
但是,C++不允許對浮點數和雙精度進行按位運算。如果我是對的,浮點數的內部表示不能保證,編譯器是否會使用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;
}
假設IEEE754時,爲-1表示是爲0xffffffff,我希望可以將輸出爲
1,0,0,4,0,6,0,0
,而它的替代
1 0 0 1.17549e-38 0 1.17549e-38 0 0
因此,我對內部表示的假設可能是錯誤的(或者我做了一些愚蠢的錯誤)。
所以問題是:有沒有一種方法可以使用浮點邏輯,並確保結果有意義的事實是安全的?
在IEEE754中,-1不是0xffffffff,它是0xbf800000。 – genisage
@genisage,當你與例如'_mm256_cmp_ps(x,y,1)'它返回-1 = 0xffffffff而不是0xbf800000。浮點AVX按位運算符就像整數AVX運算符一樣工作,除非它們在浮點執行uni而不是整數運算。 –
可以在C++中對浮點數進行按位運算符。看到我的答案。這是一個相當不錯的假設,x86-64代碼中的所有浮點運算都將使用IEEE754。 –