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?
fonte
Respostas:
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.
fonte