Pregunta

Al escribir aplicaciones CUDA, puede trabajar a nivel de controlador o en tiempo de ejecución como se ilustra en esta imagen (Las bibliotecas son CUFFT y CUBLAS para matemáticas avanzadas):

 Modelo de capa CUDA
(fuente: tomshw.it )

Supongo que el compromiso entre los dos es un mayor rendimiento para la API de bajo nivel pero a costa de una mayor complejidad del código. ¿Cuáles son las diferencias concretas y hay cosas importantes que no se pueden hacer con la API de alto nivel?

Estoy usando CUDA.net para interoperar con C # y está creado como una copia de la API del controlador. Esto anima a escribir una gran cantidad de código bastante complejo en C # mientras que el equivalente de C ++ sería más simple utilizando la API de tiempo de ejecución. ¿Hay algo que ganar haciéndolo de esta manera? El único beneficio que puedo ver es que es más fácil integrar el manejo inteligente de errores con el resto del código C #.

¿Fue útil?

Solución

El tiempo de ejecución de CUDA hace posible compilar y vincular sus núcleos de CUDA en ejecutables. Esto significa que no tiene que distribuir archivos de cubin con su aplicación, o tratar de cargarlos a través de la API del controlador. Como ha notado, generalmente es más fácil de usar.

En contraste, la API del controlador es más difícil de programar pero brindó más control sobre cómo se usa CUDA. El programador debe lidiar directamente con la inicialización, la carga del módulo, etc.

Aparentemente, se puede consultar información más detallada del dispositivo a través de la API del controlador que a través de la API de tiempo de ejecución. Por ejemplo, la memoria libre disponible en el dispositivo solo se puede consultar a través de la API del controlador.

De la Guía del Programador CUDA:

  

Se compone de dos API:

     
      
  • Una API de bajo nivel llamada la API del controlador CUDA,
  •   
  • Una API de nivel superior llamada API de tiempo de ejecución CUDA que se implementa sobre   la API del controlador CUDA.
  •   
     

Estas API se excluyen mutuamente: una aplicación debe usar una o la   otro.

     

El tiempo de ejecución de CUDA facilita la administración del código del dispositivo al proporcionar implícito   Inicialización, gestión de contexto y gestión de módulos. El código de host C   generado por nvcc se basa en el tiempo de ejecución de CUDA (consulte la Sección 4.2.5), por lo que   las aplicaciones que enlazan con este código deben usar la API de tiempo de ejecución CUDA.

     

En contraste, la API del controlador CUDA requiere más código, es más difícil de programar y   depuración, pero ofrece un mejor nivel de control y es independiente del lenguaje ya que solo   se ocupa de los objetos cubin (ver Sección 4.2.5). En particular, es más difícil   configure y ejecute los kernels utilizando la API del controlador CUDA, desde la ejecución   La configuración y los parámetros del kernel deben especificarse con llamadas a funciones explícitas.   en lugar de la sintaxis de configuración de ejecución descrita en la Sección 4.2.3. Además, dispositivo   La emulación (consulte la Sección 4.5.2.9) no funciona con la API del controlador CUDA.

No hay una diferencia de rendimiento notable entre las API. La forma en que los núcleos usan la memoria y la forma en que están distribuidos en la GPU (en deformaciones y bloques) tendrá un efecto mucho más pronunciado.

Otros consejos

Descubrí que para la implementación de bibliotecas en aplicaciones de subprocesos múltiples, el control sobre el contexto CUDA proporcionado por la API del controlador fue crítico. La mayoría de mis clientes desean integrar la aceleración de la GPU en las aplicaciones existentes, y en estos días, casi todas las aplicaciones son multiproceso. Como no podía garantizar que todo el código de GPU se inicializaría, ejecutaría y desasignaría desde el mismo hilo, tuve que usar el controlador API.

Mis intentos iniciales con varios arreglos en la API de tiempo de ejecución condujeron al fracaso, a veces de forma espectacular; descubrí que podía reiniciar una máquina repetidamente, al realizar solo el conjunto incorrecto de llamadas CUDA de diferentes subprocesos.

Desde que migramos todo a través de la API del controlador, todo ha ido bien.

J

un par de cosas importantes a tener en cuenta:

Primero, las diferencias entre las API solo se aplican al código del lado del host. Los núcleos son exactamente iguales. en el lado del host, la complejidad de la API del controlador es bastante trivial, las diferencias fundamentales son:

en la API del controlador, tiene acceso a una funcionalidad que no está disponible en los contextos tipo API en tiempo de ejecución.

el emulador solo funciona con el código escrito para la API de tiempo de ejecución.

oh y actualmente cudpp, que es una biblioteca muy útil, solo funciona con la API de tiempo de ejecución.

Hay algunos problemas reales con la alineación de argumentos y la API del controlador. Consulte la documentación beta de CUDA 2.2 (o posterior) para obtener más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top