CUDA vs OpenCL a partir do final de 2013

34

Como o CUDA e o OpenCL se comparam entre si no final de 2013 da perspectiva de um programador? Meu grupo está pensando em tentar usar a computação GPU. Estaríamos nos limitando significativamente escolhendo hardware que suporta apenas OpenCL, mas não CUDA?

Para ser um pouco mais específico, as seguintes suposições estão corretas?

  • Tudo o que é possível no CUDA também é possível no OpenCL

  • Enquanto não estivermos usando bibliotecas, uma determinada tarefa não será significativamente mais fácil (ou mais difícil) de executar em nenhuma delas

  • A principal vantagem da CUDA é a disponibilidade de bibliotecas

  • Ambos têm bom suporte para todas as três principais plataformas (Win / OSX / Linux)

Szabolcs
fonte
1
Tentarei atualizar a pergunta se ela não for específica o suficiente ... somos novos nesse domínio, e essa é uma das perguntas básicas que surgiram, principalmente por causa da escolha do hardware. Uma coisa que chamou minha atenção e me deixou cauteloso com o OpenCL é esse tópico . Se o OpenCL não é bom o suficiente para o traçado de raios (Blender), então talvez não seja bom o suficiente para o HPC também ...
Szabolcs
Não estou ativo em GPUs desde 2011, por isso vou deixar alguém mais atualizado, mas sua afirmação de que "uma determinada tarefa não é significativamente mais fácil de executar em nenhuma delas" foi algo que não achei que fosse verdade mesmo. Há um viés pessoal aqui, mas senti que a CUDA estava muito à frente do OpenCL em termos de facilidade de desenvolvimento. Eu teria que me atualizar, mas se você me perguntasse há 2 anos, eu teria dito que não tocaria no OpenCL com uma vara de três metros.
Aurelius
Estou ciente dessa pergunta: O futuro do OpenCL , mas não é exatamente a mesma pergunta e tem 2 anos. Presumo que as coisas possam ter mudanças em dois anos.
Szabolcs
Uma das questões práticas para nós é se um Mac Pro 2013 com placas AMD FirePro é bom para se familiarizar e fazer uso da computação de GPU (sem suporte CUDA).
Szabolcs
Pode valer a pena manter o C ++ AMP em seu radar também. Uma implementação do llvm está em andamento. hsafoundation.com/bringing-camp-beyond-windows-via-clang-llvm . A Microsoft já criou bibliotecas C ++ AMP para FFT, BLAS e LAPACK.
Roger Dahl

Respostas:

37

Tentarei resumir minhas experiências obtidas no desenvolvimento do ViennaCL, onde temos back-end CUDA e OpenCL com a maioria das traduções 1: 1 de muitos kernels de computação. Da sua pergunta, também assumirei que estamos falando principalmente de GPUs aqui.

Portabilidade de desempenho.Antes de tudo, não existem kernels portáteis de desempenho, no sentido em que você escreve um kernel uma vez e ele roda com eficiência em todos os hardwares. Não no OpenCL, onde é mais aparente devido à maior variedade de hardware suportado, mas também não no CUDA. No CUDA, é menos aparente por causa da menor variedade de hardware suportada, mas mesmo aqui temos que distinguir pelo menos três arquiteturas de hardware (pré-Fermi, Fermi, Kepler). Essas flutuações de desempenho podem facilmente resultar em uma variação de desempenho de 20%, dependendo de como você organiza os threads e quais tamanhos de grupo de trabalho você escolhe, mesmo que o kernel seja tão simples quanto uma cópia de buffer. Provavelmente, também vale a pena mencionar que nas GPUs pré-Fermi e Fermi foi possível escrever kernels de multiplicação de matriz e matriz rápida diretamente no CUDA, enquanto que para as GPUs Kepler mais recentes, parece que é preciso ir para a linguagem de pseudo-assembly PTX para se aproximar do desempenho do CUBLAS. Assim, mesmo uma linguagem controlada por fornecedor, como CUDA, parece ter problemas para acompanhar o ritmo dos desenvolvimentos de hardware. Além disso, todo o código CUDA é compilado estaticamente quando você executa o nvcc, o que requer um ato de equilíbrio por meio do sinalizador -arch, enquanto os kernels do OpenCL são compilados em tempo de execução a partir do compilador just-in-time, para que você possa, em princípio, adaptar os kernels até as especificidades específicas de um dispositivo de computação específico. O último, no entanto, é bastante envolvido e geralmente se torna uma opção muito atraente à medida que o código amadurece e a experiência se acumula. O preço a pagar é o tempo O (1) necessário para a compilação just-in-time, o que pode ser um problema em determinadas situações. OpenCL 2.

Depuração e criação de perfil. As ferramentas de depuração e criação de perfil CUDA são as melhores disponíveis para GPGPU. As ferramentas da AMD também não são ruins, mas não incluem gemas como cuda-gdb ou cuda-memcheck. Além disso, ainda hoje a NVIDIA fornece os drivers e SDKs mais robustos para GPGPU; os congelamentos do sistema devido a kernels de buggy são realmente a exceção, não a regra, tanto no OpenCL quanto no CUDA. Por razões que provavelmente não preciso explicar aqui, a NVIDIA não oferece mais depuração e criação de perfil para OpenCL com CUDA 5.0 e superior.

