CUDA driver API vs. CUDA runtime
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):
(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 #.
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.