目前我通过联盟
访问我的浮点值typedef union
{
float v[4];
_mm128 m;
}SSEFloat;
但在此link我听说表演是失败的。 GCC 4是否存在性能损失? 浮动是否需要对齐?在联盟呢?或者像这样设置值
是否正确SSEFloat a;
float tmp = 10.0;
a.m = _mm_load1_ps( &tmp );
此刻我无法找到英特尔SSE内在文档:( 是否有一个“小”列表 - 速度优化应该知道什么?
答案 0 :(得分:1)
编译器将保证代码将正确执行,但它可能会牺牲性能以确保正确性。由于联合实际上只是为访问4项浮点向量的各个元素添加语法方便,并且_mm128对象(概念上,如果不是实际)坐在寄存器中,我建议你直接使用_mm128对象并使用用于将数据移入和移出对象的_mm_store_ps和_mm_load_ps系列API。
您提供的链接中的注释表明编译器可以对联合进行不良优化,尤其是对于_mm128s。如果你想确定这一点,你应该做有和没有联合的实验。对于Linux中的高分辨率时间测量,我建议使用pthread_getcpuclockid和clock_gettime API。如果可以,请发布您的结果!
通常,为了获得最佳性能,请尽可能简化编程。这意味着将像_mm128这样的高性能事物保存在像联合这样的复杂结构中,而只是在堆栈上或在为它们明确分配的内存中声明它们。
答案 1 :(得分:0)
如果在联合中使用浮点数,编译器可能会输出非sse代码来访问它们,这将是性能损失。这实际上取决于您的对象用法。您可以在包装器结构前添加_MM_ALIGN16(__ declspec(align(16))并覆盖new和delete运算符(如果您正在编写C ++)。请检查此问题:SSE, intrinsics, and alignment