Mezcla de ensamblaje NEON con funciones no vectoriales

Creo que encontré la respuesta a mi pregunta. Hay una instrucción "fmacs" para VFP que puede hacer el truco que hace el cálculo escalar en registros NEON / VFP.


Soy muy nuevo en la programación NEON o ARM ...

Quiero cargar una matriz triangular superior en registros NEON e integrar (acumular) el producto externo de un vector usando precisión simple. Las ideas básicas son A + = x '* x donde A es una matriz triangular superior. Algunas de las operaciones se pueden hacer vectorizando las operaciones usando la instrucción NEON "vmla.f32" en registros cuádruples o dobles. Sin embargo, a veces solo necesito operar en un solo registro de precisión 1 a la vez, es decir, no en 2 o 4 registros de precisión simple. En el siguiente ejemplo (no funciona), estoy interesado en la línea

// A[8-14] += A[1]*x[1-7] 
"mla  s16, s16, d0[1]\n\t"

Quiero usar los registros NEON para realizar una sola operación de precisión.

Fragmento de código:

    __asm__ volatile (
    //load x into registers
    "vldmia    %0, {d0-d3}\n\t"
    // load A into registers
    "vldmia    %1, {d4-d12}\n\t"
    "vldmia    %1, {d13-d21}\n\t"
    // A[0-7] += x[0]*x[0-7]
    "vmla.f32  q2, q2, d0[0]\n\t"
    "vmla.f32  q3, q3, d0[0]\n\t"
    // A[8-14] += A[1]*x[1-7]
    "mla  s16, s16, d0[1]\n\t"
    // output
    :
    // input
    : "r"(A), "r"(x)
    // registers
    : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
    );

preguntado el 16 de mayo de 11 a las 19:05

Realmente no querrá cambiar de instrucciones NEON a VFP de esa manera. Tanto el Cortex-A8 como el Cortex-A9 utilizados en las generaciones más recientes de iPhone (sobre lo que ha publicado antes) sufren un largo contratiempo entre estas operaciones. También puede ser mejor que realice una operación vectorial para la última parte de su cálculo. -

1 Respuestas

Entonces creo que estás preguntando sobre multiplicar un vector con un escalar?

Usaría "vdup" para cargar el escalar en todos los carriles de un registro NEON y luego multiplicar.

Si puede publicar una versión C simple de lo que está tratando de hacer, podría intentar ayudar más ...

Respondido el 13 de junio de 11 a las 04:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.