Futuro do OpenCL?

22

O paradigma de programação OpenCL promete ser um padrão aberto livre de royalties para computação heterogênea. Devemos investir nosso tempo no desenvolvimento de software baseado em OpenCL? Prós e contras?

Allan P. Engsig-Karup
fonte
No CUDA, você pode codificar mais. Você tem classes C ++, em que o OpenCL suporta apenas estruturas. Então, CUDA é um pouco mais maduro. Se você não precisa do material avançado, eu mudaria para o OpenCL.
usar o seguinte código

Respostas:

19

A pergunta é muito ampla e vaga para ser realmente respondida. No entanto, vejo um ponto notável contra o OpenCL, do ponto de vista da computação científica, que raramente é enfatizado. Até o momento, não houve nenhum esforço para produzir bibliotecas de infraestrutura de código aberto para o OpenCL, enquanto o CUDA possui várias opções excelentes:

Acredito que isso realmente prejudicará o OpenCL, pois um dos principais facilitadores da adoção é a alta qualidade das bibliotecas abertas.

Matt Knepley
fonte
3
Ponto interessante; especialmente porque a licença para o compilador CUDA em si não é muito aberta (o que eu suponho que esses caras construam em cima), enquanto (até onde eu entendo a licença) nada atrapalharia um programador ambicioso quem quer desenvolver uma solução OpenCL de código-fonte totalmente aberto ...
Erik P.
2
@JackPoulson Também estou intrigado com a falta de bibliotecas OpenCL, mas o motivo da CUDA é claro. Eles realmente colocaram recursos por trás da contratação de ótimas pessoas e do desenvolvimento de bibliotecas úteis.
Matt Knepley
6
As bibliotecas nascem e morrem rapidamente; os padrões vivem muito e são dolorosos.
MBq
6
Há o ViennaCL , que não deve ser esquecido.
Aron Ahmadia
4
As bibliotecas científicas do @mbq têm uma vida útil longa e uma grande influência no pensamento e na prática. Testemunha CHARMM, BLAS, RELAP, GEANT etc.
Matt Knepley
16

OpenCL vs o que?

Se a pergunta é OpenCL vs CUDA, vejo muitas perguntas sobre essa questão, e isso parece uma loucura para mim. Não importa. Honesto. Os núcleos - para onde todo o pensamento difícil precisa ir - são praticamente idênticos entre os dois idiomas; você pode escrever macros para o seu editor favorito para fazer 99% do trabalho para alternar entre o OpenCL e o CUDA. Tem que ser assim; eles são controle de baixo nível de tipos de hardware bastante semelhantes. Depois de descobrir como escrever seus kernels importantes no {OpenCL, CUDA}, é trivial transportá-los para o {CUDA, OpenCL}.

O código do host padrão que você precisa escrever também é semelhante, mas o CUDA mantém casos simples simples. É por isso que ensinamos a CUDA em nosso centro; você pode pular direto para a criação de código do kernel, enquanto teríamos que passar de uma a duas horas de nosso curso de um dia apenas explicando as coisas de lançamento do kernel para o OpenCL.

Mas mesmo aí a diferença não é tão importante; depois que você começa a fazer coisas mais complicadas (kernels assíncronos em vários gpus), elas são igualmente complicadas e, novamente, você pode praticamente fazer uma tradução linha por linha de um para o outro.

Se for OpenCL vs abordagens baseadas em diretivas - OpenACC ou HMPP ou algo assim - essas provavelmente serão (esperamos?) Boas maneiras de programar esses tipos de arquiteturas no futuro, onde você poderá obter 90% do desempenho para 10% do trabalho. Mas qual opção "vencerá" ainda está por ser vista e eu não recomendaria gastar muito tempo trabalhando com elas ainda.

Então, eu diria que, entre CUDA ou OpenCL, escolha um idioma que seja conveniente para você e use-o, e não se preocupe muito com isso. A parte valiosa - descobrir como decompor seu problema em código SIMD massivamente paralelo para núcleos pequenos com muito pouca memória - será muito fácil de transportar entre os modelos de programação.

