c++ thrust gpu-programming boost-compute vexcl

c++ - Diferencias entre VexCL, Thrust y Boost.Compute



gpu-programming boost-compute (1)

Soy el desarrollador de VexCL , pero realmente me gusta lo que Kyle Lutz , el autor de Boost.Compute , tuvo que decir sobre el mismo tema en la lista de correo de Boost . En resumen, desde el punto de vista del usuario Thrust , Boost.Compute, AMD''s Bolt y probablemente Microsoft C ++ AMP implementan una API similar a STL, mientras que VexCL es una biblioteca basada en una plantilla de expresión que está más cerca de la naturaleza de Eigen . Creo que la principal diferencia entre las bibliotecas de tipo STL es su portabilidad:

  1. Thrust solo es compatible con GPU NVIDIA, pero también puede funcionar en CPU a través de sus backends OpenMP y TBB.
  2. Bolt usa extensiones AMD para OpenCL que solo están disponibles en GPU AMD. También proporciona backends Microsoft C ++ AMP e Intel TBB.
  3. El único compilador que admite Microsoft C ++ AMP es Microsoft Visual C ++ (aunque se está realizando el trabajo sobre Traer C ++ AMP Beyond Windows ).
  4. Boost.Compute parece ser la solución más portátil de aquellos, ya que se basa en OpenCL estándar.

Una vez más, todas esas bibliotecas están tratando de implementar una interfaz tipo STL, por lo que tienen una aplicabilidad muy amplia. VexCL fue desarrollado teniendo en cuenta la informática científica. Si Boost.Compute se desarrolló un poco antes, probablemente podría basar VexCL en él :). Otra biblioteca para la informática científica que vale la pena mirar es ViennaCL , una biblioteca de álgebra lineal de fuente abierta gratuita para cálculos en arquitecturas de múltiples núcleos (GPU, MIC) y CPU multinúcleo. Eche un vistazo a [1] para la comparación de VexCL, ViennaCL, CMTL4 y Thrust para ese campo.

En cuanto a la incapacidad citada de los desarrolladores de Thrust para agregar un back-end OpenCL: Thrust, VexCL y Boost.Compute (no estoy familiarizado con las partes internas de otras bibliotecas) todos usan técnicas de metaprogramación para hacer lo que hacen. Pero dado que CUDA admite plantillas C ++, el trabajo de los desarrolladores Thrust es probablemente un poco más fácil: tienen que escribir metaprogramas que generan programas CUDA con la ayuda del compilador C ++. Los autores de VexCL y Boost.Compute escriben metaprogramas que generan programas que generan código fuente OpenCL. Eche un vistazo a las slides donde intenté explicar cómo se implementa VexCL. Así que estoy de acuerdo con que el diseño actual de Thrust les prohíbe agregar un back-end OpenCL.

[1] Denis Demidov, Karsten Ahnert, Karl Rupp, Peter Gottschling, Programación CUDA y OpenCL: Un estudio de caso utilizando bibliotecas modernas de C ++ , SIAM J. Sci. Comput., 35 (5), C453-C472. (una versión arXiv también está disponible).

Actualización: @gnzlbg comentó que no hay soporte para funtores C ++ y lambdas en bibliotecas basadas en OpenCL. Y, de hecho, OpenCL se basa en C99 y se compila a partir de fuentes almacenadas en cadenas en tiempo de ejecución, por lo que no hay una manera fácil de interactuar completamente con las clases de C ++. Pero para ser justos, las librerías basadas en OpenCL soportan funciones basadas en usuarios e incluso lambdas hasta cierto punto.

Una vez dicho esto, las bibliotecas basadas en CUDA (y pueden ser C ++ AMP) tienen una ventaja obvia del compilador en tiempo real de compilación (¿se puede decir eso?), Por lo que la integración con el código de usuario puede ser mucho más estricta.

Con una comprensión superficial de estas bibliotecas, parecen ser muy similares. Sé que VexCL y Boost.Compute usan OpenCl como back-end (aunque el lanzamiento de v1.0 VexCL también admite CUDA como back-end) y Thrust usa CUDA. Aparte de los diferentes backends, ¿cuál es la diferencia entre estos.

Específicamente, ¿qué problema de espacio abordan y por qué querría usar uno sobre el otro?

Además, en las preguntas frecuentes de Thrust se afirma que

La principal barrera para el soporte de OpenCL es la falta de un compilador OpenCL y tiempo de ejecución con soporte para plantillas de C ++

Si este es el caso, ¿cómo es posible que VexCL y Boost.Compute existan?