Análisis de ciclos de reloj de Zedboard

0

Basado en el ejemplo en aquí , probé un ejemplo muy similar (pero en lugar de multiplicar dos matrices simplemente multiplico todos los elementos en una matriz por 2.0).

Sin embargo, al comparar los resultados de multiplicar una matriz de 32x32 por 2.0 en el ARM (después de la optimización -O3) con los resultados en el Hardware (es decir, en el lado del FPGA) noté que el primero me llevó 1425 ciclos de reloj donde el segundo Tomó 3654 ciclos de reloj. Entonces, básicamente, el FPGA es casi 3 veces más lento. ( accelaration_factor = 0.389)

Vea esto para verificar los factores de accelaración de los que estoy hablando en el ejemplo de matriz.

Ya intenté cambiar el puerto que conecta el ARM y el bloque DMA AXI a HP en lugar de ACP y los resultados son los mismos.

También estoy usando AXI DMA para transferir datos rom y al DDR y medí la transferencia MM2S (Memory-Mapped to Stream) a 1343 ciclos de reloj para transferir 4096 bytes, lo que resulta en una transferencia de 290.8 Mbytes / segundo. La transferencia S2MM a su vez tiene una velocidad de 167.2 MBytes / s porque transfirió 4096 bytes en 2336 ciclos de reloj.

Tengo varias preguntas en las que espero que puedas ayudar:

  1. ¿Por qué mi diseño de FPGA es más lento que el ARM al multiplicar una matriz por 2.0 pero no al multiplicar dos matrices?

  2. ¿Te parecen bien estas velocidades de DMA AXI? Al compararlos con el el video de Sadri parece que puedo transferirlo más rápido. ¿Qué puedo hacer para mejorar estas velocidades de transferencia?

  3. Vi en alguna parte que se espera que las transferencias de S2MM sean más lentas que las transferencias de MM2 en el Zedboard. ¿Puede decirme por qué y si esta gran diferencia tiene sentido?

  4. Medí el tiempo en mi PC para hacer una multiplicación de matriz de 32x32 por 2.0 y es de 3.84x10⁽⁻⁶⁾ segundos. Sabiendo que la misma multiplicación toma 1.42x10⁽⁻⁵⁾ y la FPGA una 3.85x10⁽⁻⁵⁾, se puede notar que la CPU es casi 4 veces más rápida que la ARM y casi 10 veces más rápida que la FPGA. Si mi objetivo era diseñar un modelo de FPGA que abarcara software, ¿por qué estoy tan lejos cuando sigo un ejemplo?

Nota: Mi frecuencia es de 100 MHz, por lo que cada ciclo de reloj es de 10 ns.

    
pregunta João Pereira

1 respuesta

1

No olvide que el procesador ARM se ejecuta a una velocidad mucho más rápida que la lógica programable. Funciona en algún lugar entre 666 MHz y 1 GHz, mientras que su lógica funciona a 100 MHz. 100MHz parece bastante lento, probablemente puede aumentar hasta 150-200MHz. Multiplicar 2 matrices requiere más operaciones, más dependencia de datos, más acceso a la memoria, etc. En ese caso, es más fácil aprovechar el paralelismo del FPGA, multiplicar por una constante simplemente no es lo suficientemente complejo. Dicho esto, deberías tener un mejor resultado.

Los 1343 ciclos para transferir 4096 bytes parecen un poco lentos, pero no están demasiado apagados si su diseño está bajo presión. Obtendría mejores tasas si usara AXI de 64 bits (supongo que usó 32 bits) y configuraría el AXI-DMA para usar una mayor longitud de ráfaga.

Lo que me preocupa de tus resultados es el 3654 que te llevó a realizar el algoritmo de multiplicación de matriz constante. Yo esperaría algo más cercano a los 1343 ciclos que tomó para la transferencia de DMA, lo que sucedería si canaliza sus operaciones correctamente. Parece que transfieres los datos de la RAM a tu IP, luego cambias la matriz y luego la transfieres de la IP a la RAM, tomando alrededor de 1024 ciclos para cada operación.

Todo debe hacerse al mismo tiempo: transfiera de RAM a IP, multiplique los datos entrantes (sin almacenarlos) y envíelos fuera del puerto S2MM. En ese caso, tomaría 1024 ciclos + latencia a través de los núcleos.

    
respondido por el Jonathan Drolet

Lea otras preguntas en las etiquetas