2010-05-27 4 views
9

Est-il possible de définir mes propres fonctions dans le code OpenCL, afin que les noyaux puissent les appeler? Oui, où puis-je voir un exemple simple?Fonctions en ligne définies par l'utilisateur OpenCL

+0

question Old ... tout ce que vous avez besoin d'une réponse? –

+2

On dirait que le titre et la question sont différents? Le titre demande spécifiquement 'inline', alors que la question demande simplement si nous pouvons définir nos fonctions ... –

Répondre

5

Sur la base des exemples de code here vous pouvez simplement écrire des fonctions telles que:

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

(Par exemple, regarde le fichier .cl dans les exemples de tri DXTC ou Bitonic..)

Je ne savoir si c'est une extension nvidia seulement mais la documentation OpenCL parle de "fonctions auxiliaires" ainsi que de noyaux.

+0

Etrange, la spécification OpenCL ne dit rien sur __device – dmessf

+0

Oui. Je me demandais si je me trompais. Ou si Apple l'a ajouté comme une extension. Donc, si vous me modifiez, modifiez-moi à nouveau jusqu'à ce qu'il soit testé :-) – sigfpe

+0

Ou ... si je suis confus avec le code CUDA. J'ai joué avec les deux. – sigfpe

3

OpenCL prend en charge les fonctions auxiliaires. Voir page 19 de this link pour des exemples.

+4

Lien! = Fonctionnel :( –

+1

@Garet: Merci – Yktula

+0

Oooh, .. il ya beaucoup d'informations utiles sur une bonne carte de base là-bas .. nice –

13

Fonction utilisée pour créer le programme est ...

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

Vous pouvez placer des fonctions à l'intérieur des paramètres chaînes comme celui-ci,

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]); 
} 

Maintenant, vous avez une fonction définie par l'utilisateur « AddVector » et une fonction du noyau "VectorAdd"

2

Je ai parcouru un peu autour, et je revenais juste à cette question :-PEn fin de compte, ce que j'ai fait était d'utiliser des macros, puisque inlining dépendrait de toute façon de l'implémentation, et les macros ne semblent pas avoir d'inconvénient majeur dans le contexte des programmes c99 OpenCL? par exemple:

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

au lieu 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; 
} 
Questions connexes