我有一个结构数据结构如下:
struct{
int value;
int pos;
}S[10];
如何将此结构与SSE寄存器对齐,使连续寄存器位置仅具有S [i] .value而不是S [i] .pos。
谢谢
答案 0 :(得分:3)
对于当前的编译器,没有办法让它重新组织你的数据,使得数组中的连续元素的顺序与你在struct
中声明的顺序不同。
编辑:
请注意,要重新排列struct
的布局,需要编译器确切地知道struct
是如何定义并立即在任何地方使用的,并且通常编译器甚至不会尝试这样做。有可能生成以这样的方式加载数据的代码,即可以在SSE寄存器中完成计算。
结束编辑。
换句话说
struct{
int value;
int pos;
}S[10];
总是以value
,pos
,value
,pos
等交替模式结束。
如果您想要value
,value
...后跟pos
,pos
,...的连续值,那么您需要编写结构声明不同的,例如
struct
{
int value[10];
int pos[10];
} S;
当然,这也意味着您必须修改从S
到s[x].pos
等访问s.pos[x]
的任何代码。
如果您还想确保SSE指令实际上可以毫无困难地加载value
和pos
,则需要使用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寄存器的元素。
结束编辑。