2011-10-01 16 views
14

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.

+2

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). –

Respuesta

6

No creo que OpenCL tenga un concepto de múltiples archivos fuente en un programa: un programa es una unidad de compilación. Sin embargo, puede utilizar #include y obtener encabezados u otros archivos .cl en tiempo de compilación.

Puede tener varios kernels en un programa OpenCL, por lo que, después de una compilación, puede invocar cualquiera de los núcleos compilados.

Se puede suponer que cualquier código no utilizado, funciones o cualquier elemento estáticamente conocido como inalcanzable, se elimina durante la compilación, a un costo menor para la compilación.

+0

gracias. esto es lo que estoy haciendo. pero, frustrantemente, pyopencl no tiene en cuenta el contenido #include al almacenar en caché los kernels. así que cambiar los archivos de "biblioteca" no afecta los núcleos compilados sin eliminar manualmente la caché. de todos modos, esperaré para ver si alguien tiene una mejor idea antes de marcarlo como mejor (¡y solo!). aclamaciones. –

+0

Si eso es cierto, entonces la sintaxis de clCreateProgramWithSource es bastante incómoda, ¿no? Requiere explícitamente múltiples cadenas y la longitud de cada una de esas cadenas. No estoy seguro de que realmente funcione (llegué aquí intentando ponerlo en funcionamiento) pero suena raro que no pueda funcionar dada la sintaxis ... – user1111929

5

En OpenCL 1.2 enlaza diferentes archivos de objeto.

+0

gracias; intentaré esto cuando regrese al trabajo abierto superior. –

Cuestiones relacionadas