gpt4 book ai didi

c - 使用数组表示法访问 SSE vector 寄存器

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:25 24 4
gpt4 key购买 nike

当我惊奇地发现以下方法有效时,我正在摆弄 sse。我试图访问 __m128 中的各个 float 。

__m128 x = _mm_set_ps(1.0, 2.0, 3.0, 4.0);
cout << x[1] << endl;

在这里我可以像读取数组一样读取它。 x[0] 打印 4,x[1] 打印 3,这与我的预期相反,但这可能与字节顺序有关。我想知道的是这是一种标准/推荐的方式来读取甚至写入 vector 的各个组件。我在网上看到的所有示例似乎都在使用 vector 类型和数组之间的 union 。

最佳答案

不,那是不合法的,MSDN 文档明确警告不要这样做。

在 C++ 中,您可以使用 valarray。在 C 中,大多数编译器都支持 GCC 扩展 __attribute__ ((vector_size(N)))

在自 Parallel Studio 2011 以来的英特尔编译器上,MSVC 甚至更长,但 GCC 不是(尽管 GCC 和 Clang 确实支持类型双关),您可以这样写:

__m128 result = foo();
float f1 = result.m128_f32[0];

无论这是否是一般的未定义行为,您可能关心的编译器都支持它, future 的实现不太可能编译使用 m128_f32 的代码但悄悄地破坏它。您或许可以使用其他内在函数(例如 _mm_store_ss())来提取 float 。

最便携的解决方案是memcpy()

关于c - 使用数组表示法访问 SSE vector 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33194049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com