Pergunta

Ao escrever aplicativos CUDA, você pode trabalho ao nível do controlador ou no nível do tempo de execução, como ilustrado na imagem (As bibliotecas são CUFFT e CUBLAS para matemática avançada):

modelo de camadas CUDA
(fonte: tomshw.it )

Eu assumo o compromisso entre os dois são o aumento de desempenho para a API de baixo evel, mas à custa do aumento da complexidade do código. Quais são as diferenças concretas e há algumas coisas importantes que você não pode fazer com a API de alto nível?

Eu estou usando CUDA.net para interoperabilidade com C # e é construído como uma cópia da API do motorista. Isso incentiva a escrever um monte de código bastante complexo em C #, enquanto o equivalente C ++ seria mais simples usando a API de tempo de execução. Existe alguma coisa para vencer por fazê-lo desta maneira? O único benefício que eu posso ver é que é mais fácil de integrar o tratamento de erros inteligente com o resto do código C #.

Foi útil?

Solução

O tempo de execução CUDA torna possível compilar e vincular o seu CUDA kernels em executáveis. Isso significa que você não tem que distribuir Cubin arquivos com sua aplicação, ou lidar com carregá-los através da API motorista. Como você observou, é geralmente mais fácil de usar.

Em contraste, a API motorista é mais difícil de programa, mas forneceu mais controle sobre como CUDA é usada. O programador tem de lidar diretamente com a inicialização, carregamento de módulos, etc.

informações do dispositivo Aparentemente mais detalhado pode ser consultado através da API motorista que não através da API de tempo de execução. Por exemplo, a memória livre disponível no dispositivo pode ser consultado somente através da API motorista.

De Guia do CUDA Programador:

É composto por duas APIs:

  • A API de baixo nível chamado o driver CUDA API,
  • A-nível superior API chamada de API CUDA tempo de execução que é implementado em cima do o driver CUDA API.

Essas APIs são mutuamente exclusivos: Um aplicativo deve usar um ou o outra.

O gerenciamento de código flexibiliza tempo de execução dispositivo CUDA, proporcionando implícita inicialização, gerenciamento de contexto, e gestão módulo. O código C hospedeiro geradas por nvcc é baseado no tempo de execução CUDA (ver Secção 4.2.5), de modo aplicações que apontam para este código deve usar o tempo de execução API CUDA.

Em contraste, a API do driver CUDA requer mais código, é mais difícil de programa e debug, mas oferece um melhor nível de controle e é independente de linguagem uma vez que só lida com objetos Cubin (ver Secção 4.2.5). Em particular, é mais difícil configure e inicie kernels usando o driver API CUDA, uma vez que a execução parâmetros de configuração do kernel e deve ser especificado com chamadas de função explícitas em vez da sintaxe de configuração de execução descrito na Seção 4.2.3. Além disso, o dispositivo emulação (ver Secção 4.5.2.9) não funciona com o driver API CUDA.

Não há diferença de desempenho perceptível entre a API do. Como seus kernels usar a memória e como eles são definidos na GPU (em teias e blocos) terá um efeito muito mais pronunciado.

Outras dicas

eu descobri que para a implantação de bibliotecas em aplicações multi-threaded, o controle sobre contexto CUDA fornecida pela API condutor era crítico. A maioria dos meus clientes querem integrar a aceleração GPU em aplicativos existentes, e nos dias de hoje, quase todas as aplicações são multi-threaded. Desde que eu não podia garantir que todo o código GPU seria inicializado, executado e desalocada do mesmo segmento, eu tive que usar a API do motorista.

As minhas tentativas iniciais com várias soluções alternativas na API de tempo de execução todos os levou ao fracasso, às vezes de forma espetacular - Eu descobri que podia repetidamente, reinicie instantaneamente uma máquina executando apenas o conjunto errado de chamadas CUDA de diferentes tópicos.

Uma vez que migrou tudo sobre a API motorista, tudo foi bem.

J

um par de coisas importantes a nota:

primeiros as diferenças entre as APIs só se aplicam ao código do lado do host. Os grãos são exatamente os mesmos. no host lado a complexidade do api motorista é bastante trivial, as diferenças fundamentais são:

na api driver que você tem acesso a uma funcionalidade que não está disponível na API de tempo de execução como contextos.

o emulador funciona somente com o código escrito para a API de tempo de execução.

oh e atualmente cudpp que é uma biblioteca muito útil só funciona com a API de tempo de execução.

Existem alguns problemas reais com o alinhamento argumento ea API do motorista. Confira o CUDA 2.2 beta (ou posterior) documentação para obter mais informações.

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