x86 - _mm256_testz_pd 不工作?

标签 x86 g++ intel simd avx

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

相关文章:

C++ unordered_map 使用自定义类类型作为键

caching - clflush 指令是否仅从 1 级缓存刷新 block ?

assembly - 如何在气体汇编代码中导出类型为 "FUNC"和 "GLOBAL"的符号?

汇编:__p___argv 的返回值

assembly - 有没有办法以编程方式获取当前系统上存在的所有 BIOS 中断列表?

c++11 - "no viable conversion"带有柠檬用于 clang 但对 g++ 有效

Linux kernel header.S源码,为什么清零BSS时需要_end+3?

c++ - 如何从 C++ 代码调用 Matlab?

c - 在 CPU 上运行 OpenCL 代码有什么好处?

pointers - 英特尔 MPX、BNDSTX、BNDLDX