SSE文档和访问

SSE Documentation and accessing

本文关键字:访问 文档 SSE      更新时间:2023-10-16

此刻我正在通过Union访问我的float值

typedef union
{
  float v[4];
  _mm128 m;
}SSEFloat;

但是在这个链接中我听说性能是损失的。GCC 4是否有性能损失?浮动需要对齐吗?也在欧盟吗?或者像这样设置值是正确的吗

SSEFloat a;
float tmp = 10.0;
a.m = _mm_load1_ps( &tmp );

目前我找不到英特尔SSE固有文档太:(对于速度优化,是否有一个"小"列表?

编译器将保证代码将正确执行,但它可能为了正确性而牺牲性能。由于联合实际上只是为访问4项浮点向量的各个元素增加了语法上的便利,并且_mm128对象(概念上,如果不是实际的话)位于寄存器中,因此我建议您直接使用_mm128对象,并使用_mm_store_ps和_mm_load_ps系列api将数据移入和移出对象。

您提供的链接中的

注释表明编译器对联合的优化很差,特别是对_mm128s。如果你想确定这一点,你应该做有和没有联合的实验。对于Linux中的高分辨率时间测量,我推荐使用pthread_getcpuclockid和clock_gettime api。如果可以的话,把你的结果贴出来!

一般来说,为了获得最佳性能,应该让编译器尽可能地容易和简单。这意味着把高性能的东西,如_mm128,从复杂的结构(如联合)中移除,而只是在堆栈上声明它们,或者在专门为它们分配的内存中声明它们。

如果您在联合中使用浮点数,编译器可能会输出非sse代码来访问它们,这将对性能造成影响。这取决于对象的使用。您可以在包装器结构体前面添加_MM_ALIGN16 (__declspec(align(16))并覆盖new和delete操作符(如果您正在编写c++)。检查这个问题:SSE, intrinsic, and alignment