Receio que nunca haverá uma regra de ouro!
As razões são múltiplas, principalmente, pelo fato de os sistemas que você está considerando e os problemas que você está tentando resolver variarem em uma faixa muito grande.
Aspectos baseados em problemas
Você diz que quer fazer uma FFT - mas isso é sempre apenas metade do que você realmente quer fazer!
Precisa que a FFT seja convertida em seu abs², depois mapeada para cores e exibida na tela? Faça isso na GPU, é exatamente onde ele pertence; O fosphor faz isso a 200MS / s fáceis em combinações capazes de PC / GPU:
Nesse caso, o tamanho da FFT nem importa. Seus dados serão processados posteriormente pela GPU, assim como a FFT lá.
Por outro lado, você pode querer fazer algo que depende de muitas verificações de elementos individuais na FFT, na CPU? Possivelmente apenas um FFT, e depois não muito mais?
Nesse caso, seu rendimento teórico não ajuda em nada. Apenas aguardando os dados saírem do cache da CPU, voltando à memória coerente, para que possam ser transferidos para DMA na GPU, onde você inicia uma FFT (possivelmente desperdiçando uma opção de interrupção / contexto no caminho), apenas para espere até terminar, a GPU DMA colocou os dados de volta na memória principal e você os colocou no cache da CPU não pagará, mesmo para FFTs de tamanho médio.
Então: todo esse "negócio de aceleradores matemáticos de alta latência" realmente só vale a pena se você puder fazer algo sensato enquanto espera. Se você não pode, há uma enorme penalidade de latência.
Aspectos baseados no sistema
Ok, não entrando em muitos detalhes aqui, mas:
- Os sistemas DSP são limitados por CPU ou largura de banda de memória
- Se sua operação de GPU ajuda na limitação da CPU, mas coloca uma carga adicional de movimentação de dados na interface de memória, enquanto na verdade o restante do sistema é limitado pela largura de banda da memória, você está se machucando.
- O mesmo se aplica ao contrário: talvez o seu algoritmo (a FFT no seu tamanho específico de interesse) seja limitado pela CPU, mas a aceleração da GPU leve a interrupções adicionais
- Qual é o tamanho da FFT que sua CPU pode fazer muito bem? Provavelmente, isso é definido pelo tamanho dos caches L1 e L2. Uma CPU de processamento de números Xeon terá dezenas de Megabytes, enquanto um ARM executando em um SoC da Jetson NVidia não.
- Qual é o tamanho da FFT em que sua placa de vídeo é boa? Há uma enorme diferença no número de threads paralelos, sua flexibilidade e largura de banda de memória entre cartões.
- O que é uma métrica para "bom"? Apenas uma estranha proporção de taxa de transferência e latência, mas talvez também energia e deixar o tipo certo de recursos livres para outros trabalhos?
- Qual é a interface de memória principal da CPU <->? É uma interface DDR4 de canal quádruplo, funcionando a quase 2 GHz, ou é DDR de canal único?
- Qual é a sua interface de memória GPU <-> GPU?
- Qual é a sua interface de memória principal da GPU <->?
- Quão bem a comunicação da CPU <-> GPU funciona para o seu caso de uso específico?
- Existe uma carga alta, por exemplo, no barramento PCIe, por exemplo, porque o mesmo comutador PCIe precisa lidar com os dados que entram e saem do seu sistema de alta taxa (por exemplo, armazenamento, mas mais provavelmente, dados de vídeo ou Ethernet de 10 Gigabit) ?
Portanto, a resposta provavelmente não será satisfatória, mas é realmente:
Em algum lugar acima de 64 compartimentos, em algum lugar abaixo de 2 20 compartimentos, para uma FFT de precisão única. Depende.