Что вызывает эту ошибку сегментации при использовании инструкций SSE? - PullRequest
2 голосов
/ 13 ноября 2009

Эта проблема сводит меня с ума. Код выглядит как ошибка сегментации без веской причины:

#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', это вызывает ошибки сегментации. Если у меня просто есть «до» или просто «после», то все работает нормально.

Я работаю в Ubuntu Hardy (8.04), GCC версия 4.2.4 (Ubuntu 4.2.4-1ubuntu4). Ядро Linux: 2.6.24-16-generic.

1 Ответ

4 голосов
/ 13 ноября 2009

Проверьте адреса a и b. Я подозреваю, что вы обнаружите, что они должны быть выровнены по 16-байтовой границе, чтобы избежать сегментации Добавление __ attribute __((aligned(16))) после их объявлений должно помочь.

Это два подчеркивания на каждой стороне атрибута и связаны с ним, кстати.

...