Se você estiver usando o hardware da NVIDIA - e provavelmente está -, então eu normalmente recomendo a CUDA - o argumento de Matt Knepley sobre as bibliotecas é imediato. Se você não é, então OpenCL.


fonte
1
Você diz que a única diferença são os kernels e que os kernels são os mesmos, mas depois diz que usa CUDA porque o padrão é mais simples. Por acaso, concordo que o clichê no CUDA é mais simples, mas existem bibliotecas que podem ajudar com o OpenCL, por exemplo, code.google.com/p/clutil e github.com/hughperkins/OpenCLHelper (isenção de responsabilidade: o OpenCLHelper é meu)
Hugh Perkins
7

Se você deve investir seu tempo no desenvolvimento de software baseado em OpenCL é uma pergunta que você pode responder. Se parece que ele tem o potencial de resolver os problemas que você está enfrentando no momento e nenhuma outra solução aberta o faz, seu melhor curso de ação provavelmente é correr o risco de implementar um pequeno projeto com ele.

Se isso der certo, você poderá testá-lo com projetos maiores e assim por diante até obter confiança suficiente para padronizá-lo ou descartá-lo em favor de outra solução (que pode ser sua própria solução proprietária, outra solução aberta ou até outra solução proprietária).

O maravilhoso do movimento de código aberto é que, como você tem o código - fonte, tem tudo o que precisa para bifurcar o projeto, se necessário. Mesmo que a própria comunidade não ofereça as instalações necessárias, não há nada que o impeça de implementar essas instalações. Além disso, se você quisesse essas instalações, há uma possibilidade distinta de que outros usuários possam desejá-las, então agradeceria se você contribuísse com essas mudanças de volta ao projeto principal.

Não apenas isso, mas se você melhorar da sua perspectiva, pode melhorar para outras pessoas, incentivá-las a enviar seus próprios aprimoramentos e, finalmente, melhorar o software para todos.

Finalmente, sim, esta é uma resposta bastante genérica para uma pergunta genérica. Para responder de maneira mais completa, precisamos saber quais são suas preocupações com o OpenCL. É maturidade? Suporte da comunidade? Fácil de usar? Tempo necessário para aprender? Hora de desenvolver? Mudando seus procedimentos? Quando você pergunta sobre os prós e contras, com quais outros produtos você está tentando comparar o OpenCL ? Que pesquisa você já fez? Quais recursos você precisa para suportar seu ambiente de computação heterogêneo?

Mark Booth
fonte
6

Um grande PRO é o número de fornecedores por trás do OpenCL. Tenho alguma experiência anedótica sobre isso, depois de conhecer um grupo de pesquisa que gastou muito tempo e esforço para desenvolver um código CUDA bastante complicado para um sistema alimentado pela NVIDIA. Um ano depois que o código foi desenvolvido, o grupo de pesquisa obteve acesso a um sistema AMD maior e mais rápido, mas eles não puderam usá-lo, pois não tinham os recursos (humanos) para portar o código.

Mesmo que o conjunto principal de recursos do CUDA e do OpenCL seja quase idêntico (como o @JonathanDursi bem apontou), se o desenvolvedor original não for o responsável pela tarefa de converter o código, todo o projeto de portabilidade pode demorar bastante.

No entanto, existem algumas incompatibilidades oficiais entre CUDA e OpenCL. O CUDA notavelmente suporta modelos c ++, enquanto o OpenCL ainda não os suporta oficialmente. No entanto, há um esforço feito pela AMD para desenvolver uma extensão para o OpenCL com suporte para modelos e outros recursos C ++, mais informações nesta postagem da AMD dev central . Espero que uma futura revisão do OpenCL possa adicionar este trabalho.

Neste momento (início de 2012), as incríveis bibliotecas às quais o @MattKnepley se vincula são de código fechado ou usam modelos, para que não fiquem disponíveis para hardware que não seja a NVIDIA, pelo menos nesse meio tempo.

