将结构对齐到SSE寄存器

时间:2014-09-14 14:04:16

标签: c++ sse

我有一个结构数据结构如下:

         struct{
                  int value;
                  int pos;
               }S[10];

如何将此结构与SSE寄存器对齐,使连续寄存器位置仅具有S [i] .value而不是S [i] .pos。

谢谢

1 个答案:

答案 0 :(得分:3)

对于当前的编译器,没有办法让它重新组织你的数据,使得数组中的连续元素的顺序与你在struct中声明的顺序不同。

编辑:

请注意,要重新排列struct的布局,需要编译器确切地知道struct是如何定义并立即在任何地方使用的,并且通常编译器甚至不会尝试这样做。有可能生成以这样的方式加载数据的代码,即可以在SSE寄存器中完成计算。

结束编辑。

换句话说

struct{
    int value;
    int pos;
}S[10];

总是以valueposvaluepos等交替模式结束。

如果您想要valuevalue ...后跟pospos,...的连续值,那么您需要编写结构声明不同的,例如

struct 
{
    int value[10];
    int pos[10];
} S;

当然,这也意味着您必须修改从Ss[x].pos等访问s.pos[x]的任何代码。

如果您还想确保SSE指令实际上可以毫无困难地加载valuepos,则需要使用alignment属性/声明规范,以便每个value pos struct { int value[10] __attribute__((aligned(16))); int pos[10] __attribute__((aligned(16))); } S; struct { __declspec(align(16)) int value[10]; __declspec(align(16)) int pos[10]; } S; 1}}和{{1}}对齐到16字节边界。

所以,在gcc中:

{{1}}

在MS兼容编译器中:

{{1}}

编辑:

另请注意,如果您想使用SSE指令,那么数字10在这里并不是特别好,因为您有两个不适合SSE寄存器的元素。

结束编辑。