【问题标题】:What is causing this segmentation fault while using SSE instructions?使用 SSE 指令时导致此分段错误的原因是什么?
【发布时间】:2010-12-16 04:59:00
【问题描述】:

这个问题让我有点抓狂。代码似乎是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-1ubuntu4)。 Linux 内核:2.6.24-16-generic。

【问题讨论】:

    标签: gcc assembly segmentation-fault inline-assembly


    【解决方案1】:

    检查a和b的地址。我怀疑您会发现它们必须与 16 字节边界对齐以避免段错误。在声明之后添加__ attribute __((aligned(16))) 应该可以解决问题。

    这是属性两侧的两个下划线并连接到它,顺便说一句。

    【讨论】:

    • 嗯,我认为 movups 用于未对齐的数据 - 而 movaps 用于对齐? :)
    • 它有效!谢谢! ...尽管我仍然对为什么在使用专门针对未对齐数据的 movups 时会出现段错误感到困惑?
    • 这是试图访问 b 的 mulps。 gdb 应该能够显示哪个指令触发了段错误。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多