Para alguém que está aprendendo gpu-computing, eu diria que o OpenCL C pode ser bastante difícil, pois há muitos detalhes que desviam o aluno das idéias básicas, enquanto o CUDA é mais simples e direto. No entanto, existem ferramentas que tornam o OpenCL muito mais simples de aprender e usar, como PyOpenCL (o empacotador python para opencl), que traz todo o açúcar python para o OpenCL (observe que também existe um PyCUDA). Por exemplo, a demonstração do PyOpenCL para adicionar duas matrizes tem pouco menos de 25 linhas e inclui: criação das matrizes no host e no dispositivo, as transferências de dados, a criação do contexto e fila, o kernel, como construir e executar o kernel , obtendo os resultados da GPU e comparando-os com o numpy (veja os links abaixo).

PyOpenCL - http://mathema.tician.de/software/pyopencl

PyCUDA - http://mathema.tician.de/software/pycuda

Para programadores gpu experientes, aqui eu concordo com @ JonathanDursi, CUDA e OpenCL são fundamentalmente os mesmos e realmente não há grandes diferenças. Além disso, o trabalho árduo de desenvolver um algoritmo eficiente para GPUs é muito independente da linguagem, e o suporte ao OpenCL dos fornecedores e a documentação agora são muito mais maduros do que há 2 anos. O único ponto que ainda faz diferença é que a NVIDIA está realmente fazendo um ótimo trabalho com o apoio à comunidade CUDA.

O OpenCL possui o benefício adicional de poder ser executado em CPUs e já é suportado pela Intel e AMD. Portanto, você não precisa alterar sua estrutura algorítmica se quiser aproveitar os núcleos de CPU disponíveis. Não é minha opinião que o OpenCL seja a melhor solução para um único aplicativo orientado a CPU / multicore, pois um kernel otimizado para CPU pode parecer significativamente diferente de um kernel otimizado para GPU. No entanto, na minha experiência, o desenvolvimento do CODE se beneficia de poder executar na CPU.

fcruz
fonte
5

Eu acho que o OpenCL atualmente está sofrendo com a falta de um "campeão". Por exemplo, se você visitar o site da NVIDIA agora (16/12/2011), terá várias fotos no estilo "Efeito Ken Burns" na página inicial, focando no lado científico / industrial da computação de GPU e ~ 1 / A quarta das opções de navegação aponta para coisas que provavelmente acabarão na CUDA. Os fabricantes que vendem servidores e estações de trabalho "GPU computing" estão vendendo soluções NVIDIA.

As ofertas concorrentes da ATI são misturadas ao site geral da AMD, mais difíceis de encontrar e não são tão destacadas em soluções de terceiros. Essas soluções e a capacidade de fazer programação baseada em OpenCL certamente existem, mas deixou uma percepção - pelo menos em minha mente, mas na mente de outras pessoas com quem conversei - de que os grandes patrocinadores corporativos da plataforma OpenCL já " saia do campo ". As pessoas que usam o OS X, por exemplo, provavelmente estão muito ocupadas especulando se uma estação de trabalho da Apple existirá ou não em um ano para ter fé nelas pressionando a computação da GPU OpenCL.

Fomite
fonte
4

O fator mais importante é que o CUDA permanecerá suportado apenas pelo hardware da NVIDIA.

Portanto, se você deseja criar software robusto e portátil, o OpenCL é a única opção. No máximo, você pode construir em torno de algumas bibliotecas atualmente alimentadas por CUDA e espero que elas sejam estendidas sobre o OpenCL no futuro, puxando seu código com ele.

mbq
fonte
Nem um pouco claro. Certamente existem padrões proprietários que se tornaram abertos depois que muitas pessoas os adotaram.
Matt Knepley
@MattKnepley Por favor, nem a NVIDA está tentando forçar a CUDA como padrão; sem mencionar que, mesmo que acabassem, eles acabarão com algo basicamente idêntico ao OpenCL.
MBq
1
De fato, provavelmente será o contrário. O OpenCL acabará adotando todas as coisas legais da CUDA (a maioria delas já existe, de onde você acha que ela veio?) E se livrando das coisas mais censuráveis ​​existentes no momento.
Matt Knepley