代码之家  ›  专栏  ›  技术社区  ›  horseyguy

在使用SSE指令时,是什么导致了这种分段错误?

  •  2
  • horseyguy  · 技术社区  · 16 年前

    这个问题让我有点发疯。密码似乎是 segmentation faulting 毫无理由:

    #define MULT_FLOAT4(X, Y) ({ \
        asm volatile ( \
            "movups (%0), %%xmm0\n\t" \
            "mulps (%1), %%xmm0\n\t" \
            "movups %%xmm0, (%1)" \
            :: "r" (X), "r" (Y)); })
    
    int main(void)
    {
        int before;
        float a[4] = { 10, 20, 30, 40 };
        float b[4] = { 0.1, 0.1, 0.1, 0.1 };
    
        /* Segmentation faults if I uncomment this line below, otherwise works fine. Why?? */
        int after;
    
        MULT_FLOAT4(a, b);
    
        return 0;
    }
    

    请注意,只要我定义了“之前”和“之后”变量,它就会出现分段错误。如果我只吃“之前”或“之后”,那么它就可以工作了。

    我在Ubuntu Hardy(8.04)上, GCC 版本4.2.4(Ubuntu 4.2.4-1ubuntu 4)。Linux内核:2.6.24-16-generic。

    1 回复  |  直到 16 年前
        1
  •  4
  •   George Phillips    16 年前

    检查A和B的地址。我怀疑您会发现它们必须与16字节边界对齐,以避免出现segfault。添加 __ attribute __((aligned(16))) 在他们发表声明后,应该采取相应的策略。

    这是属性每边的两个下划线,并与之相连,btw。