【问题标题】:Align a struct into SSE register将结构对齐到 SSE 寄存器
【发布时间】:2014-11-08 03:42:50
【问题描述】:

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

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

如何将此结构对齐到 SSE 寄存器中,以使连续的寄存器位置只有 S[i].value 而不是 S[i].pos。

谢谢

【问题讨论】:

  • 再解释一下?也许是一张照片或什么的?
  • 我的结构有 2 个条目 - value 和 pos。我希望 __m128i reg 与此结构对齐,以便寄存器中的连续条目仅包含值而不是 pos。如果我按照约定简单地对齐,连续的条目将同时包含 value 和 pos。
  • 您必须将值和 pos 作为单独的数组。

标签: c++ sse


【解决方案1】:

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

编辑:

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

结束编辑。

换句话说

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

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

如果您想要valuevalue ...的连续值,然后是pospos、...,那么您需要以不同的方式编写结构声明,例如

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

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

如果您还想确保valuepos 确实可以通过SSE 指令毫无困难地加载,则需要使用对齐属性/声明规范,以便value 和@987654340 中的每一个@ 与 16 字节边界对齐。

所以,在 gcc 中:

struct 
{
   int value[10] __attribute__((aligned(16)));
   int pos[10] __attribute__((aligned(16)));
} S;

在 MS 兼容的编译器中:

struct 
{
    __declspec(align(16)) int value[10];
    __declspec(align(16)) int pos[10];
} S;

编辑:

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

结束编辑。

【讨论】:

  • 非常感谢。如果可能,您能否告诉是否可以对 4 字节 SSE 寄存器的所有值应用用户定义函数?
  • 您必须更好地解释一下 - 什么功能,什么是 4 字节 SSE 寄存器?
  • 我有一个宏:((val1) & val2) >> pass),这里 val1 是一个 __m128i 类型的寄存器...我需要这个宏应用到 va1 的所有四个值上跨度>
  • 那么,您想同时进行 4 和 4 班次操作吗?你检查过编译器的输出吗?我发现现代变体中的 gcc 和 clang 都将使用 SSE 指令来非常定期地解决问题(给定可以矢量化的合理代码,当然)
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多