Por que usar o SIMD se temos GPGPU?

13

Eu pensei que esta pergunta é melhor atendida na parte CS do Stack Exchange. Agora que temos GPGPUs com idiomas como CUDA e OpenCL, as extensões SIMD multimídia (SSE / AVX / NEON) ainda servem a um propósito?

Li recentemente um artigo sobre como as instruções SSE poderiam ser usadas para acelerar as redes de classificação. Eu pensei que isso era muito legal, mas quando eu disse ao meu professor de arquitetura, ele riu e disse que a execução de código semelhante em uma GPU destruiria a versão SIMD. Não duvido disso, porque o SSE é muito simples e as GPUs são grandes aceleradores altamente complexos com muito mais paralelismo, mas isso me fez pensar: existem muitos cenários em que as extensões SIMD multimídia são mais úteis do que usar uma GPU?

Se as GPGPUs tornarem o SIMD redundante, por que a Intel aumentaria seu suporte a SIMD? O SSE era de 128 bits, agora é de 256 bits com o AVX e no próximo ano será de 512 bits. Se as GPGPUs estão melhor processando código com paralelismo de dados, por que a Intel está empurrando essas extensões SIMD? Eles podem colocar os recursos equivalentes (pesquisa e área) em um preditor maior de cache e ramificação, melhorando assim o desempenho em série.

Por que usar o SIMD em vez das GPGPUs?

jonfrazen
fonte
2
É um desafio em si alimentar a GPU com dados suficientes para mantê-la ocupada. A transferência de dados entre o host e o dispositivo é praticamente sempre o gargalo. Certas operações são mais suportadas em CPUs (por exemplo, multiplicação sem transporte; consulte PCLMULQDQ).
Juho 02/09
2
@Juho Novos dispositivos como os APUs da AMD não têm GPU e CPU no mesmo dado? Isso elimina o gargalo?
precisa saber é o seguinte
1
Quando tudo estiver dito e feito, uma instrução vetorial ainda é uma única instrução, e o custo para agendá-la e executá-la é o mesmo que qualquer outra instrução única. Só faz sentido executar trabalhos na GPU quando o benefício supera o custo. Considere também que você obtém uma unidade SIMD por núcleo, mas normalmente apenas uma GPU por chassi, e a GPU é atualmente um recurso compartilhado. Isso limita o número de trabalhos que você pode executar em uma GPU. (O número de núcleos está a aumentar o tempo todo, mas o número de GPUs não é.)
Pseudonym
A Intel não faz muito em termos de GPUs (além de Larrabee / Knights Landing :)), então acho que é natural que eles tentem pressionar o AVX. Embora o uso intenso do AVX possa ter um desempenho muito alto, agora resulta em downclock em suas CPUs mais recentes, portanto, eles podem estar atingindo limites com alguma coisa.
Nsandersen

Respostas:

16

Nada é gratuito. GPGPUs são SIMD. As instruções SIMD nas GPGPUs tendem a ser mais amplas que as instruções SIMD nas CPUs. As GPGPUs tendem a ser multithread de granulação fina (e possuem muito mais contextos de hardware que CPUs). As GPGPUs são otimizadas para streaming . Eles tendem a dedicar uma porcentagem maior de área a unidades de ponto flutuante, uma porcentagem menor de área a armazenar em cache e uma porcentagem menor de área a desempenho inteiro.

Vamos fazer uma comparação. O núcleo da Intel i7-5960x possui 8 núcleos, cada um com SIMD de 4 larguras (precisão dupla), rodando a 3 GHz (3,5 GHz turbo), um cache L3 de 20M, consome 356mm ^ 2 e 140W e custa US $ 1000. Portanto, 8 * 4 * 3 * 4 = 384 GFlops de dupla precisão. (O 4x extra é porque você pode fazer duas adições de multiplicação por fusão por faixa vetorial por ciclo.) Ele pode executar 768 GFlops de precisão única. Isso equivale a 1,08 DP GFlops / mm ^ 2 e 2,75 DP GFlops / Watt. Há também cerca de 57,5 ​​KB / mm ^ 2 de cache no chip.

A GeForce GTX Titan Black da NVidia possui 15 SMXs, cada um com SIMD de precisão dupla de 32 largos, rodando a 890MHz (980MHz turbo), 3,5M de cache L1 + L2, consome 561mm ^ 2, 250W e custa US $ 1000. Portanto, 15 * 32 * .89 * 4 = 1709 GFlops de dupla precisão. (O mesmo 4x de duas adições de multiplicação por faixa por vetor por ciclo.) Ele pode executar 5126 GFlops de precisão única. Isso equivale a 3,05 DP GFlops / mm ^ 2 e 6,8 DP GFlops / Watt. Portanto, 3x a densidade do ponto flutuante DP por unidade de área e 3x a eficiência de energia do ponto flutuante DP. E a troca? 6,4 KB / mm ^ 2 de cache no chip. Cerca de 9x menos denso que o CPU.

Portanto, a principal diferença é que a GPU escolheu um saldo de área que favorece fortemente o ponto flutuante (e especialmente o ponto flutuante de precisão única) sobre o cache. Mesmo ignorando o fato de que você precisa copiar coisas entre a CPU e a GPU para fazer E / S, o desempenho da GPU em comparação à CPU depende do programa que você está executando.

Se você tiver um programa de ponto flutuante paralelo a dados com muito pouca divergência de controle (todas as faixas vetoriais estão fazendo a mesma coisa ao mesmo tempo) e seu programa estiver em fluxo contínuo (não pode se beneficiar do armazenamento em cache), a GPU será sobre 3x mais eficiente por unidade de área ou por Watt. Mas se você tiver uma quantidade significativa de controle divergente, um trabalho que não seja paralelo a dados ou se beneficiar de grandes estruturas de dados com muitas leituras, a CPU provavelmente terá um desempenho melhor.

Lógica Errante
fonte