c++ - 什么是__m128d?
问题描述
我真的无法得到__m128d
C++ 中的“关键字”。
我正在使用 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”等内容吗?或者什么样的操作呢?
它似乎根本不是一种数据类型。
有人可以照亮我吗?
解决方案
它是类型定义吗?
是的!
__m128d
是一种数据类型,编译器希望在优化时将其存储在 XMM 128 位寄存器中(如果没有像@PeterCordes 评论的那样优化它)。int
它与or没有本质上的不同long
,编译器希望在优化时将其存储在整数寄存器中。
实际定义是特定于编译器的;打算在 MSVC 和实现英特尔内部函数的其他主要编译器之间移植的代码应避免取决于定义的细节。
MSVC 将向量类型定义为不同元素大小的数组的联合。
在实现 GNU C 扩展(gcc 和 clang)的编译器中,它被定义为double
s 的 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>
。
推荐阅读
- php - 包括一个带有 PHP 的文件 - 避免找不到?
- opencv - 在 vs 中使用 opencv 拼接器类时出现断言(-215)错误
- xcode - 限制用于索引的 CPU 内核数量
- java - Java 屏幕渲染
- sql - 表锁不可用...在数据集(表)释放之前有什么方法可以保持(等待)程序?
- ios - 在这种情况下 audioSession.currentRoute.outputs 为空?
- regex - 如何批量进行负正则表达式匹配?
- ios - 开始/完成 iOS 测试时如何运行/终止 shell 命令?
- flutter - 通过 Flutter 查询具有基于角色的安全性的 Firestore 文档
- python - Python Discord bot 无法记录链接和图像