我有一个 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/