¿Qué está causando esta falla de segmentación mientras usa instrucciones de SSE?
-
19-09-2019 - |
Pregunta
Este problema me está volviendo un poco loco. El código parece ser fallas de segmentación sin ninguna buena razón:
#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;
}
Tenga en cuenta que mientras haya definido las fallas de segmentación 'antes' y 'después'. Si solo tengo 'antes' o simplemente tengo 'después', entonces funciona bien.
Estoy en Ubuntu Hardy (8.04), GCC Versión 4.2.4 (Ubuntu 4.2.4-1ubuntu4). Linux Kernel: 2.6.24-16-Genérico.
Solución
Verifique la dirección de A y B. Sospecho que encontrará que deben estar alineados con un límite de 16 bytes para evitar un Segfault. Suplente __ attribute __((aligned(16)))
Después de sus declaraciones deberían hacer el truco.
Eso es dos subrayos en cada lado del atributo y conectado a él, por cierto.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow