2

我正在 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。

为什么?

4

1 回答 1

4

_mm256_testz_si256( VPTEST) 对源向量中的所有位进行操作,_mm256_testz_pd( VTESTPD) 仅对每个双精度元素的符号位进行操作。在您的测试中,两个向量中的所有符号位都为零,因此您得到了正确的结果。

于 2013-05-21T21:39:09.547 回答