¿Buen punto heurístico en el que enviar FFT a GPU es computacionalmente valioso?

7

Esta es una pregunta bastante simple, pero no he encontrado mucho publicado en los últimos 5 años más o menos con respecto a una buena regla general para calcular una FFT en la GPU frente a la CPU. Sé que la mayor parte de la sobrecarga de las FFT calculadas por GPU es que primero tiene que escribir los datos en un búfer y luego transmitirlos a la GPU, desde la CPU, para calcular la transformación.

Esto implica naturalmente que el cálculo de GPU de la FFT es más adecuado para cálculos de FFT más grandes donde el número de escrituras en la GPU es relativamente pequeño en comparación con el número de cálculos realizados por la GPU. Pero el problema se convierte en saber en qué punto el FFT funciona mejor en la CPU frente a la GPU. Lo mejor que he encontrado es "cuando estás calculando FFT más grandes", pero eso es un poco relativista para ser una guía particularmente significativa para los profesionales, especialmente teniendo en cuenta que la tecnología de GPU se ha acelerado tan rápidamente en los últimos años.

Solo estoy buscando una estimación más concreta de en qué momento se vuelve eficiente calcular la transformación en la GPU frente a la CPU (¿tal vez hay un punto de referencia en algún lugar?). Gracias de antemano por cualquier ayuda que pueda proporcionar.

Quemar
fuente

Respuestas:

10

¡Me temo que nunca habrá una regla de oro!

Las razones son múltiples, principalmente, porque tanto los sistemas que está considerando como los problemas que está tratando de resolver varían en un rango muy amplio.

Aspectos basados ​​en problemas

Dices que quieres hacer una FFT, ¡pero eso siempre es solo la mitad de lo que realmente quieres hacer!

¿Necesita convertir el FFT a su abs², luego asignarlo a colores y luego mostrarlo en una pantalla? Hazlo en la GPU, está justo donde pertenece; fosphor hace eso, a 200MS / s fáciles en combinaciones de PC / GPU con capacidad:

fósforo

En ese caso, el tamaño de la FFT ni siquiera importa. Sus datos serán procesados ​​más adelante por la GPU, así que haga la FFT allí.

Por otro lado, es posible que desee hacer algo que depende de muchas comprobaciones de elementos individuales en la FFT, en la CPU. ¿Posiblemente solo una FFT y luego no muchas más?

En ese caso, su rendimiento teórico no lo ayuda en absoluto. Solo esperando que los datos salgan de la memoria caché de la CPU y vuelvan a la memoria coherente, para que se puedan enviar DMA a la GPU, donde luego se inicia una FFT (posiblemente desperdiciando un interruptor de interrupción / contexto en el camino), solo para espere hasta que termine, la GPU DMA 'devolvió los datos a su memoria principal y los metió en la memoria caché de su CPU no pagará, incluso para FFT de tamaño mediano.

Entonces: todo este "negocio de acelerador matemático de alta latencia" realmente solo vale la pena si puedes hacer algo sensato mientras esperas. Si no puede, hay una gran penalización por latencia.

Aspectos basados ​​en el sistema

Ok, no entrando en demasiados detalles aquí, pero:

  • Los sistemas DSP tienen CPU o ancho de banda de memoria limitado
  • Si la operación de su GPU ayuda con la limitación de la CPU, pero coloca una carga de movimiento de datos adicional en la interfaz de memoria, mientras que, de hecho, el resto de su sistema tiene un ancho de banda de memoria limitado, se está lastimando.
  • Lo mismo se aplica al revés: tal vez su algoritmo (el FFT en su tamaño específico de interés) está limitado por la CPU, pero la aceleración de su GPU conduce a interrupciones adicionales
  • ¿Cuál es un tamaño FFT que su CPU puede hacer muy bien? Eso probablemente se define por los tamaños de sus cachés L1 y L2. Una CPU Xeon con muchos números tendrá docenas de Megabytes de esos, mientras que un ARM que se ejecuta en un SoC Jetson NVidia no.
  • ¿Cuál es el tamaño FFT en el que su tarjeta gráfica es buena? Hay una enorme diferencia en el número de subprocesos paralelos, su flexibilidad y el ancho de banda de la memoria entre las tarjetas.
  • ¿Qué es una métrica para "bueno", en absoluto? ¿Solo una proporción extraña de rendimiento y latencia, pero tal vez también energía y dejar el tipo correcto de recursos gratis para otro trabajo?
  • ¿Cuál es su CPU <-> interfaz de memoria principal? ¿Es una interfaz DDR4 de cuatro canales que funciona a casi 2 GHz o es DDR de un solo canal?
  • ¿Cuál es su interfaz de memoria GPU <-> GPU?
  • ¿Cuál es su interfaz de memoria principal GPU <->?
  • ¿Qué tan bien funciona su comunicación CPU <-> GPU para su caso de uso específico?
  • ¿Hay una carga alta en, por ejemplo, el bus PCIe, por ejemplo, porque el mismo conmutador PCIe tiene que manejar los datos que entran y salen de su sistema de alta velocidad (por ejemplo, almacenamiento, pero más probablemente, datos de 10 Gigabit ethernet o video) ?

Entonces, la respuesta probablemente no será satisfactoria, pero realmente es:

En algún lugar por encima de 64 contenedores, en algún lugar por debajo de 2 20 contenedores, para una FFT de precisión simple. Depende.

Marcus Müller
fuente