2016-07-13 12 views
0

Meine Kernel-Argumente sind die folgenden:Wie übergeben Sie private Array als Argumente an OpenCL-Kernel?

__kernel void 
codesGPU(struct stateGPU* s, 
     short* lencnt, 
     short* lensym, 
     short* distcnt, 
     short* distsym, 
     __global const struct in_unit* input, 
     __global struct out_unit* output, 
     struct contextGPU* ctx, 
     __global const short* lens, 
     __global const short* lext, 
     __global const short* dists, 
     __global const short* dext, 
     int* outsize 
     ) 

input und output „global“ sind, weil sie Ein-/Ausgangsdaten für alle Arbeits-Elemente enthalten, die durch get_global_id(0) getrennt sind. lens, next, dists, dext sind 4 konstante globale Arrays, die von allen Arbeitselementen gemeinsam genutzt werden. Daher deklariere ich sie als global constant. Die Restargumente sind jedoch für jedes Arbeitselement privat. Dazu gehören Skalare wie outsize und Arrays wie lencnt. Ich verwende hier Zeiger, weil ich diese Argumente nach der GPU-Berechnung immer noch an die CPU weitergeben muss.

Meine Frage ist:

  • Ist es möglich, kerne privaten Arrays zu übergeben?

  • Was ist der beste Weg, um diese Variablen (unterschiedlich für jedes Work-Element, und wollen immer noch den Wert zurückgeben) Kernel übergeben?

  • Wie soll ich den Kernel-Code und C-Code schreiben?

Der Kernel ruft auch zwei Hilfsfunktionen in .cl Code:

int fun1(struct stateGPU *s, short *countarr, short *symarr, __global const struct in_unit *input, int *idx, struct contextGPU* ctx, int did) 

int fun2(struct stateGPU *s, int need, __global const struct in_unit* input, int *idx, struct contextGPU* ctx, int gid) 

Im main.c schaffe ich Puffer Objekte für globale Variablen und geben sie als

cl_mem cl_lens; 
cl_lens = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(lens), lens, &err); 
err |= clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *)&cl_lens); 

Kann jemand auf der Grundlage meines Problems Vorschläge machen, wie man andere Argumente an den Kernel weitergibt? Vielen Dank!

+0

Denkst du nicht, dass diese Fragen nur ein bisschen allgemein sind? Für wen ist das Array "privat"? Wenn das Modul, an das die Arrays übergeben werden, keinen Zugriff auf diese Speicherbereiche hat, werden Sie Probleme bekommen. Seien Sie sich stets der Einstellungen des Segmentregisters bewusst. –

Antwort

2

Ist es möglich, private Arrays an Kernel zu übergeben?

Nein, nur globale/konstante Daten können an den Kernel übergeben werden. Die einzige Möglichkeit, ein Register einzurichten, besteht darin, es von irgendwo her zu übertragen, auch bekannt als globaler Speicher.

Was ist der beste Weg, um diese Variablen (unterschiedlich für jedes Arbeitselement, und wollen immer noch den Wert zurückgeben) Kernel übergeben?

Einfacher globaler Speicher, da konstanter Speicher besser geeignet ist, wenn für alle Work-Items die gleichen Daten benötigt werden.

Wie soll ich den Kernel-Code und C-Code schreiben?

Nun, das hängt davon ab, was Sie eigentlich wollen! :)

+0

Ich habe es versucht Um Daten für jeden Kernel in einen globalen Speicher zu übertragen, greift jeder Kernel auf seinen eigenen Teil zu und funktioniert.Ich fragte, weil jeder Kernel nur seine eigenen separaten Daten benötigt (nicht die gleichen Daten), also rate ich, ob ich Daten separat an jeden Kernel weitergeben kann ... – pinteson

+0

Für jeden Kernel können Sie den globalen Vektor in kleinere Vektoren aufteilen. Es ist jedoch nicht möglich, die private Erinnerung sofort weiterzugeben. – DarkZeros

Verwandte Themen