2011-09-12 11 views
9

¿Hay alguna forma de utilizar punteros de función de estilo C en OpenCL?¿Opencl admite los punteros de función?

En otras palabras, me gustaría completar una estructura OpenCL con varios valores, así como punteros a una función OpenCL. No estoy hablando de pasar de una función de CPU a una función de GPU, estoy hablando de pasar de una función de GPU a una función de GPU.

¿Esto es posible?

--- --- EDITAR

Si no es así, hay una forma de evitar esto? En CUDA tenemos herencia de objetos, y en 4.0 incluso tenemos funciones virtuales. La única forma en que puedo encontrar para implementar un despacho en tiempo de ejecución como este es recurrir a las declaraciones if, y eso se pondrá muy rápido.

+1

Que yo sepa, la respuesta es no. Intentaré sacar una referencia – Flexo

Respuesta

11

Desde el OpenCL 1.1 specification:

Sección 6.8 (restricciones) (a):

El uso de punteros es algo limitada. Las siguientes reglas se aplican:

  • argumentos al núcleo funciones declaradas en un programa que son punteros debe declarar con la __global, __constant o calificador __local.
  • Un puntero declarada con la __constant, calificador __local o __global sólo se puede asignar a un puntero declarada con la __constant, __local o calificador __global respectivamente.
  • Punteros a las funciones no son permitido.

El trabajo habitual que utilizo para esto es con macros. Malvado, pero actualmente ineludible. Así que por lo general terminan con algo como:

#define FEATURENAME_START impl1_start 
#define FEATURENAME_END impl1_end 

que entonces o se inyecte esta en el kernel en tiempo de compilación o pasarlo como argumento para el compilador OpenCL. No es bastante tiempo de ejecución en el sentido habitual, pero puede ser el tiempo de ejecución desde la perspectiva del Anfitrión, incluso si no es el dispositivo.

3

AMD tiene planes futuros para el soporte de hardware para esto, por lo que puede haber futuras extensiones para ellos.