gpt4 book ai didi

visual-c++ - 跨编译器访问 __m128 字段

转载 作者:行者123 更新时间:2023-12-04 08:28:31 25 4
gpt4 key购买 nike

我注意到访问 __m128gcc 中可以按索引字段,不使用 union诡计。

__m128 t;

float r(t[0] + t[1] + t[2] + t[3]);

我也可以加载 __m128就像一个数组:
__m128 t{1.f, 2.f, 3.f, 4.f};

这都符合 gcc的向量扩展。但是,这些可能在其他地方无法获得。 intel 编译器和 msvc 是否支持加载和访问功能?

最佳答案

如果你想让你的代码在其他编译器上工作,那么不要使用那些 GCC 扩展。使用设置/加载/存储内部函数。 _mm_setr_ps适用于设置常量值,但不应在循环中使用。要访问元素,我通常首先将值存储到数组中,然后读取数组。

如果你有一个数组 a你应该阅读/存储它

__m128 t = _mm_loadu_ps(a);
_mm_storeu_ps(a, t);

如果数组是 16 字节对齐的,您可以使用对齐的加载/存储,这在较新的系统上稍快,但在旧系统上要快得多。
__m128 t = _mm_load_ps(a);
_mm_store_ps(a, t);

要在堆栈上获得 16 字节对齐的内存,请使用
__declspec(align(16)) const float a[] = ...//MSVC
__attribute__((aligned(16))) const float a[] ...//GCC, ICC

对于 16 字节对齐 dynamic arrays use :
float *a = (float*)_mm_malloc(sizeof(float)*n, 16); //MSVC, GCC, ICC, MinGW 

关于visual-c++ - 跨编译器访问 __m128 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19582893/

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