Acessibilidade e conveniência. É muito mais fácil colocar os primeiros códigos CUDA em funcionamento, principalmente porque o código CUDA se integra bastante bem ao código do host. (Discutirei o preço a pagar posteriormente.) Existem muitos tutoriais disponíveis na Web, além de guias de otimização e algumas bibliotecas. Com o OpenCL, você precisa passar por bastante código de inicialização e escrever seus kernels em strings, para encontrar apenas erros de compilação durante a execução ao alimentar as fontes para o jit-compiler. Portanto, leva mais tempo para passar por um ciclo de código / compilação / depuração com o OpenCL, portanto sua produtividade é geralmente menor durante esse estágio inicial de desenvolvimento.

Aspectos da biblioteca de software. Enquanto os itens anteriores eram a favor da CUDA, a integração com outro software é uma grande vantagem para o OpenCL. Você pode usar o OpenCL apenas vinculando-se à biblioteca compartilhada do OpenCL e é isso, enquanto no CUDA é necessário ter toda a cadeia de ferramentas CUDA disponível. Pior ainda, você precisa usar os compiladores de host corretos para que o nvcc funcione. Se você já tentou usar, por exemplo, CUDA 4.2 com GCC 4.6 ou mais recente, será difícil fazer as coisas funcionarem. Geralmente, se houver algum compilador em uso mais recente que o CUDA SDK, é provável que ocorram problemas. A integração em sistemas de construção como o CMake é outra fonte de dor de cabeça (você também pode encontrar muitas evidências, por exemplo, no PETScmailinglists). Isso pode não ser um problema em sua própria máquina, onde você tem controle total, mas assim que distribuir seu código, você se deparará com situações em que os usuários estão um pouco restritos em sua pilha de software. Em outras palavras, com o CUDA, você não está mais livre para escolher seu compilador de host favorito, mas a NVIDIA determina quais compiladores você pode usar.

Outros aspectos. O CUDA está um pouco mais próximo do hardware (por exemplo, deformações), mas minha experiência com álgebra linear é que você raramente obtém um benefício significativo. Existem mais bibliotecas de software disponíveis para o CUDA, mas cada vez mais bibliotecas usam vários back-ends de computação. ViennaCL , VexCL ou Paralution suportam backends OpenCL e CUDA enquanto isso, uma tendência semelhante pode ser vista com bibliotecas em outras áreas.

GPGPU não é uma bala de prata. Demonstrou-se que a GPGPU fornece bom desempenho para operações estruturadas e tarefas limitadas à computação. No entanto, para algoritmos com uma parcela não negligenciável do processamento seqüencial, a GPGPU não pode magicamente superar a Lei de Amdahl . Nessas situações, é melhor usar uma boa implementação de CPU do melhor algoritmo disponível, em vez de tentar lançar um algoritmo paralelo, mas menos adequado, para o seu problema. Além disso, o PCI-Express é um sério gargalo, portanto, é necessário verificar com antecedência se as economias das GPUs podem compensar a sobrecarga da movimentação de dados para frente e para trás.

Minha recomendação. Considere CUDA e OpenCL em vez de CUDA ouOpenCL. Não há necessidade de se restringir desnecessariamente a uma plataforma, mas tirar o melhor proveito dos dois mundos. O que funciona bem para mim é configurar uma implementação inicial no CUDA, depurar, criar um perfil e depois portá-lo para o OpenCL por simples substituições de string (você pode até parametrizar suas rotinas de geração de string do kernel do OpenCL para ter alguma flexibilidade no ajuste do hardware de destino.) Esse esforço de portabilidade geralmente consome menos de 10% do seu tempo, mas oferece a capacidade de executar também em outro hardware. Você pode se surpreender com o desempenho do hardware que não é da NVIDIA em determinadas situações. Acima de tudo, considere a reutilização da funcionalidade nas bibliotecas na maior extensão possível. Enquanto uma rápida e A reimplementação suja de algumas funcionalidades geralmente funciona aceitável para execução de thread único em uma CPU, geralmente oferece desempenho ruim em hardware massivamente paralelo. Idealmente, você pode até descarregar tudo para as bibliotecas e nunca precisar se preocupar se elas usam CUDA, OpenCL ou ambas internamente. Pessoalmente, nunca ousaria escrever código bloqueado pelo fornecedor para algo em que quero confiar daqui a vários anos, mas esse aspecto ideológico deve entrar em uma discussão separada.

Karl Rupp
fonte
O que você acha do desempenho atual e da usabilidade do padrão 1D, 2D, 3D FFT nas duas plataformas?
assimétrica
Em relação à compilação JIT, a CUDA também oferece essa possibilidade , mas com algumas restrições.
BenC
@hwlau: FFT é uma funcionalidade padrão para bibliotecas de fornecedores, tão independente da CUDA vs. OpenCL.
Karl Rupp
@ BenC: As restrições são realmente muito severas, é apenas uma especialização de kernels CUDA pré-compilados para o hardware subjacente.
precisa
1
Você tem algum comentário sobre esse problema em potencial ? Não está claro para mim se esse é um problema no hardware da AMD ou no próprio OpenCL (ou seja, se o problema não existe no OpenCL na NVIDIA). Talvez isso não seja um problema com a maioria dos aplicativos de computação científica, porque eles tendem a ser menores e menos complexos que um rastreador de raios avançado? Entre, obrigado pela ótima resposta!
Szabolcs