我有一个布尔表达式,我已设法在SSE2中实现.现在我想尝试在AVX中实现它,在并行性增加中利用额外的因子2(从128位SIMD类型到256).但是,AVX不支持整数操作(AVX2可以使用,但我正在使用Sandy Bridge处理器,因此它目前不是一个选项).但是,由于存在用于按位运算的AVX内在函数.我想我可以尝试将我的整数类型转换为浮点类型并查看它是否有效.
第一次测试是成功的:
__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.模拟AND'ing两个而不是我得到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 OR 4给出的值为22而不是15应该是.我不明白为什么会这样.这是一个我错过的bug还是一些配置?
我实际上期待我使用float的假设,好像它们是整数不起作用,因为初始化为浮点值的整数可能实际上不是精确值而是近似值.但即便如此,我对我得到的结果感到惊讶.
有没有人有这个问题的解决方案或者我必须升级我的CPU才能获得AVX2支持吗?