2010-05-27 3 views
9

Ist es möglich, meine eigenen Funktionen in OpenCL-Code zu definieren, damit die Kernel sie aufrufen können? Ja, wo kann ich ein einfaches Beispiel sehen?OpenCL benutzerdefinierte Inline-Funktionen

+0

Alte Frage ... alles, was Sie von einer Antwort brauchen? –

+2

Scheint wie der Titel und die Frage anders sind? Der Titel fragt explizit nach "inline", während die Frage nur danach fragt, ob wir unsere Funktionen definieren können ... –

Antwort

5

Basierend auf den Codebeispielen here Sie nur Funktionen wie schreiben:

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

(zB im DXTC oder bitonische sortieren Beispiele am .cl Datei suchen..)

ich nicht Wissen Sie, ob das eine Nvidia-Erweiterung ist, aber die OpenCL-Dokumentation spricht sowohl von "Hilfsfunktionen" als auch von Kernels.

+0

Seltsam, die OpenCL-Spezifikation sagt nichts über __device – dmessf

+0

Ja. Ich frage mich, ob ich mich falsch erinnere. Oder wenn Apple es als Erweiterung hinzugefügt hat. Also, wenn du mich verändert hast, mod me mich wieder runter, bis es getestet ist :-) – sigfpe

+0

Oder ... wenn ich mit CUDA-Code verwechsle. Ich habe mit beiden gespielt. – sigfpe

3

OpenCL unterstützt Hilfsfunktionen. Beispiele finden Sie auf Seite 19 von this link.

+4

Link! = Funktional :( –

+1

@Garet: Danke. – Yktula

+0

Oooh, .. es gibt viele nützliche Informationen auf einer guten Grundkarte dort. Nice. –

13

Funktion zu erstellen Programm verwendet wird, ist ...

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

Sie Funktionen innerhalb der Strings Parameter wie folgt platzieren können,

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

Jetzt haben Sie eine benutzerdefinierte Funktion "AddVector" und eine Kernelfunktion "VectorAdd"

2

Ich googelte ein wenig herum und kam immer wieder auf diese Frage zurück: -P

Am Ende habe ich Makros verwendet, da Inlining sowieso implementierungsabhängig ist und Makros im Kontext von c99 OpenCL-Programmen keinen größeren Nachteil zu haben scheinen? zB:

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

statt:

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