首页 > 解决方案 > 什么是__m128d?

问题描述

我真的无法得到__m128dC++ 中的“关键字”。

我正在使用 MSVC,说:The __m128d data type, for use with the Streaming SIMD Extensions 2 instructions intrinsics, is defined in <emmintrin.h>.

那么,它是一种数据类型吗?typedef? 如果我做:

#include <emmintrin.h>

int main() {
    __m128d x;
}

我在 上看不到定义<emmintrin.h>。这似乎是一个keyword编译器?它会自动将该关键字转换为“移动寄存器 xmm0”等内容吗?或者什么样的操作呢?

它似乎根本不是一种数据类型。

有人可以照亮我吗?

标签: c++intelintrinsicssse2

解决方案


它是类型定义吗?

是的!

__m128d是一种数据类型,编译器希望在优化时将其存储在 XMM 128 位寄存器中(如果没有像@PeterCordes 评论的那样优化它)。int它与or没有本质上的不同long,编译器希望在优化时将其存储在整数寄存器中。

实际定义是特定于编译器的;打算在 MSVC 和实现英特尔内部函数的其他主要编译器之间移植的代码应避免取决于定义的细节。

MSVC 将向量类型定义为不同元素大小的数组的联合。

在实现 GNU C 扩展(gcc 和 clang)的编译器中,它被定义为doubles 的 16 字节 GNU C 本机向量:

// From gcc 7.3's emmintrin.h  (SSE2 extensions).  SSE1 stuff in xmmintrin.h

/* The Intel API is flexible enough that we must allow aliasing with other
   vector types, and their scalar components.  */
typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));

in <emmintrin.h>,正如@Default 评论的那样。

may_alias属性告诉编译器__m128d*可以以相同的方式对其他类型进行别名char*,以便基于 C++ 严格别名规则进行优化。


使用示例:(初始化可在 MSVC 和其他编译器之间移植)

__m128d a2 = { -1.388539L, 0.0L };


对于__m128,检查英特尔论坛<xmmintrin.h>


推荐阅读