Soy bastante nuevo para ensamblar y aunque el centro de información de brazo a menudo es útil, a veces las instrucciones pueden ser un poco confusas para un novato. Básicamente, lo que tengo que hacer es sumar 4 valores de flotación en un registro de cuatro palabras y almacenar el resultado en un solo registro de precisión. Creo que la instrucción VPADD puede hacer lo que necesito, pero no estoy muy seguro.Suma todos los elementos en un vector de cuatro palabras en el ensamblaje ARM con NEON
Respuesta
Parece que desea obtener la suma de una determinada longitud de matriz, y no solo cuatro valores de flotación.
En ese caso, su código funcionará, pero está lejos de ser optimizados:
muchos muchos bloqueos de tuberías
además de 32 bits innecesarios por iteración
suponiendo que la longitud de la matriz es un múltiplo de 8 y al menos 16:
vldmia {q0-q1}, [pSrc]!
sub count, count, #8
loop:
pld [pSrc, #32]
vldmia {q3-q4}, [pSrc]!
subs count, count, #8
vadd.f32 q0, q0, q3
vadd.f32 q1, q1, q4
bgt loop
vadd.f32 q0, q0, q1
vpadd.f32 d0, d0, d1
vadd.f32 s0, s0, s1
- pld, aunque es una instrucción ARM y no NEON, es crucial para el rendimiento. Aumenta drásticamente la tasa de aciertos de la memoria caché.
Espero que el resto del código anterior se explique por sí mismo.
Notarás que esta versión es mucho más rápida que la inicial.
puede probar con esto (que no está en ASM, pero debe ser capaz de convertir fácilmente):
float32x2_t r = vadd_f32(vget_high_f32(m_type), vget_low_f32(m_type));
return vget_lane_f32(vpadd_f32(r, r), 0);
En ASM sería probablemente sólo VADD y VPADD.
no estoy seguro si esto es sólo un método para hacer esto (y más óptimo), pero no se han dado cuenta/encontrado uno mejor ...
PS. Soy nuevo al neón demasiado
Aquí está el código en ASM:
vpadd.f32 d1,d6,d7 @ q3 is register that needs all of its contents summed
vadd.f32 s1,s2,s3 @ now we add the contents of d1 together (the sum)
vadd.f32 s0,s0,s1 @ sum += s1;
puedo haber olvidado mencionar que en el código C se vería así:
float sum = 1.0f;
sum += number1 * number2;
tengo omitió la multiplicación de esta pequeña pieza como código.
- 1. ¿ARM y NEON pueden trabajar en paralelo?
- 2. ¿Cómo reordeno los datos vectoriales utilizando los intrínsecos de ARM Neon?
- 3. Mezcla de ensamblaje NEON con funciones no vectoriales
- 4. ARM NEON: comparando valores de 128 bit
- 5. ¿Cómo enmascarar los bytes en el ensamblaje de ARM?
- 6. ¿Existe una buena referencia para los intrínsecos de ARM Neon?
- 7. SSE _mm_movemask_epi8 método equivalente para ARM NEON
- 8. usando STL para encontrar todos los elementos de un vector
- 9. Rotación de 128 bits utilizando intrínsecos de ARM Neon
- 10. suma de cuadrados de cada uno de los elementos en el vector usando for_each
- 11. sizeof plantilla variadic (suma de sizeof de todos los elementos)
- 12. ARM NEON: ¿Cuál es la diferencia entre vld4_f32 y vld4q_f32?
- 13. Convención de llamada ARM a C, registros NEON para guardar
- 14. Suma de todos los números
- 15. ARM Cortex-A8: Cómo hacer uso de NEON y vfpv3
- 16. ¿Cómo multiplico todos los elementos en una colección con todos los elementos en otra colección?
- 17. Obtener todos los elementos de opciones seleccionados de todos los elementos seleccionados en un formulario
- 18. Ordenando todos los elementos en un XDocument
- 19. múltiples elementos en un vector
- 20. ¿Cómo agregar todos los elementos de una matriz String a un vector en Java?
- 21. ¿Cómo inicializar const float32x4x4_t (ARM NEON intrinsic, GCC)?
- 22. Construcción predeterminada de elementos en un vector
- 23. ¿Cómo imprimo los elementos de un vector C++ en GDB?
- 24. ¿Cómo trazo líneas entre todos los puntos en un vector?
- 25. Matlab: cómo reemplazar todos los caracteres especiales en un vector?
- 26. ¿Cómo eliminarías los elementos de un std :: vector en función de alguna propiedad de los elementos?
- 27. ¿Cómo crear un vector binario con 1 si los elementos son parte del mismo vector?
- 28. Obtener todos los elementos de un ArrayAdapter
- 29. Suma de elementos en una colección
- 30. Cambiar el estilo de todos los elementos con un clic en el evento
Gracias logré que esto funcionara usando un VPADD y dos VADD. Esperaba tener que usar solo 1 o 2 instrucciones, pero creo que 3 solo tendrá que hacer. –
¿Podría mostrar su ASM? Creo que requerirá solo un VADD y un VPADD (al menos que se ve desde el código C) – kibab