2012-09-05 28 views
5

Esto es con referencia a la pregunta: Checksum code implementation for Neon in Intrinsics¿ARM y NEON pueden trabajar en paralelo?

Apertura de las sub-preguntas que aparecen en el enlace como preguntas individuales separados. Como las preguntas múltiples no deben formularse como parte de un solo hilo.

De todos modos venir a la pregunta:

Puede ARM y NEON (hablando en términos de arquitectura ARM Cortex-A8) en realidad trabajar en paralelo? ¿Cómo puedo conseguir esto?

¿Podría alguien señalarme o compartir algunas implementaciones de muestra (pseudocódigo/algoritmos/código, no los documentos de implementación teóricos o charlas) que utiliza las interoperaciones de ARM-NEON juntas? (Las implementaciones con intrinsics o inline-asm lo harán).

+1

Respuesta corta: Sí, siempre y cuando no compartan la misma memoria. La sincronización del acceso a la memoria es muy lenta, y mover los bytes de los registros NEON a los registros ARM es muy lento. Lo que es razonablemente rápido es mover registros ARM a NEON regs – Sam

+1

Tenga en cuenta que solo es el nivel de instrucción de paralelismo –

+2

Tenga en cuenta también que la unidad NEON tiene una tubería bastante larga y controla o registra transferencias entre el vector y la unidad y las unidades enteras tienen una penalización bastante grande . – marko

Respuesta

9

La respuesta depende de la CPU ARM. El Cortex-A8, por ejemplo, utiliza un coprocesador para implementar las instrucciones NEON y VFP, que está conectado al núcleo del ARM a través de un FIFO. Cuando el decodificador de instrucciones detecta una instrucción NEON o VFP, simplemente la coloca en el fifo. El coprocesador NEON obtiene las instrucciones de la FIFO y las ejecuta. El coprocesador NEON/VFP se retrasa un poco, en el Cortext-A8 hasta 20 ciclos más o menos.

Generalmente, ese retraso no se preocupa por ese retraso, a menos que intente transferir datos desde el coprocesador NEON/VFP al núcleo principal del ARM. (No importa mucho si lo hace moviéndose de un NEON/VPF a un registro ARM, o leyendo la memoria usando instrucciones ARM que han sido recientemente escritas por las instrucciones de NEON). En ese caso, el núcleo ARM principal se detiene hasta que el núcleo NEON haya vaciado el FIFO, es decir, hasta 20 ciclos más o menos.

El núcleo ARM generalmente puede encalar instrucciones NEON/VPF más rápido que el coprocesador NEON/VPF puede ejecutarlas. Puede explotar eso para que ambos núcleos trabajen en paralelo entrelazando sus instrucciones. Por ejemplo, inserte una instrucción ARM después de cada bloque de dos o tres instrucciones NEON. O tal vez dos instrucciones ARM si también desea explotar la capacidad de doble emisión de ARM. Tendrá que usar el ensamblado en línea para hacer esto: si usa los intrínsecos, la programación exacta de las instrucciones depende del compilador, y si tiene la inteligencia necesaria para intercalarlos adecuadamente es algo que nadie sabe. Su código será algo como

<neon instruction> 
<neon instruction> 
<neon instruction> 
<arm instruction> 
<arm instruction> 
<neon instruction> 
... 

no tengo un ejemplo de código a mano, pero si eres un poco familiarizado con el montaje de ARM, el entrelazado las instrucciones no debería ser un gran desafío. Una vez que haya terminado, asegúrese de utilizar un generador de perfiles de nivel de instrucción para verificar que las cosas realmente funcionen como se esperaba. No debería ver virtualmente ningún tiempo dedicado a las instrucciones de ARM.

Recuerde que otras implementaciones de ARMv7 podrían implementar NEON completamente diferente. Parece, por ejemplo, que la Cortex A-9 ha movido a NEON más cerca del núcleo de ARM, y tiene una carga mucho menor en los movimientos de datos desde NEON/VFP hasta ARM. No sé si esto afecta la programación paralela de las instrucciones, pero definitivamente es algo de lo que hay que tener cuidado.

+1

Gracias @fgp, de hecho fue una muy buena explicación. Responde muchas de mis otras preguntas. Estaría agradecido, si alguien pudiera indicarme algunas implementaciones que explotan las características de arm-neon mediante el ensamblaje en línea. No pude encontrar mucho Google. – nguns

Cuestiones relacionadas