2

この問題は私を少し狂わせています。コードは、正当な理由もなくセグメンテーション障害のようです。

#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;
}

'before'変数と'after'変数の両方を定義している限り、セグメンテーション違反に注意してください。「前」または「後」がある場合は、正常に機能します。

私はUbuntuHardy(8.04)、GCCバージョン4.2.4(Ubuntu 4.2.4-1ubuntu4)を使用しています。Linuxカーネル:2.6.24-16-generic。

4

1 に答える 1

4

aとbのアドレスを確認してください。セグメンテーション違反を回避するには、16バイト境界に揃える必要があることがわかると思います。宣言の後に追加する__ attribute __((aligned(16)))と、うまくいくはずです。

これは、属性の両側に2つのアンダースコアがあり、それに接続されています、ところで。

于 2009-11-13T07:31:53.643 に答える