目前我正在通过联合访问我的浮点值
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)) 并覆盖新和删除运算符(如果您正在编码 C++)。检查这个问题:SSE、内在函数和对齐