2010-05-27 15 views
9

¿Es posible definir mis propias funciones en código OpenCL, para que los núcleos puedan llamarlas? Sí, ¿dónde puedo ver un ejemplo simple?Funciones en línea definidas por el usuario OpenCL

+0

pregunta Viejo ... cualquier otra cosa que necesita de una respuesta? –

+2

Parece que el título y la pregunta son diferentes? Título solicita específicamente 'en línea', mientras que la pregunta solo pregunta si podemos definir nuestras funciones ... –

Respuesta

5

Sobre la base de los ejemplos de código here que acaba de escribir funciones como:

inline int add(int a,int b) 
{ 
    return a+b; 
} 

(Ej miro el archivo .cl en el dXTC o ejemplos ordenar bitónica..)

no lo hago saber si esa es una extensión de nvidia solamente, pero la documentación de OpenCL habla de "funciones auxiliares" y kernels.

+0

Extraño, la especificación OpenCL no dice nada sobre el dispositivo – dmessf

+0

Sí. Me pregunto si he olvidado mi memoria. O si Apple lo agregó como una extensión. Entonces, si me modificaron, modifíquenme hasta que se pruebe :-) – sigfpe

+0

O ... si confundo con el código CUDA. He estado jugando con ambos. – sigfpe

3

OpenCL admite funciones auxiliares. Consulte la página 19 de this link para ver ejemplos.

+4

Link! = Funcional :( –

+1

@Garet: gracias – Yktula

+0

Oooh, ... hay mucha información útil sobre una buena tarjeta de línea de base allí. Bien. –

13

función que se utiliza para crear el programa es ...

cl_program clCreateProgramWithSource (  
    cl_context context, 
    cl_uint count, 
    const char **strings, 
    const size_t *lengths, 
    cl_int *errcode_ret) 

Puede colocar funciones dentro de las cadenas parámetro de este tipo,

float AddVector(float a, float b) 
{ 
    return a + b; 
} 

kernel void VectorAdd(
    global read_only float* a, 
    global read_only float* b, 
    global write_only float* c) 
{ 
    int index = get_global_id(0); 
    //c[index] = a[index] + b[index]; 
    c[index] = AddVector(a[index], b[index]); 
} 

Ahora usted tiene uno definido por el usuario función "AddVector" y una función del núcleo "VectorAdd"

2

Busqué en Google un poco, y seguí volviendo a esta pregunta :-P

Al final, lo que hice fue usar macros, dado que la línea de entrada dependería de la implementación de todos modos, y las macros no parecen tener una gran desventaja en el contexto de los programas de c99 OpenCL. por ejemplo:

#define getFilterBoardOffset(filter, inputPlane) \ 
    ((filter * gInputPlanes + inputPlane) * gFilterSizeSquared) 
#define getResultBoardOffset(n, filter) \ 
    ((n * gNumFilters + filter) * gOutputBoardSizeSquared) 

en lugar de:

inline float getFilterBoardOffset(float filter, int inputPlane) { 
    return (filter * gInputPlanes + inputPlane) * gFilterSizeSquared; 
} 
inline float getResultBoardOffset(float n, int filter) { 
    return (n * gNumFilters + filter) * gOutputBoardSizeSquared; 
} 
Cuestiones relacionadas