He trabajado con OpenCL en un par de proyectos, pero siempre he escrito el kernel como una función (a veces bastante grande). Ahora estoy trabajando en un proyecto más complejo y me gustaría compartir funciones en varios núcleos.Cómo estructurar kernels OpenCL grandes?
Pero los ejemplos que puedo encontrar muestran el kernel como un único archivo (muy pocos incluso llaman funciones secundarias). Parece que debería ser posible usar múltiples archivos: clCreateProgramWithSource()
acepta múltiples cadenas (y las combina, supongo), aunque la Program()
de pyopencl toma solo una fuente.
así que me gustaría saber de alguien con experiencia haciendo esto:
- ¿Existen problemas asociados con varios archivos de origen?
- ¿Es la mejor solución para pyopencl simplemente concatenar archivos?
- ¿Hay alguna manera de compilar una biblioteca de funciones (en lugar de pasar la fuente de la biblioteca con cada kernel, aunque no se utilicen todas)?
- Si es necesario pasar la fuente de la biblioteca cada vez, ¿se descartan las funciones no utilizadas (sin sobrecarga)?
- ¿Alguna otra práctica recomendada/sugerencia?
Gracias.
Puede crear un archivo de concatenación que tenga #include "part1.cl" #include "part2.cl". Esto funciona para mí (compilador de NVidia), aunque probablemente todo se compila cada vez que se ejecuta la aplicación. Creo que tener una biblioteca de funciones precompiladas es un poco de ciencia ficción, ya que el código de función se inserta en cada kernel (es por eso que no se pueden escribir funciones recursivas). –