¡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:
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.