Bom ponto heurístico Onde vale a pena enviar FFT para GPU?

7

Essa é uma pergunta bastante simples, mas não encontrei muita coisa publicada nos últimos 5 anos sobre uma boa regra para calcular uma FFT na GPU versus a CPU. Eu sei que a maior parte das despesas gerais das FFTs calculadas pela GPU é que você precisa primeiro gravar os dados em um buffer e depois transmiti-los para a GPU, a partir da CPU, para calcular a transformação.

Isso implica naturalmente que o cálculo da FFT pela GPU é mais adequado para cálculos maiores da FFT, em que o número de gravações na GPU é relativamente pequeno em comparação com o número de cálculos realizados pela GPU. Mas o problema passa a ser saber em que ponto a FFT apresenta melhor desempenho na CPU versus GPU. O melhor que eu encontrei está nas linhas de "quando você está computando FFTs maiores", mas isso é um pouco relativista, para ser uma orientação particularmente significativa para os profissionais, especialmente considerando que a tecnologia da GPU está se acelerando tão rapidamente nos últimos anos.

Estou apenas procurando uma estimativa mais concreta de em que momento se torna eficiente calcular a transformação na GPU vs CPU (talvez haja uma referência em algum lugar por aí?). Agradecemos antecipadamente por qualquer ajuda que você pode proporcionar.

Chamuscar
fonte

Respostas:

10

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:

Fósforo

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.

Marcus Müller
fonte