c++ - 有没有办法在 AVX 上模拟 _m256 类型的整数按位运算?

标签 c++ c integer sse avx

我有一个 bool 表达式,我设法在 SSE2 中实现了它。现在我想尝试在 AVX 中实现它,利用并行度增加的额外因素 2(从 128 位 SIMD 类型到 256)。但是,AVX 不支持整数运算(AVX2 支持,但我正在使用 Sandy Bridge 处理器,因此目前不支持)。但是,因为有 AVX intrinsics for bitwise operations .我想我可以通过将我的整数类型转换为浮点类型来尝试一下,看看它是否有效。

第一次测试成功:

__m256 ones = _mm256_set_ps(1,1,1,1,1,1,1,1);
__m256 twos = _mm256_set_ps(2,2,2,2,2,2,2,2); 
__m256 result = _mm256_and_ps(ones, twos);

我正在按照我应该的方式对所有 0 进行 guetting。 Simularly AND'ing the twos 而不是我得到的结果是 2。但是当相应地尝试 11 XOR 4 时:

__m256 elevens = _mm256_set_ps(11,11,11,11,11,11,11,11); 
__m256 fours = _mm256_set_ps(4,4,4,4,4,4,4,4); 
__m256 result2 = _mm256_xor_ps(elevens, fours); 

结果是 6.46e-46(即接近 0)而不是 15。同时执行 11 或 4 得到的值是 22,而不是应有的 15。我不明白这是为什么。是错误还是我缺少某些配置?

我实际上期望我的假设将 float 当作整数来工作,因为初始化为 float 值的整数实际上可能不是精确值,而是一个近似值。但即便如此,我对我得到的结果感到惊讶。

有没有人能解决这个问题,或者我必须升级我的 CPU 才能获得 AVX2 支持才能启用此功能?

最佳答案

第一个测试是偶然成功的。

1 作为 float 是 0x3f800000,2 是 0x40000000。一般来说,它不会那样工作。

但您绝对可以做到,您只需确保使用正确的位模式即可。不要将整数转换为 float - 重新解释 - 转换它们。这对应于 _mm256_castsi256_ps 等内在函数,或者将您的整数存储到内存中并将它们作为 float 读取(这不会改变它们,通常只有数学运算才关心 float 的意思,其余的使用原始位模式,检查指令可以确定的异常列表)。

关于c++ - 有没有办法在 AVX 上模拟 _m256 类型的整数按位运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20527774/

相关文章:

c++ - 如何更改 C/C++ 中默认的 *.exe 图标?

c++ - 如何从 udp 套接字 (C/C++) 获取您自己的(本地)IP 地址

C 错误取消引用指向不完整类型的指针

c - 链表队列。坚持指针(我认为)

ruby - 如何遍历整数的数字?

algorithm - 是否有仅返回正值的线性同余生成器算法?

c# - 对于 Int32 错误,值太大或太小

C++ 虚函数表现怪异

php - 如何找到调用非静态方法的地方?

c - CodeBlocks 中的 Free 函数非常慢