LINUX.ORG.RU

SSE, segfault


0

0

Изучаю SSE, пишу код:

#include <xmmintrin.h>

int main()
{
    float *temp = malloc(128);
    for (;;)
    {
        __m128 summand1 = _mm_set_ps1(1.0);
        __m128 summand2 = _mm_set_ps1(2.0);
        __m128 result   = _mm_add_ps(summand1, summand2);

        _mm_storeu_ps(temp, result);
    }
    free(temp);
}
Компилирую:
gcc -O3 -march=pentium4 -mfpmath=sse -funroll-loops -fomit-frame-pointer -std=c99 -o segfault segfault.c
При запуске получаю SEGFAULT. А если внести malloc в цикл:
#include <xmmintrin.h>

int main()
{
    for (;;)
    {
        float *temp = malloc(128);
        __m128 summand1 = _mm_set_ps1(1.0);
        __m128 summand2 = _mm_set_ps1(2.0);
        __m128 result   = _mm_add_ps(summand1, summand2);

        _mm_storeu_ps(temp, result);
        free(temp);
    }    
}
То всё прекрасно работает, но дёргать столько раз malloc по-моему очень нехорошо. Что делать?

Наверное так:

#include <xmmintrin.h>

int main()
{
    float temp;
    for (;;)
    {
        __m128 summand1 = _mm_set_ps1(1.0);
        __m128 summand2 = _mm_set_ps1(2.0);
        __m128 result   = _mm_add_ps(summand1, summand2);

        _mm_storeu_ps(&temp, result);
    }
}

DrLivsy
()
Ответ на: комментарий от themylogin

Тогда так:

#include <xmmintrin.h>

int main()
{
    float temp[4];
    for (;;)
    {
        __m128 summand1 = _mm_set_ps1(1.0);
        __m128 summand2 = _mm_set_ps1(2.0);
        __m128 result   = _mm_add_ps(summand1, summand2);

        _mm_storeu_ps(temp, result);
    }   
}

DrLivsy
()
Ответ на: комментарий от themylogin

У меня работает, с теми же флагами компиляции.

$ gcc --version
gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
Copyright (C) 2007 Free Software Foundation, Inc.

DrLivsy
()
Ответ на: комментарий от mv

        .file   "segfault.c"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ecx
        subl    $8, %esp
        movl    $128, (%esp)
        call    malloc
        movaps  .LC1, %xmm0
        addps   .LC0, %xmm0
        movups  %xmm0, %xmm0
.L2:
        movaps  %xmm0, (%eax)
        jmp     .L2
        .size   main, .-main
        .section        .rodata.cst16,"aM",@progbits,16
        .align 16
.LC0:
        .long   1065353216
        .long   1065353216
        .long   1065353216
        .long   1065353216
        .align 16
.LC1:
        .long   1073741824
        .long   1073741824
        .long   1073741824
        .long   1073741824
        .ident  "GCC: (GNU) 4.3.3"
        .section        .note.GNU-stack,"",@progbits

themylogin
() автор топика
Ответ на: комментарий от themylogin

Дописал перед float
__attribute__((aligned(16)))
и теперь всё отлично работает

themylogin
() автор топика
Ответ на: комментарий от themylogin

> gcc-то почему себя по-другому ведёт :-(

Явный баг. В 4.4.0 поправили, генерит или movhps, или movups.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.