我正在 Linux 上开发 Core i7,并使用 g++ 4.63。
我尝试了以下代码:
#include <iostream>
#include <immintrin.h>
int main() {
__m256d a = _mm256_set_pd(1,2,3,4);
__m256d z = _mm256_setzero_pd();
std::cout << _mm256_testz_pd(a,a) << std::endl;
std::cout << _mm256_testz_pd(z,z) << std::endl;
std::cout << _mm256_testz_pd(a,z) << std::endl;
}
它打印了 3 个 1。我预计其中至少有一个为 0。
我尝试使用_mm256_castpd_si256
,然后使用_mm256_testz_si256
,它会在第一行打印0。
为什么?
最佳答案
_mm256_testz_si256
(VPTEST
) 只对源向量中的所有位进行操作,而 _mm256_testz_pd
(VTESTPD
) 仅对源向量中的所有位进行操作对每个 double 元素的符号位进行操作。在您的测试中,两个向量中的所有符号位均为零,因此您得到了正确的结果。
关于x86 - _mm256_testz_pd 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679845/