Pergunta

Computação de uso geral em unidades de processamento de gráficos (GPGPU) é um conceito muito atraente para aproveitar o poder da GPU para qualquer tipo de computação.

Eu adoraria usar o GPGPU para processamento de imagens, partículas e operações geométricas rápidas.

No momento, parece que os dois candidatos neste espaço são Cuda e OpenCl. Eu gostaria de saber:

  • O OpenCL ainda é utilizável do Java no Windows/Mac?
  • Quais são as maneiras das bibliotecas de interagir para OpenCl/Cuda?
  • O uso do JNA é diretamente uma opção?
  • Estou esquecendo algo?

Qualquer experiência/exemplos/exemplos do mundo real é apreciada.

Foi útil?

Solução

ATÉ ONDE SEI, Javacl / OpenCl4Java é a única ligação do OpenCL disponível em todas as plataformas no momento (incluindo macOS x, freeBSD, Linux, Windows, Solaris, todos na Intel 32, 64 bits e variantes de PPC, graças ao uso de seu uso de JNA).

Possui demos que realmente funcionam bem com o Java Web inicia pelo menos no Mac e Windows (para evitar falhas aleatórias no Linux, consulte esta página do wiki, tal como este Demo de partículas.

Ele também vem com alguns utilitários (geração de números aleatórios GPGPU, redução paralela básica, álgebra linear) e um Scala dsl.

Finalmente, são as ligações mais antigas disponíveis (desde junho de 2009) e tem uma comunidade de usuários ativa.

(Isenção de isenção: eu sou JavaclAutor :-))

Outras dicas

Você também pode considerar APARAPI. Ele permite que você escreva seu código no Java e tentará converter o Bytecode para OpenCl no tempo de execução.

Transparência completa. Eu sou o desenvolvedor do Aparapi.

Bem, o CUDA é uma modificação de C, para escrever o kernel CUDA que você deve codificar em C e, em seguida, compilar para o formulário executável com o compilador CUDA da NVIDIA. O código nativo produzido poderia então ser vinculado ao Java usando o JNI. Então, tecnicamente, você não pode escrever o código do kernel da Java. Há jcuda http://www.jcuda.de/jcuda/jcuda.html, ele fornece as APIs da CUDA para a menção geral de memória/dispositivo e alguns métodos Java que são implementados em CUDA e JNI embrulhados (FFT, alguns métodos de álgebra linear .. etc. etc.).

Por outro lado, o OpenCL é apenas uma API. Os kernels de OpenCl são cordas simples passadas para a API. Portanto, usando o OpenCl do Java, você deve especificar seus próprios kernels. A ligação do OpenCL para Java pode ser encontrada aqui http://www.jocl.org/.

Eu tenho usado o JOCL e estou muito feliz com isso.

A principal desvantagem do OpenCl sobre CUDA (pelo menos para mim) é a falta de bibliotecas disponíveis (impulso, CUDPP, etc.). No entanto, o CUDA pode ser facilmente portado para o OpenCL e, ao analisar como essas bibliotecas funcionam (algoritmos, estratégias etc.) é realmente muito bom à medida que você aprende muito com ele.

Eu sei que é tarde, mas dê uma olhada nisso: https://github.com/pcpratts/rootbeer1

Eu não trabalhei com isso, mas parece muito mais fácil de usar do que outras soluções.

Na página do projeto:

Rootbeer é mais avançado que as ligações de idiomas CUDA ou OPENCL Java. Com as ligações, o desenvolvedor deve serializar gráficos complexos de objetos em matrizes de tipos primitivos. Com o Rootbeer, isso é feito automaticamente. Também com ligações de idiomas, o desenvolvedor deve escrever o kernel da GPU em CUDA ou OpenCL. Com o rootbeer, é feita uma análise estática do bytecode java (usando fuligem) e o código CUDA é gerado automaticamente.

Eu também posso recomendar Jocl de Jogamp.org, funciona no Linux, Mac e Windows. Conrad, por exemplo, usa fortemente OpenCl em combinação com JOV.

Se você deseja fazer algumas operações de processamento de imagem ou geométricas, pode querer uma biblioteca de álgebra linear com suporte à GPU (com CUDA, por exemplo). Eu sugeriria que você Nd4j Witch é a algrebra linear com suporte de GPU da CUDA no qual o Deeplearning4J é construído. Com isso, você não precisa lidar diretamente com o CUDA e precisa de baixo código de nível em c. Além disso, se você quiser fazer mais coisas com a imagem com o DL4J, terá acesso a operações específicas de processamento de imagens, como a convolução.

Você pode dar uma olhada na API Cuda4j

http://sett.com/gpgpu/the-cuda4j-api

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