Pergunta

Estou interessado em saber se quaisquer algoritmos comuns (classificação, pesquisa, gráficos, etc.) foram portados para OpenCL (ou qualquer linguagem GPU), e como o desempenho em comparação com o mesmo algoritmo executado pelo CPU. Estou especialmente interessado nos resultados (números).

Obrigado!

Foi útil?

Solução

algumas amostras bastante deste tipo de coisa no site da NVidia. Tenha em mente que algumas coisas, como classificação necessidade algoritmos especiais para paralelismo eficiente e pode não ser tão eficiente quanto um algoritmo não-threaded em um único núcleo.

Outras dicas

GPUs são altamente especializados hardware projetado para fazer um pequeno conjunto de tarefas muito bem e altamente paralelizado. Esta é basicamente a aritmética (precisão matemática particularmente único ponto flutuante embora GPUs mais recentes fazem muito bem com precisão dupla). Como tal eles só estão adequados para algoritmos específicos. Eu não tenho certeza se encaixa classificação que categoria (no caso geral, pelo menos).

Exemplos mais comuns são os preços dos instrumentos financeiros, grandes quantidades de matemática de matriz e até mesmo derrotando criptografia (por força bruta). Dito isto, eu fiz encontrar rápido paralelo GPU-ordenação usando um algoritmo híbrido.

Outro exemplo comumente citado é correndo SETI @ HOME em uma GPU Nvidia mas está comparando maçãs com laranjas. As unidades de trabalho para GPUs são diferentes (e altamente limitada) em comparação com o que CPUs ordinariamente fazer.

Tenha um olhar em impulso :

Thrust é uma biblioteca CUDA da paralela algoritmos com uma interface assemelhando-se o Modelo Padrão C ++ Biblioteca (STL). Thrust fornece uma interface de alto nível flexível para GPU programação que aumenta muito produtividade do desenvolvedor.

Seja cauteloso, muito cuidado com todos os números de desempenho cotados para GPGPU. Muitas pessoas gostam de postar números realmente impressionantes que não levam em consideração o tempo de transferência necessário para obter os dados de entrada a partir da CPU para a GPU e os dados de saída traseira, ambos passando por cima um gargalo PCIe.

redimensionamento de imagem deve ser comum em muitos sites que aceitam uploads de imagens.

O redimensionamento 2600ish x 2000ish 2MB jpeg uma imagem (para 512x512) teve 23,5 milissegundos em C # com opções de qualidade mais baixos absolutos e amostragem vizinho mais próximo. função utilizada foi graphics.DrawImage() um baseado. uso da CPU também foi% 21.5.

Obter extração "array de bytes rgba" no lado C # e enviá-lo para GPU e redimensionamento na GPU e obter resultados de volta em uma imagem levou 6,3 milissegundos e uso da CPU foi% 12.7. Isso foi feito com um% 55 mais barato gpu com apenas 320 núcleos.

Apenas 3.73X multiplicador de aceleração.

O fator limitante aqui foi, enviando os dados rgb 20MB extraído (jpeg é de apenas 2 MB!) Para GPU. Essa parte demorado estava quase% 90 do tempo total, incluindo a extracção C # lado matriz de bytes! Então, eu gues haveria cerca de 30X aceleração pelo menos se parte extração poderia ser feito em GPU também.

30X não é ruim.

Em seguida, você poderia gasoduto a camada de extração com a camada de redimensionamento para esconder a latência de cópia de memória para obter ainda mais velocidade! Esta poderia ser 40X-50X.

Em seguida, aumentar a qualidade da amostragem (como bicubic vez de vizinho mais próximo), você tem ainda mais vantagem no lado GPU. A adição de um filtro de Gauss 5x5 adicionado apenas 0,77 milliseonds. CPU iria ficar algum tempo mais elevado em cima disso, especialmente se os parâmetros de Gauss necessários são diferentes do que a implementação C # .Net.


Mesmo se você não está satisfeito com a relação de aceleração, descarregando a GPU e ter um "núcleo livre" na CPU ainda é vantajoso para empurrar mais trabalho a esse servidor.

Agora, adicione o fato dos níveis de consumo de energia GPU (30W vs 125W neste exemplo), é muito mais vantajosa.


CPU dificilmente poderia ganhar em

 C[i]=A[i]+B[i]

benchmarks quando ambos os lados executado em códigos otimizados e você ainda pode descarregar metade das matrizes para GPU e terminar mais rápido usando CPU + GPU ao mesmo tempo.


GPU não é construída para trabalhos não-uniformes. GPUs têm pipelines profundos assim de pé depois de uma tenda por causa da ramificação, leva muito tempo. Também tipo SIMD forças hardware de TI para fazer mesma coisa em todos os workitems sobre ele. Quando um item de trabalho faz uma coisa diferente do que o grupo, ele perde o controle e adiciona bolhas no pipeline de SIMD todo ou simplesmente outros esperam para o ponto de sincronização. Então brancing afeta ambas as áreas de dutos profundas e largas e torná-lo ainda mais lento do CPU em condições perfeitamente caóticas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top